配置项作用 #
http.tcp.receive_buffer_size 配置项用于控制HTTP 服务器 TCP 连接的接收缓冲区大小。
TCP 接收缓冲区是操作系统内核为每个 TCP 连接分配的内存区域,用于临时存储从网络接收的数据。缓冲区大小直接影响网络吞吐量和数据处理能力。
配置项属性 #
- 配置路径:
http.tcp.receive_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:
receive_buffer_size: -1 # 使用系统默认
建议: 保持默认值 -1。系统默认值通常适用于大多数场景。
高吞吐量场景 #
http:
tcp:
receive_buffer_size: 128kb # 128 KB
建议: 设置为 64KB-256KB。当处理大量数据传输时使用。
大文件传输 #
http:
tcp:
receive_buffer_size: 1mb # 1 MB
建议: 设置为 512KB-2MB。当需要传输大文件时使用。
跨地域部署 #
http:
tcp:
receive_buffer_size: 512kb # 512 KB
建议: 根据带宽延迟积计算。高延迟网络需要更大的缓冲区。
代码示例 #
easysearch.yml 基础配置 #
http:
tcp:
receive_buffer_size: -1 # 使用系统默认
高性能配置 #
http:
tcp:
receive_buffer_size: 256kb
send_buffer_size: 256kb
大数据传输配置 #
http:
tcp:
receive_buffer_size: 2mb
send_buffer_size: 2mb
内存受限配置 #
http:
tcp:
receive_buffer_size: 32kb # 减少内存使用
相关配置 #
| 配置项 | 作用 | 默认值 |
|---|---|---|
http.tcp.receive_buffer_size | 接收缓冲区大小 | -1(系统默认) |
http.tcp.send_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/rmem_default 查看
最大值:
- /proc/sys/net/core/rmem_max
- 默认通常为 4 MB - 8 MB
- 可通过 sysctl 调整
查看命令:
cat /proc/sys/net/core/rmem_default
cat /proc/sys/net/core/rmem_max
调整命令:
sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.rmem_default=262144
macOS 系统默认值
默认值:
- 通常为 128 KB - 256 KB
最大值:
- 可通过 sysctl 调整
查看命令:
sysctl net.inet.tcp.recvspace
调整命令:
sysctl -w net.inet.tcp.recvspace=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.rmem_max >= 配置值
步骤 4: 考虑并发连接数
总内存 = 缓冲区大小 × 并发数
确保服务器有足够内存
步骤 5: 测试验证
在实际环境中测试性能
监控内存使用和吞吐量
根据实际情况调整
常见问题排查 #
问题 1: 吞吐量不足 #
现象: 网络吞吐量远低于带宽
原因: 接收缓冲区过小
解决: 增加缓冲区大小
receive_buffer_size: 32kb → 256kb
问题 2: 内存压力 #
现象: 服务器内存使用过高
原因: 接收缓冲区配置过大
解决: 减小缓冲区大小
receive_buffer_size: 2mb → 256kb
问题 3: 配置不生效 #
现象: 配置了缓冲区大小但没有效果
原因 1: 系统限制更小
解决: 调整系统 rmem_max
原因 2: 配置值无效
解决: 确保使用正确的单位(kb, mb)
注意事项 #
系统限制: 实际缓冲区大小受操作系统的最大值限制。
内存占用: 缓冲区大小 × 并发连接数 = 总内存占用。
单位支持: 支持 b, kb, mb, gb, tb, pb, eb 等单位。
必须是 2 的幂: 某些系统建议缓冲区大小为 2 的幂。
与发送缓冲区配合: 通常接收和发送缓冲区设置为相同值。
动态更新: 此配置不支持动态更新,修改后需要重启节点。
所有平台支持: 此配置在所有平台上都有效。
监控建议: 监控网络吞吐量、内存使用和连接数。
测试验证: 在生产环境部署前进行性能测试。
合理配置: 过大无益,过小有害,需要根据实际情况调整。





