收包丢包定位
/proc/net/softnet_stat 记录网卡到协议栈之间的丢包与压力,每个 CPU 一行,数值以十六进制呈现。第 1 列是累计处理的包数,第 2 列是因 backlog 队列溢出丢弃的包数,第 3 列是 time_squeeze 次数(软中断一轮处理超时、被迫让出 CPU 的次数)。第 2 列增长说明 net.core.netdev_max_backlog 相对当前速率偏小,第 3 列增长说明 netdev_budget 系列的预算不足,两列对应不同参数。
基本信息
| 读取 | cat /proc/net/softnet_stat |
|---|---|
| 行对应 | 每行对应一个 CPU |
| 第 2 列 | backlog 溢出丢弃的包 |
| 第 3 列 | time_squeeze 次数 |
| 相关参数 | netdev_max_backlog 与 netdev_budget |
典型使用场景
- 高包速率下出现应用层看不见的丢包
- 判断该调大 backlog 还是预算
- 定位软中断热点集中在哪个核
- 与网卡级、UDP 层统计交叉印证丢包位置
- 收包优化前后的对比验证
读取与对照
读取与对照
cat /proc/net/softnet_stat # 十六进制,每行一个 CPU
cat /proc/net/softnet_stat | head -4
sysctl net.core.netdev_max_backlog net.core.netdev_budget
mpstat -P ALL 1 3 # 看 %soft 的核间分布
cat /proc/net/snmp | grep -A1 Ip # 协议栈层统计对照
ip -s link show dev ens5 | head -20 # 网卡层丢包统计逐列读法
| 列 | 含义 | 对应动作 |
|---|---|---|
| 第 1 列 | 累计处理的包数 | 作为处理能力基线 |
| 第 2 列 | backlog 溢出丢弃的包 | 评估 netdev_max_backlog |
| 第 3 列 | time_squeeze 次数 | 评估 netdev_budget 与 netdev_budget_usecs |
| 行号 | CPU 序号 | 定位热点核,配合中断亲和调整 |
这些数值是十六进制,直接按十进制读会得出完全错误的量级,需要先转换再判断。
逐 CPU 的分布比总量更有价值:总量看不出问题集中在哪个核,而热点核往往就是优化的入口。
拿到读数后的下一步
- 把逐核增量与 /proc/interrupts 的中断分布对照,确认热点核是否与中断集中位置一致
- 若第 2 列增长,评估 netdev_max_backlog;若第 3 列增长,评估 netdev_budget 系列
- 若两列都不增长却仍有丢包,转到网卡统计与应用套接字统计继续排查
- 调整后用相同采样方式复核,确认对应列的增长速率确实下降
采样要把同一 CPU 行的前后两次读数对比:不同核之间的绝对值没有可比性,必要时用 mpstat 的逐核数据交叉确认行号对应的核。