内核缓冲与吞吐上限
大响应或高吞吐场景下,内核 socket 缓冲区上限可能成为约束:单个大 value 或批量响应受 rmem/wmem 上限限制,超出部分只能分批发送,表现为吞吐上不去而 CPU 并不高。调整方式是按实测证据修改 net.core.rmem_max、net.core.wmem_max 与 tcp_rmem、tcp_wmem,先用观测确认它真的是瓶颈,再看调整前后的变化。
基本信息
| 相关参数 | net.core.rmem_max、net.core.wmem_max、net.ipv4.tcp_rmem、net.ipv4.tcp_wmem |
|---|---|
| 查看方式 | sysctl <参数名>,或 sysctl -a 配合过滤 |
| 典型信号 | 吞吐受限、重传与丢包、应用层写阻塞 |
| 调整原则 | 以压测与观测证据为依据,不整套照搬经验值 |
| 留档要求 | 变更前后的参数值与指标一起记录 |
典型使用场景
- 大 value 读取:单键体积大时接收窗口直接影响单连接吞吐
- 批量响应:MGET 等大批量返回的数据量受缓冲影响
- 跨机房传输:链路 RTT 大时窗口不足会限制吞吐上限
- 压测调优:按压测结果逐项验证,而非无差别调大
- 问题定位:先确认瓶颈在内核网络栈还是服务端处理
查看与实际使用
查看与实际使用
sysctl net.core.rmem_max # 单 socket 接收缓冲上限
sysctl net.core.wmem_max # 单 socket 发送缓冲上限
sysctl net.ipv4.tcp_rmem # TCP 接收缓冲的 min/default/max 三档
sysctl net.ipv4.tcp_wmem # TCP 发送缓冲的 min/default/max 三档
ss -tinm | head -20 # 看实际连接的窗口与缓冲占用
sysctl -w net.core.rmem_max=16777216 # 临时生效便于验证,通过后再持久化参数作用对照
| 参数 | 作用范围 | 调整线索 |
|---|---|---|
| net.core.rmem_max | 所有协议的单 socket 接收上限 | 本地读取大响应受限时看它 |
| net.core.wmem_max | 所有协议的单 socket 发送上限 | 本机作为服务端发送大响应时看它 |
| net.ipv4.tcp_rmem | TCP 接收缓冲三档取值 | 结合带宽时延积评估窗口是否足够 |
| net.ipv4.tcp_wmem | TCP 发送缓冲三档取值 | 跨区链路 RTT 大时更值得关注 |
网络参数与业务形态强相关:大 value 与大 RTT 是两个不同的约束维度,通用经验值只能当起点,最终取值要由自己的压测数据决定。
不加验证整套调大,会让内存占用与运维复杂度一起上升,还很难判断收益来自哪一项;每次只改一个参数并记录变更前后的指标。