系统优化-案例分析-如何定位软中断问题

内核线程

linux系统有几个进程号比较小的进程

  • 0号进程:idel进程用来初始化1号进程和2号进程
  • 1号进程:systemd进程也叫init进程,用来初始化所有的用户进程
  • 2号进程:kthreadd,在内核态运行,用来管理内核线程

常见的几个内核线程

1
2
3
4
5
6
7
8
9
10

$ ps -f --ppid 2 -p 2
UID PID PPID C STIME TTY TIME CMD
root 2 0 0 12:02 ? 00:00:01 [kthreadd]
root 9 2 0 12:02 ? 00:00:21 [ksoftirqd/0]
root 10 2 0 12:02 ? 00:11:47 [rcu_sched]
root 11 2 0 12:02 ? 00:00:18 [migration/0]
...
root 11094 2 0 14:20 ? 00:00:00 [kworker/1:0-eve]
root 11647 2 0 14:27 ? 00:00:00 [kworker/0:2-cgr]
  • ksoftirqd:软中断线程
  • kworker:用于执行内核工作队列,分为绑定 CPU (名称格式为 kworker/CPU86330)和未绑定 CPU(名称格式为 kworker/uPOOL86330)两类
  • migration:在负载均衡过程中,把进程迁移到 CPU 上。每个 CPU 都有一个 migration 内核线程。

调试

场景准备:俩台服务器,服务器一运行docker,服务器二压力机,

服务器一:

1
2
3

# 运行Nginx服务并对外开放80端口
$ docker run -itd --name=nginx -p 80:80 nginx

服务器二发压命令

1
2
# sync_flood攻击
$ hping3 -S -p 80 -i u10 192.168.1.2

这时候服务器变慢,top观察如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

$ top
top - 08:31:43 up 17 min, 1 user, load average: 0.00, 0.00, 0.02
Tasks: 128 total, 1 running, 69 sleeping, 0 stopped, 0 zombie
%Cpu0 : 0.3 us, 0.3 sy, 0.0 ni, 66.8 id, 0.3 wa, 0.0 hi, 32.4 si, 0.0 st
%Cpu1 : 0.0 us, 0.3 sy, 0.0 ni, 65.2 id, 0.0 wa, 0.0 hi, 34.5 si, 0.0 st
KiB Mem : 8167040 total, 7234236 free, 358976 used, 573828 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 7560460 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
9 root 20 0 0 0 0 S 7.0 0.0 0:00.48 ksoftirqd/0
18 root 20 0 0 0 0 S 6.9 0.0 0:00.56 ksoftirqd/1
2489 root 20 0 876896 38408 21520 S 0.3 0.5 0:01.50 docker-containe
3008 root 20 0 44536 3936 3304 R 0.3 0.0 0:00.09 top
1 root 20 0 78116 9000 6432 S 0.0 0.1 0:11.77 systemd
...

cpu的idel下降,si很高,且进程ksoftirqd占用比较高,初步判断软中断出现了问题,我们之前通过sar和vmstat抓包去看,现在我们可以通过perf家火焰图工具查看,使用方法如下:

1
2
3
4
5
6
7
8
9
#安装 FlameGraph
git clone https://github.com/brendangregg/FlameGraph
cd FlameGraph

#录制
perf record -a -g -p 9 -- sleep 30

#生成火焰图
perf script -i perf.data|./stackcollapse-perf.pl --all|./flamegraph.pl >flame.svg

生成的火焰图如下:

avator

动态分析

工具如图

avator