--- title: "TCP 无延迟配置" date: 2026-02-11 lastmod: 2026-02-11 description: "控制 TCP 无延迟模式的配置项说明" tags: ["网络配置", "性能优化", "TCP参数"] summary: "配置项作用 # network.tcp.no_delay 配置项控制是否启用 TCP 的 TCP_NODELAY 选项。启用后,将禁用 Nagle 算法,允许小数据包立即发送,而不是等待累积成更大的数据包。这可以降低延迟,但可能增加网络开销。 配置项类型 # 该配置项为静态配置,需要在启动时设置,修改后需要重启节点才能生效。 默认值 # true(启用无延迟模式) 是否必需 # 可选配置项(有默认值) 取值范围 # true - 启用 TCP_NODELAY(禁用 Nagle 算法) false - 禁用 TCP_NODELAY(启用 Nagle 算法) 配置格式 # # 默认配置(启用无延迟) network.tcp.no_delay: true # 禁用无延迟(启用 Nagle 算法) network.tcp.no_delay: false 相关配置项 # 配置项 默认值 说明 network.tcp.no_delay true TCP 无延迟模式 network." --- ## 配置项作用 `network.tcp.no_delay` 配置项控制是否启用 TCP 的 `TCP_NODELAY` 选项。启用后,将禁用 Nagle 算法,允许小数据包立即发送,而不是等待累积成更大的数据包。这可以降低延迟,但可能增加网络开销。 ## 配置项类型 该配置项为**静态配置**,需要在启动时设置,修改后需要重启节点才能生效。 ## 默认值 ``` true(启用无延迟模式) ``` ## 是否必需 **可选配置项**(有默认值) ## 取值范围 ``` true - 启用 TCP_NODELAY(禁用 Nagle 算法) false - 禁用 TCP_NODELAY(启用 Nagle 算法) ``` ## 配置格式 ```yaml # 默认配置(启用无延迟) network.tcp.no_delay: true # 禁用无延迟(启用 Nagle 算法) network.tcp.no_delay: false ``` ## 相关配置项 | 配置项 | 默认值 | 说明 | |-------|-------|------| | `network.tcp.no_delay` | true | TCP 无延迟模式 | | `network.tcp.keep_alive` | true | TCP 保持连接 | | `network.tcp.keep_idle` | -1 | TCP 空闲时间 | | `network.tcp.keep_interval` | -1 | TCP 心跳间隔 | | `network.tcp.keep_count` | -1 | TCP 心跳次数 | ## 工作原理 TCP_NODELAY 机制: ``` ┌─────────────────────────────────────────────────────────────────┐ │ TCP_NODELAY 工作原理 │ └─────────────────────────────────────────────────────────────────┘ 启用 TCP_NODELAY (no_delay: true): ┌─────────────────────────────────────┐ │ 数据到达 │ └──────────────┬──────────────────────┘ │ ▼ 立即发送 ✓ - 低延迟 - 适合小数据包 - 可能增加网络包数量 禁用 TCP_NODELAY (no_delay: false): ┌─────────────────────────────────────┐ │ 数据到达 │ └──────────────┬──────────────────────┘ │ ▼ 等待更多数据 │ ├── 超时触发 → 发送 └── 积累足够 → 发送 - 高延迟 - 减少网络包数量 - 适合大批量传输 ``` ## Nagle 算法说明 ``` Nagle 算法原理: 目的: - 减少网络中小数据包的数量 - 提高网络利用率 - 减少网络拥塞 工作方式: 1. 收到小数据包后,不立即发送 2. 等待以下条件之一: - 积累到足够大的数据包 - 收到对方的 ACK - 超时(通常 200ms) 3. 满足条件后发送数据 适用场景: ✓ Telnet/SSH 等交互式应用 ✓ 批量数据传输 ✗ 实时性要求高的应用 ✗ 小数据包频繁发送的场景 ``` ## 使用场景 ### 1. 默认配置(推荐) ```yaml network.tcp.no_delay: true ``` **适用场景:** - 所有标准集群配置 - 需要低延迟 - 搜索为主的场景 - 实时性要求高 ### 2. 禁用无延迟 ```yaml network.tcp.no_delay: false ``` **适用场景:** - 大批量数据传输 - 索引为主的场景 - 网络带宽有限 - 延迟要求不高 ## 推荐设置建议 | 场景 | 网络条件 | 推荐值 | 说明 | |-----|---------|-------|------| | 搜索为主 | 任意 | true | 低延迟优先 | | 实时查询 | 任意 | true | 低延迟优先 | | 批量索引 | 带宽充足 | true | 保持默认 | | 批量索引 | 带宽受限 | false | 减少网络开销 | | 日志收集 | 带宽受限 | false | 批量传输 | ## 性能影响分析 ``` 启用 TCP_NODELAY (no_delay: true): 优点: ✓ 降低延迟 ✓ 提高响应速度 ✓ 适合小数据包 ✓ 改善用户体验 缺点: ✗ 增加网络包数量 ✗ 增加网络开销 ✗ 可能降低吞吐量 ✗ 增加路由器/交换机负担 禁用 TCP_NODELAY (no_delay: false): 优点: ✓ 减少网络包数量 ✓ 提高网络利用率 ✓ 提高吞吐量 ✓ 减少网络设备负担 缺点: ✗ 增加延迟 ✗ 影响实时性 ✗ 不适合交互场景 ``` ## 延迟对比 ``` 延迟对比(理论值): 启用 TCP_NODELAY: - 小数据包: ~1ms - 取决于网络延迟 - 适合实时查询 禁用 TCP_NODELAY: - 小数据包: ~1-200ms - 等待 Nagle 算法累积 - 可能累积到 200ms 超时 实际影响: - 搜索请求: 启用更好 - 批量索引: 禁用可能更好 - 心跳检测: 启用更好 ``` ## 配置示例 ```yaml # 场景 1: 搜索集群(低延迟优先) cluster.name: search-cluster network.tcp.no_delay: true # 场景 2: 日志收集集群(吞吐量优先) cluster.name: logs-cluster network.tcp.no_delay: false # 场景 3: 混合负载(推荐默认) cluster.name: mixed-cluster network.tcp.no_delay: true ``` ## 监控建议 ```bash # 查看当前配置 GET /_nodes/settings?filter_path=nodes.*.network.tcp.no_delay # 查看网络统计 GET /_nodes/stats/transport # 查看连接信息 GET /_cat/nodes?v&h=name,* # 测试延迟 # 使用搜索请求测试响应时间 GET /_search?request_cache=true { "size": 0 } ``` ## 性能测试建议 ``` 性能测试步骤: 1. 测试搜索延迟 - 启用 TCP_NODELAY - 运行搜索基准测试 - 记录 P50/P95/P99 延迟 2. 测试索引吞吐量 - 启用 TCP_NODELAY - 运行批量索引测试 - 记录吞吐量 3. 对比测试 - 禁用 TCP_NODELAY - 重复相同测试 - 对比性能差异 4. 决策 - 根据主要负载选择配置 - 搜索为主 → 保持启用 - 索引为主且带宽受限 → 考虑禁用 ``` ## 注意事项 1. **静态配置**:修改需要重启节点 2. **默认推荐**:默认启用适合大多数场景 3. **负载类型**:根据主要负载类型选择 4. **网络条件**:带宽受限时考虑禁用 5. **延迟敏感**:低延迟需求应保持启用 6. **传输层和 HTTP 层**:此配置同时影响传输层和 HTTP 层