📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

配置项作用 #

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-Alivetrue

系统默认值和限制 #

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. 合理配置: 过大无益,过小有害,需要根据实际情况调整。