软/硬中断计数、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=0rx_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 是否合理。

你希望我写这个脚本吗?

posted on 2025-12-30 14:21  吃草的青蛙  阅读(1)  评论(0)    收藏  举报

导航