尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

为什么你调了 Linux 网络 sysctl 还是卡?一张数据通路全景实操地图

为什么你调了 Linux 网络 sysctl 还是卡?一张数据通路全景实操地图 为什么你调了 Linux 网络 sysctl 还是卡一张数据通路全景实操地图【免费下载链接】linux-network-performance-parametersLearn where some of the network sysctl variables fit into the Linux/Kernel network flow. Translations: 项目地址: https://gitcode.com/gh_mirrors/li/linux-network-performance-parameters凌晨三点告警群炸了CPU 才 30%磁盘也闲着P99 延迟却翻了倍。登机器一看ethtool -S eth0rx_missed_errors整晚都在悄悄涨——包在网卡门口就被丢了应用只是在干等。这正是开源项目 linux-network-performance-parameters 要解决的问题把大家最爱引用的 sysctl 变量钉在 Linux 内核真实的报文通路上让每次调参都知道自己在改哪个环节。我们先看项目里那张 TCP 入站路径图把每个参数的坐标找出来。 网卡门口丢包ethtool rx 环形缓冲与中断合并症状是突发流量时吞吐掉线ethtool -S eth0里rx_missed_errors或rx_dropped持续增长但网卡链路本身是好的。原因通常只有两处rx ring 太浅接不住突发或者中断合并窗口太小CPU 被硬中断淹没内核来不及把报文取走。网卡把报文 DMA 进 rx ring攒够rx-usecs超时或足够帧数才敲一次硬中断之后由 NAPI 轮询把 ring 里的报文批量取走——所以这两类参数一类管门多深一类管敲门多勤。# 查环形缓冲深度与中断合并参数先看现状再动手 ethtool -g eth0 ethtool -c eth0看到基线之后再改# 改rx ring 4096 吸收突发rx-usecs 64 降低硬中断频率代价是少量延迟 ethtool -G eth0 rx 4096 ethtool -C eth0 rx-usecs 64ring 本身就是排队延迟的来源越大越好是陷阱。延迟敏感业务从 1024~2048 起步往往更合适。效果预期rx_missed_errors停止增长10Gbps 线速负载下的丢包率从 ~1% 量级压到 0.1% 以下。 backlog 与 qdiscnetdev_max_backlog 丢包发生在哪一层网卡不丢包但cat /proc/net/softnet_stat第二列per-CPU dropped在涨说明包卡在内核的入站 backlog 队列里netdev_max_backlog限定队列深度netdev_budget和netdev_budget_usecs限定 NAPI 每轮轮询能处理多少报文、跑多久。队列太浅或者轮询预算太小包在还没走到协议栈时就被丢掉。softnet_stat 第三列是预算耗尽计数它增长说明内核一直在加班没干完活。# 查softnet_stat 第二列是 backlog 丢包数第三列是预算耗尽次数 cat /proc/net/softnet_stat第二列非零时先加深队列再谈预算# 改backlog 抬高吸收内核处理滞后budget 3000 让 NAPI 单轮多干活 sysctl -w net.core.netdev_max_backlog16384 sysctl -w net.core.netdev_budget3000netdev_max_backlog 是按 CPU 算的多队列网卡总容量要乘 CPU 数别看到小丢包就飙到 100000。效果预期峰值时段dropped归零因重传造成的 P99 尾延迟从几百 ms 量级回到几十 ms。 应用读得慢tcp_rmem 与 tcp_wmem 缓冲区调优高带宽高 RTT 链路上吞吐远低于线速iperf3单连接卡在 2~3Gbps典型原因是 TCP 缓冲的默认 max 值装不下带宽时延积BDP。10Gbps × 20ms RTT 需要约 25MB 的窗口而默认tcp_rmem/tcp_wmem的 max 通常只有几 MBTCP 只能小窗口慢慢爬。动缓冲区之前我们先把 BDP 算出来cat /proc/net/sockstat的 TRH 列是内存压力下 socket 内存占用它随负载上涨说明内存已经被挤压。# 查收发缓冲 min/default/max 当前值与 socket 内存占用 sysctl net.ipv4.tcp_rmem net.ipv4.tcp_wmem cat /proc/net/sockstat算好 BDP 后抬高 default 和 maxmin 保持小min 是内存吃紧时的保底值抬高它反而扩大压力面# 改max 提到 64M 覆盖 BDPmin 保持 4096 防止内存压力放大 sysctl -w net.ipv4.tcp_rmem4096 131072 67108864 sysctl -w net.ipv4.tcp_wmem4096 262144 67108864default 值改完对存量连接不生效不重启业务进程会以为调优无效。效果预期10G × 20ms RTT 的跨域链路单连接吞吐从 ~2Gbps 量级提到 9Gbps 以上大文件传输的卡顿时间肉眼可见缩短。✅ 验证与回归iperf3 加 softnet_stat 确认调参生效判断调优有没有用只认同一负载跑前后的对比不认感觉变快了。验证分两步计数器干净吞吐达标。# 验证同负载跑 60 秒看吞吐与两类丢包计数器 iperf3 -c server-ip -t 60 -P 4 cat /proc/net/softnet_stat ethtool -S eth0 | grep -Ei drop|miss|over | grep -v : 0如果验证不通过基准吞吐低于调优前或丢包计数器重新增长先回滚影响面最大的 TCP 缓冲这一步# 回滚TCP 缓冲恢复内核默认值验证掉基准时先执行这一步 sysctl -w net.ipv4.tcp_rmem4096 87380 6291456 sysctl -w net.ipv4.tcp_wmem4096 65536 4194304ring 和中断合并参数仍不稳定的话再用ethtool -G/ethtool -C逐个还原每次回滚后观察 10 分钟。确认通过的参数统一写进/etc/sysctl.d/99-net.conf用sysctl --system加载避免重启失效。 一页纸清单网络 sysctl 参数推荐值参数 / 命令推荐值什么时候改验证信号ethtool -G eth0 rx1024~4096rx_missed_errors增长missed 停涨ethtool -C eth0 rx-usecs32~128top 里 %soft 高、硬中断过频软中断 CPU 下降且 P99 不变net.core.netdev_max_backlog16384按 CPU 计softnet_stat 第二列增长dropped 归零net.core.netdev_budget3000softnet_stat 第三列增长squeezed 归零net.ipv4.tcp_rmem/tcp_wmem4096 131072 67108864单连接吞吐远低于 BDPiperf3 接近线速持久化/etc/sysctl.d/99-net.conf全部已验证参数-w验证通过后重启后参数仍在把上表 6 项落进 sysctl 配置和 ethtool 脚本跑一轮 60 秒 iperf3 基准基准变好再动下一批参数——上一个没验证过就不要碰下一个。【免费下载链接】linux-network-performance-parametersLearn where some of the network sysctl variables fit into the Linux/Kernel network flow. Translations: 项目地址: https://gitcode.com/gh_mirrors/li/linux-network-performance-parameters创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表