I
Member
上周一台服务器间歇丢包,ping 丢包率 2%~5%,业务偶发超时。应用层查不出问题,最后定位到网卡 ring buffer 满了。整理一份从网卡到内核的丢包排查链。
1. 先看网卡统计,别先抓包。ethtool -S eth0 看 rx_missed_errors、rx_over_errors、rx_fifo_errors 哪个在涨。rx_missed_errors 涨就是 ring buffer 满了丢包;rx_crc_errors 涨就是线缆或对端问题。抓包看到的只是结果,统计数字才是分水岭。
2. ring buffer 太小是最常见的坑。默认 rx ring 256,突发流量一来就满。用 ethtool -g 看当前值,ethtool -G eth0 rx 1024 调大,再观察 rx_missed_errors 是否停止增长。我们这台调到 1024 后丢包从 3% 降到 0.1% 以下。
3. 再看中断与 CPU 亲和性。单队列网卡中断全压在一个核上,softirq 占满也会丢包。cat /proc/interrupts 看网卡中断分布,mpstat 看 si 占比。开了 RPS/RSS 把中断打散到多核,效果立竿见。
4. 内核参数最后调。net.core.netdev_max_backlog、net.core.rmem_max、net.ipv4.tcp_rmem 这些参数要在前三步确认没问题后再动。先调参数再查硬件,等于把真正的瓶颈藏起来了。
最后这台服务器 ring buffer 1024 + RPS 打散,丢包率归零,业务超时消失。
你们定位丢包时,第一步是看网卡统计还是直接 tcpdump?有没有遇到过调大 ring buffer 也压不住的情况?
1. 先看网卡统计,别先抓包。ethtool -S eth0 看 rx_missed_errors、rx_over_errors、rx_fifo_errors 哪个在涨。rx_missed_errors 涨就是 ring buffer 满了丢包;rx_crc_errors 涨就是线缆或对端问题。抓包看到的只是结果,统计数字才是分水岭。
2. ring buffer 太小是最常见的坑。默认 rx ring 256,突发流量一来就满。用 ethtool -g 看当前值,ethtool -G eth0 rx 1024 调大,再观察 rx_missed_errors 是否停止增长。我们这台调到 1024 后丢包从 3% 降到 0.1% 以下。
3. 再看中断与 CPU 亲和性。单队列网卡中断全压在一个核上,softirq 占满也会丢包。cat /proc/interrupts 看网卡中断分布,mpstat 看 si 占比。开了 RPS/RSS 把中断打散到多核,效果立竿见。
4. 内核参数最后调。net.core.netdev_max_backlog、net.core.rmem_max、net.ipv4.tcp_rmem 这些参数要在前三步确认没问题后再动。先调参数再查硬件,等于把真正的瓶颈藏起来了。
最后这台服务器 ring buffer 1024 + RPS 打散,丢包率归零,业务超时消失。
你们定位丢包时,第一步是看网卡统计还是直接 tcpdump?有没有遇到过调大 ring buffer 也压不住的情况?