--- title: "HTTP TCP 发送缓冲区大小配置" date: 2026-01-02 lastmod: 2026-01-02 description: "http.tcp.send_buffer_size 配置项用于控制 HTTP 连接的 TCP 发送缓冲区大小。" tags: ["HTTP", "TCP", "缓冲区", "网络性能"] summary: "配置项作用 # http.tcp.send_buffer_size 配置项用于控制HTTP 服务器 TCP 连接的发送缓冲区大小。 TCP 发送缓冲区是操作系统内核为每个 TCP 连接分配的内存区域,用于临时存储即将发送到网络的数据。缓冲区大小直接影响网络吞吐量和发送性能。 配置项属性 # 配置路径: http.tcp.send_buffer_size 数据类型: ByteSizeValue(字节值,支持单位) 默认值: -1(使用系统默认值) 最小值: -1(表示使用系统默认) 是否可选: 是 作用域: NodeScope(节点级别) 配置项详解 # 工作机制 # TCP 发送缓冲区工作流程 应用程序发送数据 │ ↓ 写入发送缓冲区 │ ├──────── 缓冲区未满 ──→ 继续写入 ✅ │ └──────── 缓冲区已满 ──→ 阻塞等待 │ ↓ 网络发送数据 │ ↓ 缓冲区清空 │ ↓ 继续写入 缓冲区大小的影响 # 缓冲区大小对比 小发送缓冲区 (32KB): 应用 ──→ [ 32KB ] ──→ 网络 ↑ │ 快速填满 │ ↓ 应用阻塞等待 │ ↓ 降低吞吐量 ❌ 大发送缓冲区 (256KB): 应用 ──→ [ 256KB ] ──→ 网络 ↑ │ 容纳更多数据 │ ↓ 减少阻塞 │ ↓ 提高吞吐量 ✅ 与网络延迟的关系 # 带宽延迟积 (BDP) 计算 BDP = 带宽 × 往返时间 (RTT) 示例 1: 千兆局域网 带宽 = 1 Gbps = 125 MB/s RTT = 1 ms BDP = 125 MB/s × 0." --- ## 配置项作用 `http.tcp.send_buffer_size` 配置项用于控制**HTTP 服务器 TCP 连接的发送缓冲区大小**。 TCP 发送缓冲区是操作系统内核为每个 TCP 连接分配的内存区域,用于临时存储即将发送到网络的数据。缓冲区大小直接影响网络吞吐量和发送性能。 ## 配置项属性 - **配置路径**: `http.tcp.send_buffer_size` - **数据类型**: `ByteSizeValue`(字节值,支持单位) - **默认值**: `-1`(使用系统默认值) - **最小值**: `-1`(表示使用系统默认) - **是否可选**: 是 - **作用域**: NodeScope(节点级别) ## 配置项详解 ## 工作机制 ``` TCP 发送缓冲区工作流程 应用程序发送数据 │ ↓ 写入发送缓冲区 │ ├──────── 缓冲区未满 ──→ 继续写入 ✅ │ └──────── 缓冲区已满 ──→ 阻塞等待 │ ↓ 网络发送数据 │ ↓ 缓冲区清空 │ ↓ 继续写入 ``` ## 缓冲区大小的影响 ``` 缓冲区大小对比 小发送缓冲区 (32KB): 应用 ──→ [ 32KB ] ──→ 网络 ↑ │ 快速填满 │ ↓ 应用阻塞等待 │ ↓ 降低吞吐量 ❌ 大发送缓冲区 (256KB): 应用 ──→ [ 256KB ] ──→ 网络 ↑ │ 容纳更多数据 │ ↓ 减少阻塞 │ ↓ 提高吞吐量 ✅ ``` ## 与网络延迟的关系 ``` 带宽延迟积 (BDP) 计算 BDP = 带宽 × 往返时间 (RTT) 示例 1: 千兆局域网 带宽 = 1 Gbps = 125 MB/s RTT = 1 ms BDP = 125 MB/s × 0.001 s = 125 KB 推荐发送缓冲区: 128-256 KB 示例 2: 跨地域网络 带宽 = 100 Mbps = 12.5 MB/s RTT = 50 ms BDP = 12.5 MB/s × 0.05 s = 625 KB 推荐发送缓冲区: 512-1024 KB 示例 3: 高延迟网络 带宽 = 10 Mbps = 1.25 MB/s RTT = 200 ms BDP = 1.25 MB/s × 0.2 s = 250 KB 推荐发送缓冲区: 256-512 KB ``` ## 配置建议 ## 生产环境(默认) ```yaml http: tcp: send_buffer_size: -1 # 使用系统默认 ``` **建议**: 保持默认值 `-1`。系统默认值通常适用于大多数场景。 ## 高吞吐量场景 ```yaml http: tcp: send_buffer_size: 128kb # 128 KB ``` **建议**: 设置为 64KB-256KB。当需要发送大量数据时使用。 ## 大文件传输 ```yaml http: tcp: send_buffer_size: 1mb # 1 MB ``` **建议**: 设置为 512KB-2MB。当需要传输大文件时使用。 ## 跨地域部署 ```yaml http: tcp: send_buffer_size: 512kb # 512 KB ``` **建议**: 根据带宽延迟积计算。高延迟网络需要更大的缓冲区。 ## 代码示例 ## easysearch.yml 基础配置 ```yaml http: tcp: send_buffer_size: -1 # 使用系统默认 ``` ## 高性能配置 ```yaml http: tcp: send_buffer_size: 256kb receive_buffer_size: 256kb ``` ## 大数据传输配置 ```yaml http: tcp: send_buffer_size: 2mb receive_buffer_size: 2mb ``` ## 内存受限配置 ```yaml http: tcp: send_buffer_size: 32kb # 减少内存使用 ``` ## 相关配置 | 配置项 | 作用 | 默认值 | |--------|------|--------| | `http.tcp.send_buffer_size` | 发送缓冲区大小 | -1(系统默认) | | `http.tcp.receive_buffer_size` | 接收缓冲区大小 | -1(系统默认) | | `http.tcp.no_delay` | 是否禁用 Nagle 算法 | true | | `http.tcp.keep_alive` | 是否启用 Keep-Alive | true | ## 系统默认值和限制 ``` Linux 系统默认值 默认值: - 通常为 128 KB - 256 KB - 可通过 /proc/sys/net/core/wmem_default 查看 最大值: - /proc/sys/net/core/wmem_max - 默认通常为 4 MB - 8 MB - 可通过 sysctl 调整 查看命令: cat /proc/sys/net/core/wmem_default cat /proc/sys/net/core/wmem_max 调整命令: sysctl -w net.core.wmem_max=16777216 sysctl -w net.core.wmem_default=262144 macOS 系统默认值 默认值: - 通常为 128 KB - 256 KB 最大值: - 可通过 sysctl 调整 查看命令: sysctl net.inet.tcp.sendspace 调整命令: sysctl -w net.inet.tcp.sendspace=262144 ``` ## 使用场景 ## 推荐使用系统默认的场景 - **标准应用**: 大多数常规 HTTP 应用 - **不确定配置值**: 不确定应该设置多少时 - **内存受限**: 服务器内存有限 ## 推荐增加缓冲区的场景 - **高吞吐量**: 需要发送大量数据 - **大文件传输**: 经常传输大文件 - **高延迟网络**: 跨地域或跨云部署 - **批量操作**: 批量索引、数据导出 ## 推荐减少缓冲区的场景 - **内存受限**: 服务器内存非常有限 - **短连接**: 连接使用时间短 - **小响应**: 主要返回小数据 ## 性能影响分析 ``` 发送性能 vs 缓冲区大小 场景: 1 Gbps 网络,10ms RTT 缓冲区大小 理论吞吐量 实际发送性能 ──────────────────────────────────── 32 KB 1 Gbps ~300 Mbps ❌ 64 KB 1 Gbps ~500 Mbps 128 KB 1 Gbps ~800 Mbps 256 KB 1 Gbps ~950 Mbps ✅ 512 KB 1 Gbps ~1 Gbps ✅ 1 MB 1 Gbps ~1 Gbps ✅ 结论: - 过小会严重限制发送性能 - 超过 BDP 后收益递减 - 256-512 KB 通常是最佳平衡点 ``` ## 内存占用分析 ``` 内存占用计算 假设配置 256 KB 发送缓冲区 单个连接: - 发送缓冲区: 256 KB - 接收缓冲区: 256 KB - 总计: 512 KB/连接 100 个并发连接: - 总内存: 512 KB × 100 = 50 MB 1000 个并发连接: - 总内存: 512 KB × 1000 = 500 MB 注意事项: - 这是内核内存,不计入 JVM 堆 - 过大的缓冲区会消耗大量内存 - 需要根据实际并发数调整 ``` ## 配置调优指南 ## 确定合适的缓冲区大小 ``` 步骤 1: 计算带宽延迟积 BDP = 带宽 × RTT 例如: 100 Mbps, 50ms RTT BDP = 12.5 MB/s × 0.05s = 625 KB 步骤 2: 选择缓冲区大小 缓冲区大小 = BDP × 1.5 到 2 625 KB × 1.5 = 937.5 KB 625 KB × 2 = 1250 KB 推荐: 1 MB 步骤 3: 检查系统限制 确保 net.core.wmem_max >= 配置值 步骤 4: 考虑并发连接数 总内存 = 缓冲区大小 × 并发数 确保服务器有足够内存 步骤 5: 测试验证 在实际环境中测试性能 监控内存使用和吞吐量 根据实际情况调整 ``` ## 与接收缓冲区的配合 ``` 发送和接收缓冲区的对称配置 推荐配置: 发送 = 接收 http: tcp: send_buffer_size: 256kb receive_buffer_size: 256kb 优点: - 配置简单 - 双向性能一致 特殊场景: 非对称配置 读取为主: http: tcp: send_buffer_size: 64kb receive_buffer_size: 512kb 写入为主: http: tcp: send_buffer_size: 512kb receive_buffer_size: 64kb ``` ## 常见问题排查 ## 问题 1: 发送性能不足 ``` 现象: 网络发送速度慢 原因: 发送缓冲区过小 解决: 增加缓冲区大小 send_buffer_size: 32kb → 256kb ``` ## 问题 2: 内存压力 ``` 现象: 服务器内存使用过高 原因: 发送缓冲区配置过大 解决: 减小缓冲区大小 send_buffer_size: 2mb → 256kb ``` ## 问题 3: 配置不生效 ``` 现象: 配置了缓冲区大小但没有效果 原因 1: 系统限制更小 解决: 调整系统 wmem_max 原因 2: 配置值无效 解决: 确保使用正确的单位(kb, mb) ``` ## 注意事项 1. **系统限制**: 实际缓冲区大小受操作系统的最大值限制。 2. **内存占用**: 缓冲区大小 × 并发连接数 = 总内存占用。 3. **单位支持**: 支持 b, kb, mb, gb, tb, pb, eb 等单位。 4. **必须是 2 的幂**: 某些系统建议缓冲区大小为 2 的幂。 5. **与接收缓冲区配合**: 通常发送和接收缓冲区设置为相同值。 6. **动态更新**: 此配置不支持动态更新,修改后需要重启节点。 7. **所有平台支持**: 此配置在所有平台上都有效。 8. **监控建议**: 监控网络吞吐量、内存使用和连接数。 9. **测试验证**: 在生产环境部署前进行性能测试。 10. **合理配置**: 过大无益,过小有害,需要根据实际情况调整。