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

配置项作用 #

network.tcp.send_buffer_size 配置项用于控制TCP 套接字的发送缓冲区大小

此配置决定了操作系统为 TCP 连接分配的发送缓冲区大小,影响网络数据的发送性能和内存使用。

配置项属性 #

  • 配置路径: network.tcp.send_buffer_size
  • 数据类型: ByteSizeValue(字节大小值)
  • 默认值: -1(不设置,使用系统默认)
  • 最小值: -1(使用系统默认)
  • 最大值: 受操作系统限制(通常 1-2MB)
  • 是否可选: 是
  • 作用域: NodeScope(节点级别)
  • 动态更新: 否(需要重启节点生效)

配置项详解 #

工作机制 #

TCP 发送缓冲区

应用程序 → 发送缓冲区 → 网络发送


小缓冲区 (32KB):
应用程序:
├── 写入数据
├── 缓冲区满 → 等待
└── 发送延迟 ↑

发送:
├── 空间小
├── 频繁填充
└── 可能更慢 ❌


大缓冲区 (256KB):
应用程序:
├── 写入数据
├── 缓冲区大 → 很少满
└── 发送延迟 ↓

发送:
├── 空间大
├── 批量发送
└── 更高效 ✅

缓冲区作用 #

发送缓冲区的作用

1. 批量发送
   应用写入:
   ├── 小数据块快速写入
   ├── 缓冲区积累
   └── 批量发送


2. 流量控制
   发送窗口:
   ├── 基于接收方处理能力
   ├── 调整发送速率
   └── 避免淹没接收方


3. 性能优化
   大小权衡:
   ├── 大缓冲: 减少系统调用
   └── 小缓冲: 更多系统调用

默认值行为 #

值为 -1 时的行为

send_buffer_size = -1:
    │
    ↓
使用系统默认值
    │
    ├── Linux: 通常 auto-tuned
    ├── 调整范围: 16KB - 4MB
    ├── Windows: 取决于版本
    └── macOS: 通常 256KB


系统自动调整:
├── 根据连接类型
├── 根据网络条件
├── 动态优化
└── 通常表现良好 ✅

配置建议 #

生产环境(默认) #

network:
  tcp:
    send_buffer_size: -1  # 默认值

建议: 保持默认值 -1。使用系统默认值。

高吞吐场景 #

network:
  tcp:
    send_buffer_size: 256kb  # 增加缓冲

建议: 设置为 128kb-512kb。高吞吐量数据发送。

内存受限环境 #

network:
  tcp:
    send_buffer_size: 32kb  # 减少缓冲

建议: 设置为 16kb-64kb。内存受限时使用。

最大性能配置 #

network:
  tcp:
    send_buffer_size: 2mb  # 最大缓冲

建议: 设置为 1mb-2mb。需要最大发送性能时使用。

代码示例 #

easysearch.yml 基础配置 #

network:
  tcp:
    send_buffer_size: -1

高性能配置 #

network:
  tcp:
    send_buffer_size: 256kb
    receive_buffer_size: 256kb

内存受限配置 #

network:
  tcp:
    send_buffer_size: 32kb
    receive_buffer_size: 32kb

完整 TCP 配置 #

network:
  tcp:
    send_buffer_size: -1
    receive_buffer_size: -1
    no_delay: true
    keep_alive: true

相关配置 #

配置项作用默认值
network.tcp.send_buffer_size发送缓冲区大小-1
network.tcp.receive_buffer_size接收缓冲区大小-1
network.tcp.no_delay禁用 Nagle 算法true

性能影响分析 #

send_buffer_size 设置优点缺点
16-32KB内存占用小可能更多系统调用
64-128KB平衡内存和性能标准设置
256KB更高发送效率占用更多内存
512KB+最大发送效率内存占用大

发送效率对比 #

不同缓冲区的发送效率

假设需要发送 1MB 数据,小包传输

32KB 缓冲:
├── 分成 32 次发送
├── 系统调用频繁
├── 效率: 较低
└── CPU 占用: 高 ❌


128KB 缓冲:
├── 分成 8 次发送
├── 系统调用适中
├── 效率: 较高
└── CPU 占用: 中等 ✅


256KB 缓冲:
├── 分成 4 次发送
├── 系统调用少
├── 效率: 高
└── CPU 占用: 低 ✅


512KB 缓冲:
├── 分成 2 次发送
├── 系统调用最少
├── 效率: 很高
└── CPU 占用: 很低 ✅

使用场景 #

推荐使用默认值的场景 #

  • 标准应用: 正常的网络应用
  • 系统调优: 系统已自动优化
  • 不确定需求: 不确定具体需求时

推荐增加缓冲区的场景 #

  • 大数据发送: 需要发送大量数据
  • 批量操作: 批量索引、查询
  • 高吞吐需求: 对发送吞吐量要求高
  • 充足内存: 节点内存充足

推荐减少缓冲区的场景 #

  • 内存受限: 节点内存紧张
  • 大量连接: 连接数量很多
  • 小数据发送: 主要是小数据包
  • 低延迟要求: 希望低延迟而非高吞吐

与接收缓冲区的配合 #

发送和接收缓冲区的配合

配置 1: 标准配置
send_buffer_size: -1
receive_buffer_size: -1
├── 系统默认
├── 自动优化
└── 推荐使用 ✅


配置 2: 对称配置
send_buffer_size: 256kb
receive_buffer_size: 256kb
├── 大小一致
├── 平衡性能
└── 适合高吞吐 ✅


配置 3: 不对称配置
send_buffer_size: 512kb
receive_buffer_size: 128kb
├── 发送更大
└── 适合数据发送场景


配置 4: 最小配置
send_buffer_size: 32kb
receive_buffer_size: 32kb
├── 最小内存占用
├── 适合内存受限
└── 牺牲一些性能 ⚠️

操作系统限制 #

OS 限制和建议

Linux:
/proc/sys/net/core/wmem_max
├── 最大发送缓冲区
├── 默认: 通常 128KB-4MB
└── 设置: echo 16777216 > /proc/sys/net/core/wmem_max


/proc/sys/net/core/wmem_default
├── 默认发送缓冲区
├── 默认: 通常 128KB
└── 设置: echo 262144 > /proc/sys/net/core/wmem_default


Windows:
注册表:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
├── TcpWindowSize
└── 根据版本自动调整


建议:
send_buffer_size ≤ OS wmem_max
    │
    ↓
否则:
├── 可能设置失败
├── 或被限制到最大值
└── 记录警告日志 ⚠️

内存使用分析 #

缓冲区内存占用

假设 1000 个连接

32KB 缓冲:
每连接: 32KB
总内存: 1000 × 32KB = 32MB ✅


128KB 缓冲:
每连接: 128KB
总内存: 1000 × 128KB = 128MB


256KB 缓冲:
每连接: 256KB
总内存: 1000 × 256KB = 256MB
├── 内存占用大 ⚠️
└── 需要评估


512KB 缓冲:
每连接: 512KB
总内存: 1000 × 512KB = 512MB
├── 内存占用很大 ❌
└── 谨慎使用

注意事项 #

  1. 默认值: 默认值为 -1,使用系统默认值。

  2. 需要重启: 修改此配置需要重启节点。

  3. 字节单位: 支持 kb、mb、gb 等单位。

  4. OS 限制: 受操作系统最大值限制。

  5. 内存占用: 缓冲区越大,内存占用越大。

  6. 连接数量: 需要考虑连接数量。

  7. 对称配置: 通常与 receive_buffer_size 配合。

  8. 测试验证: 配置变更后应验证性能。

  9. 监控建议: 监控网络吞吐和内存使用。

  10. 合理设置: 根据实际需求合理设置。

与 no_delay 的配合 #

缓冲区与 Nagle 算法

no_delay = true:
├── 禁用 Nagle 算法
├── 立即发送小包
├── 降低延迟
└── 配合适当缓冲区 ✅


no_delay = false:
├── 启用 Nagle 算法
├── 等待更多数据
├── 合并小包
└── 提高效率


推荐配置:
no_delay: true (默认)
send_buffer_size: 256kb
├── 禁用 Nagle
├── 适当缓冲区
└── 低延迟 + 高效率 ✅

性能调优建议 #

性能调优步骤

1. 监控当前性能
   ├── 网络吞吐量
   ├── 发送速率
   └── 内存使用


2. 确定瓶颈
   ├── 吞吐量低 → 考虑增加缓冲区
   ├── 内存占用高 → 考虑减小缓冲区
   └── 延迟高 → 检查 no_delay


3. 测试不同配置
   ├── 32KB → 64KB → 128KB → 256KB
   ├── 测量吞吐量
   ├── 测量延迟
   └── 测量内存


4. 选择最优值
   ├── 平衡性能和内存
   ├── 验证稳定性
   └── 部署配置