负载排查和优化
Linux 网络优化与性能分析完全指南
1️⃣ 中断与软中断基础
1.1 中断(IRQ)概念
-
定义:CPU 在执行任务时,外设或内核事件请求 CPU 立即响应。
-
作用:及时处理外设请求和系统事件,保证系统响应及时、稳定。
1.2 硬中断(Hard IRQ)
-
触发方式:硬件直接触发。
-
作用:
-
快速响应外设,如网卡收包、磁盘 I/O、定时器。
-
优先级高,必须短时间完成。
-
-
查看:
cat /proc/interrupts
1.3 软中断(Soft IRQ)
-
触发方式:硬中断处理完后,由内核延迟执行。
-
作用:
-
处理硬中断后的任务,如网络数据包、任务调度。
-
分发到多核,提高 CPU 利用率。
-
-
优化手段:
-
RPS(Receive Packet Steering):软中断 CPU 分发。
-
RFS(Receive Flow Steering):按流绑定到 CPU。
-
-
查看:
cat /proc/softirqs
1.4 硬中断与软中断区别
项目 | 硬中断 | 软中断 |
---|---|---|
触发方式 | 硬件直接触发 | 硬中断后内核延迟处理 |
执行上下文 | CPU 当前上下文 | ksoftirqd 内核线程 |
优先级 | 高 | 中 |
作用 | 立即响应设备 | 延迟处理任务,如网络收包 |
调整方法 | IRQ 绑核 /proc/irq/*/smp_affinity_list |
RPS/RFS /sys/class/net/*/queues/rx-* |
2️⃣ 网络优化基础
2.1 网卡 Offload
-
作用:减轻 CPU 负载,网卡处理部分网络协议。
-
常用参数:
-
TSO: TCP 分段
-
GSO: 通用分段
-
GRO: 通用接收聚合
-
-
查看默认状态:
ethtool -k eth0
-
开启:
ethtool -K eth0 tso on gso on gro on
2.2 IRQ 绑核
-
作用:将硬中断绑定到指定 CPU,提高多核性能。
-
设置:
echo 2-15 > /proc/irq/<IRQ>/smp_affinity_list
2.3 RPS / RFS(软中断分发)
-
作用:将软中断分发到多核,提高网络吞吐量。
-
配置文件:
-
rps_cpus
: CPU 掩码 -
rps_flow_cnt
: RFS flow 数量
-
-
查看默认值:
cat /sys/class/net/eth0/queues/rx-*/rps_cpus
cat /sys/class/net/eth0/queues/rx-*/rps_flow_cnt
2.4 TCP/UDP Buffer
-
作用:增大内核缓冲区,提升高并发性能。
-
参数:
net.core.rmem_max
net.core.wmem_max
net.ipv4.tcp_rmem
net.ipv4.tcp_wmem
3️⃣ 网络优化脚本(分查询与设置)
#!/bin/bash
NIC="eth0"
CPULIST="2-15"
RMEM_MAX=16777216
WMEM_MAX=16777216
TCP_RMEM="4096 87380 16777216"
TCP_WMEM="4096 87380 16777216"
RPS_CPUS="ffff"
RPS_FLOW_ENTRIES=32768echo "=== 网络优化: $NIC ==="# --- 查询默认值 ---
echo "[查询] Offload:"
ethtool -k $NIC | grep -E 'tcp-segmentation|generic-segmentation|generic-receive'echo "[查询] IRQ:"
for irq in $(grep "$NIC" /proc/interrupts | awk -F: '{print $1}' | tr -d ' '); doecho "$irq: $(cat /proc/irq/$irq/smp_affinity_list)"
doneecho "[查询] TCP/UDP buffer:"
sysctl net.core.rmem_max net.core.wmem_max net.ipv4.tcp_rmem net.ipv4.tcp_wmemecho "[查询] RPS/RFS:"
for q in /sys/class/net/$NIC/queues/rx-*; doecho "$q: RPS=$(cat $q/rps_cpus) FLOW=$(cat $q/rps_flow_cnt)"
done# --- 设置 ---
echo "[设置] Offload"
ethtool -K $NIC tso on gso on gro onecho "[设置] IRQ 绑核"
for irq in $(grep "$NIC" /proc/interrupts | awk -F: '{print $1}' | tr -d ' '); doCURRENT=$(cat /proc/irq/$irq/smp_affinity_list)[ "$CURRENT" != "$CPULIST" ] && echo $CPULIST > /proc/irq/$irq/smp_affinity_list
doneecho "[设置] TCP/UDP buffer"
CURRENT_RMEM=$(sysctl -n net.core.rmem_max)
CURRENT_WMEM=$(sysctl -n net.core.wmem_max)
if [ "$CURRENT_RMEM" -ne "$RMEM_MAX" ] || [ "$CURRENT_WMEM" -ne "$WMEM_MAX" ]; thensysctl -w net.core.rmem_max=$RMEM_MAXsysctl -w net.core.wmem_max=$WMEM_MAXsysctl -w net.ipv4.tcp_rmem="$TCP_RMEM"sysctl -w net.ipv4.tcp_wmem="$TCP_WMEM"
fiecho "[设置] RPS/RFS"
for q in /sys/class/net/$NIC/queues/rx-*; doCURRENT_RPS=$(cat $q/rps_cpus)CURRENT_FLOW=$(cat $q/rps_flow_cnt)if [ "$CURRENT_RPS" != "$RPS_CPUS" ] || [ "$CURRENT_FLOW" != "$RPS_FLOW_ENTRIES" ]; thenecho $RPS_CPUS > $q/rps_cpusecho $RPS_FLOW_ENTRIES > $q/rps_flow_cntfi
done
4️⃣ 性能分析(Perf 全套流程)
4.1 Step1: 基础统计
perf stat -a -d sleep 5
-
输出指标:
-
cycles
: CPU 时钟周期 -
instructions
: 执行指令数 -
cache-misses
: 缓存未命中 -
context-switches
: 上下文切换次数 -
page-faults
: 页面错误次数 -
syscalls
: 系统调用次数
-
-
分析思路:
-
page-faults
高 → 内存不足或 NUMA 远程访问 -
syscalls
高 → 系统调用瓶颈 -
context-switches
高但 syscall 正常 → 调度/锁瓶颈 -
CPI 高(cycles/instructions)但 syscall/ctx/faults 正常 → CPU stall
-
4.2 Step2: 系统调用跟踪
perf trace -a
-
找出 最耗时的系统调用
-
分析 I/O、网络、文件操作瓶颈
4.3 Step3: 调度/锁分析
perf sched record -a -g sleep 10
perf sched latency
-
查看
ksoftirqd
、kworker
等调度延迟 -
分析 context-switch 高的原因
4.4 Step4: 热点分析
perf top -a
-
实时查看 CPU 消耗最高的函数
-
检查是否卡在:
-
schedule()
/io_schedule()
-
内核网络或 I/O 函数
-
用户态 CPU 密集函数
-
4.5 Step5: 深入分析
perf record -a -g sleep 10
perf report
-
获取调用栈,分析热点函数
-
判断 NUMA 远程访问、宿主机 I/O 调度延迟等原因
4.6 Step6: 分支思路总结
现象 | 分析方法 | 可能原因 |
---|---|---|
syscalls 高 | perf trace -a |
I/O/网络/文件系统瓶颈 |
context-switch 高 | perf sched record/latency |
调度/锁争用 |
page-fault 高 | /proc/softirqs + perf top |
内存/NUMA 远程访问 |
CPI 高但 syscall/ctx/fault 正常 | perf top -a |
CPU stall、cache miss、NUMA |
5️⃣ 网络优化 + 性能诊断闭环流程图
+---------------------+
| 网络收包 |
| (NIC Hard IRQ) |
+---------+-----------+|v
+---------------------+
| 硬中断绑核 / RPS |
| irq_affinity / RPS |
+---------+-----------+|v
+---------------------+
| ksoftirqd / SoftIRQ |
| (网络、调度任务) |
+---------+-----------+|v
+---------------------+
| TCP/UDP Buffer |
| rmem/wmem/tcp_* |
+---------+-----------+|v
+---------------------+
| 用户态应用 / syscall |
| perf stat / perf top |
+---------+-----------+|v
+---------------------+
| 调度 / 锁分析 |
| perf sched / latency |
+---------+-----------+|v
+---------------------+
| 深入热点分析 |
| perf record / report |
+---------------------+
-
流程说明:
-
NIC 收包 → 触发硬中断。
-
IRQ 绑核 + RPS → 硬中断分发到 CPU,软中断 ksoftirqd 处理。
-
软中断处理 → 网络协议栈或调度任务执行。
-
TCP/UDP Buffer → 提升高并发吞吐量。
-
用户态应用 → 使用 perf stat/top 分析 CPU 消耗。
-
调度/锁分析 → perf sched 评估 context switch。
-
深入分析热点 → perf record/report 找出瓶颈函数和 NUMA 影响。
-
6️⃣ 总结与优化闭环
-
打印默认值:Offload、IRQ、TCP/UDP buffer、RPS/RFS
-
执行优化设置
-
统计中断/软中断负载
-
Perf 系列分析 CPU/系统瓶颈
-
按不同分支做针对性优化
-
网络:RPS/RFS、队列、RSS
-
调度:调整 CPU affinity、调度器参数
-
内存:增加 buffer、优化 NUMA
-
I/O:优化磁盘调度器
-
-
对比优化前后指标
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/909327.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!