配置项作用 #
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
配置建议 #
生产环境(默认) #
http:
tcp:
send_buffer_size: -1 # 使用系统默认
建议: 保持默认值 -1。系统默认值通常适用于大多数场景。
高吞吐量场景 #
http:
tcp:
send_buffer_size: 128kb # 128 KB
建议: 设置为 64KB-256KB。当需要发送大量数据时使用。
大文件传输 #
http:
tcp:
send_buffer_size: 1mb # 1 MB
建议: 设置为 512KB-2MB。当需要传输大文件时使用。
跨地域部署 #
http:
tcp:
send_buffer_size: 512kb # 512 KB
建议: 根据带宽延迟积计算。高延迟网络需要更大的缓冲区。
代码示例 #
easysearch.yml 基础配置 #
http:
tcp:
send_buffer_size: -1 # 使用系统默认
高性能配置 #
http:
tcp:
send_buffer_size: 256kb
receive_buffer_size: 256kb
大数据传输配置 #
http:
tcp:
send_buffer_size: 2mb
receive_buffer_size: 2mb
内存受限配置 #
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)
注意事项 #
系统限制: 实际缓冲区大小受操作系统的最大值限制。
内存占用: 缓冲区大小 × 并发连接数 = 总内存占用。
单位支持: 支持 b, kb, mb, gb, tb, pb, eb 等单位。
必须是 2 的幂: 某些系统建议缓冲区大小为 2 的幂。
与接收缓冲区配合: 通常发送和接收缓冲区设置为相同值。
动态更新: 此配置不支持动态更新,修改后需要重启节点。
所有平台支持: 此配置在所有平台上都有效。
监控建议: 监控网络吞吐量、内存使用和连接数。
测试验证: 在生产环境部署前进行性能测试。
合理配置: 过大无益,过小有害,需要根据实际情况调整。





