软/硬中断计数、softnet_stat、socket 队列、吞吐量、CPU 使用率、offload状态 一
明白,我在原来的完整文档基础上,专门补充 ss -t -a -i 如何查看 TCP buffer 的详细信息,以及 offload 的查看方法和字段说明,保持原文档结构和内容,只做必要的补充和强化说明。
完整文档(补充版)
1️⃣ IRQ 绑核(硬中断 CPU affinity)
作用:
-
网卡接收数据触发硬中断(IRQ)
-
绑核可以把 IRQ 固定到特定 CPU,避免中断抢占其他 CPU
-
NUMA-aware 绑定可以提升缓存命中率和延迟性能
检查实际运行情况:
# 查看网卡对应 IRQ
grep eth0 /proc/interrupts
# 查看每个 IRQ 的绑定 CPU
for irq in $(grep eth0 /proc/interrupts | awk -F: '{print $1}' | tr -d ' '); do
cat /proc/irq/$irq/smp_affinity_list
done
判断标准:
-
高流量时,IRQ CPU 的中断计数
/proc/interrupts应该在增长 -
绑核 CPU 与网卡所在 NUMA 节点一致
-
CPU 利用率合理,单核不会过载
2️⃣ RPS / RFS(软中断 CPU 分配 / 流量 Steering)
作用:
-
RPS(Receive Packet Steering): 将接收包在多个 CPU 上分发处理,避免单核瓶颈
-
RFS(Receive Flow Steering): 按流分配 CPU,提高缓存命中率
检查实际运行情况:
# 查看 RPS 配置
for q in /sys/class/net/eth0/queues/rx-*; do
echo "$(basename $q) rps_cpus=$(cat $q/rps_cpus) rps_flow_cnt=$(cat $q/rps_flow_cnt)"
done
# 查看软中断队列和丢包
awk '{printf "CPU%d rx_packets=%d dropped=%d\n", NR-1, strtonum("0x"$1), strtonum("0x"$2)}' /proc/net/softnet_stat
判断标准:
-
dropped = 0→ 没有丢包 -
rx_packets在 RPS CPU 间均衡增长 -
RPS CPU 与 IRQ CPU 不重叠
-
高流量时 CPU 分布合理
3️⃣ TCP/UDP Buffer(内核 socket buffer)
作用:
-
为每个 TCP/UDP socket 分配发送/接收缓冲区
-
决定吞吐量和拥塞控制能力
主要参数:
sysctl net.core.rmem_max net.core.wmem_max # 内核上限
sysctl net.ipv4.tcp_rmem net.ipv4.tcp_wmem # TCP 动态 buffer [min default max]
实际运行检查:
3.1 使用 ss -t -a -i 查看 TCP buffer
ss -t -a -i
输出示例:
ESTAB 0 0 10.0.0.1:443 10.0.0.2:52314
cubic wscale:7,7 rto:204 rtt:12.3/0.8 ato:40 mss:1460 rcvmss:1460
sndbuf: 292k rcvbuf: 436k
字段说明:
| 字段 | 含义 |
|---|---|
Recv-Q |
接收队列中等待应用读取的数据量(字节) |
Send-Q |
发送队列中等待发送或等待 ACK 的数据量(字节) |
rmem / rcvbuf |
TCP 接收 buffer 实际分配大小(bytes) |
wmem / sndbuf |
TCP 发送 buffer 实际分配大小(bytes) |
3.2 其他方法
cat /proc/net/tcp # tx_queue / rx_queue 字段(16进制)表示发送/接收队列字节数
判断标准:
-
Recv-Q/Send-Q长期接近 tcp_rmem.max / tcp_wmem.max → buffer 太小 -
高吞吐量下吞吐率达不到链路极限 → buffer 可能不足
-
Buffer 使用小,但吞吐量已满 → buffer 足够
4️⃣ Offload(网卡硬件加速)
作用:
-
减少 CPU 处理负载,提高网络性能
-
常见 Offload:
-
TSO/GSO: 发送大包分段
-
GRO: 接收包合并
-
LRO: 接收大包(多核环境通常关闭)
-
SG: 零拷贝
-
实际运行检查:
4.1 查看 Offload 开关状态
ethtool -k eth0
关键字段:
| 字段 | 含义 |
|---|---|
| tso | TCP Segmentation Offload(发送端分段) |
| gso | Generic Segmentation Offload(通用分段) |
| gro | Generic Receive Offload(接收合并包) |
| lro | Large Receive Offload(大包接收,单核环境使用) |
| sg | Scatter-Gather(零拷贝) |
4.2 查看实际网卡 RX/TX 统计
ethtool -S eth0 | grep -E 'rx|tx'
判断标准:
-
高流量下 CPU 使用率下降 → offload 生效
-
RX/TX 包计数正常增长
-
TSO/GSO/GRO 开启,LRO 多核环境关闭
5️⃣ 综合检查方法
| 模块 | 检查点 | 命令 | 实际运行判断 |
|---|---|---|---|
| IRQ 绑核 | IRQ CPU 是否本地、是否处理数据 | /proc/interrupts, smp_affinity_list |
中断计数在绑核 CPU 上增长,CPU 不满 |
| RPS / RFS | CPU 分配是否合理,丢包情况 | /proc/net/softnet_stat, rps_cpus |
dropped=0,rx_packets 均衡增长 |
| Buffer | TCP/UDP 队列是否拥塞 | ss -t -a -i, /proc/net/tcp, iperf3 |
队列不满,吞吐量接近链路极限,丢包少 |
| Offload | 网卡硬件加速是否生效 | ethtool -k, ethtool -S |
CPU 使用下降,包计数正常增长 |
✅ 总结:
-
配置只是理论值,必须通过 软/硬中断计数、softnet_stat、socket 队列、吞吐量、CPU 使用率、offload状态 来判断实际运行是否合理
-
四个模块互相关联:IRQ绑核 → RPS分发 → TCP buffer处理 → Offload降低CPU压力
-
高流量压测 + 实时统计是最终判断标准
我可以在这个基础上再写一个 脚本版检查工具,直接输出四个模块的实际运行状态和异常提示,一键判断 TCP buffer / RPS / IRQ / Offload 是否合理。
你希望我写这个脚本吗?
浙公网安备 33010602011771号