辅助数据缓冲上限
限制单个套接字用于存放辅助数据的缓冲上限。辅助数据是随报文一起传递的控制信息,例如地址信息、附加结构与安全标签,和业务数据是两回事。普通 TCP、HTTP 服务几乎不受这个上限影响,只有控制信息明显较大的特定场景才需要关注。
基本信息
| 适用平台 | Linux 内核参数(net.core 命名空间) |
|---|---|
| 参数名 | net.core.optmem_max |
| 作用对象 | 套接字辅助数据缓冲,而非业务数据缓冲 |
| 典型场景 | 控制消息较大的隧道与组播应用 |
| 易混淆项 | 业务数据收发缓冲由另一组参数控制 |
典型使用场景
- 特定隧道或组播应用报缓冲区相关错误时的核对项。
- 排查错误信息时先确认是辅助数据缓冲还是业务缓冲不足。
- 评估带有大量控制信息的协议在容量上是否受限。
- 与服务端日志中的参数错误对照,判断是否需要调整。
- 容量规划时确认辅助数据的额外内存开销。
查看与核对
查看与核对
sysctl net.core.optmem_max # 查看辅助数据缓冲上限
sysctl net.core.rmem_max net.core.wmem_max # 业务数据缓冲上限,两者不要混淆
sysctl net.ipv4.tcp_rmem net.ipv4.tcp_wmem # 单个连接的收发缓冲范围
ss -m # 查看套接字的缓冲使用情况
ip -s link show # 结合接口统计判断是否有丢弃参数与作用对象
| 参数 | 作用对象 | 误用后果 |
|---|---|---|
| 辅助数据上限 | 控制消息缓冲 | 调它解决不了业务吞吐问题 |
| 业务收发上限 | 数据缓冲 | 过小会限制吞吐 |
| 连接级缓冲范围 | 单个连接的收发缓冲 | 与系统级上限互相约束 |
看到「缓冲区」相关报错先分类:是控制信息过大、数据缓冲不足,还是队列满了丢包,三类问题的处理方式完全不同。
把它当成业务收发缓冲上限去调是常见误解:调大后既不能提升吞吐,也不会减少应用层的发送失败,反而掩盖了真正的问题。