案例运行环境
机器配置:2 CPU、8 GB 内存。预先安装 docker、sysstat、sar 、hping3、tcpdump 等工具,比如 apt-get install docker.io sysstat hping3 tcpdump。
新工具
sar、 hping3 和 tcpdump:
sar 是一个系统活动报告工具,既可以实时查看系统的当前活动,又可以配置保存和报告历史统计数据。hping3 是一个可以构造 TCP/IP 协议数据包的工具,可以对系统进行安全审计、防火墙测试等。tcpdump 是一个常用的网络抓包工具,常用来分析各种网络问题。
操作和分析
安装环境
# 运行Nginx服务并对外开放80端口$ docker run -itd --name=nginx -p 80:80 nginx
确认 Nginx 正常启动
$ curl http://192.168.0.30/<!DOCTYPE html><html><head><title>Welcome to nginx!</title>...
hping3模拟客户端请求
# -S参数表示设置TCP协议的SYN(同步序列号),-p表示目的端口为80# -i u100表示每隔100微秒发送一个网络帧# 注:如果你在实践过程中现象不明显,可以尝试把100调小,比如调成10甚至1$ hping3 -S -p 80 -i u100 192.168.0.30
后面分析过程总忘记此操作,关注问题本身
top命令查看状态
# top运行后按数字1切换到显示所有CPU$ toptop - 10:50:58 up 1 days, 22:10, 1 user, load average: 0.00, 0.00, 0.00Tasks: 122 total, 1 running, 71 sleeping, 0 stopped, 0 zombie%Cpu0 : 0.0 us, 0.0 sy, 0.0 ni, 96.7 id, 0.0 wa, 0.0 hi, 3.3 si, 0.0 st%Cpu1 : 0.0 us, 0.0 sy, 0.0 ni, 95.6 id, 0.0 wa, 0.0 hi, 4.4 si, 0.0 st...PID USERPR NI VIRT RES SHR S %CPU %MEMTIME+ COMMAND7 root20 0 000 S 0.3 0.0 0:01.64 ksoftirqd/016 root20 0 000 S 0.3 0.0 0:01.97 ksoftirqd/12663 root20 0 923480 28292 13996 S 0.3 0.3 4:58.66 docker-containe3699 root20 0 000 I 0.3 0.0 0:00.13 kworker/u4:03708 root20 0 44572 4176 3512 R 0.3 0.1 0:00.07 top1 root20 0 225384 9136 6724 S 0.0 0.1 0:23.25 systemd2 root20 0 000 S 0.0 0.0 0:00.03 kthreadd...# top运行后按数字1切换到显示所有CPU$ toptop - 10:50:58 up 1 days, 22:10, 1 user, load average: 0.00, 0.00, 0.00Tasks: 122 total, 1 running, 71 sleeping, 0 stopped, 0 zombie%Cpu0 : 0.0 us, 0.0 sy, 0.0 ni, 96.7 id, 0.0 wa, 0.0 hi, 3.3 si, 0.0 st%Cpu1 : 0.0 us, 0.0 sy, 0.0 ni, 95.6 id, 0.0 wa, 0.0 hi, 4.4 si, 0.0 st...PID USERPR NI VIRT RES SHR S %CPU %MEMTIME+ COMMAND7 root20 0 000 S 0.3 0.0 0:01.64 ksoftirqd/016 root20 0 000 S 0.3 0.0 0:01.97 ksoftirqd/12663 root20 0 923480 28292 13996 S 0.3 0.3 4:58.66 docker-containe3699 root20 0 000 I 0.3 0.0 0:00.13 kworker/u4:03708 root20 0 44572 4176 3512 R 0.3 0.1 0:00.07 top1 root20 0 225384 9136 6724 S 0.0 0.1 0:23.25 systemd2 root20 0 000 S 0.0 0.0 0:00.03 kthreadd
从第一行开始,逐个看一下:
平均负载全是 0,就绪队列里面只有一个进程(1 running)。每个 CPU 的使用率都挺低,最高的 CPU1 的使用率也只有 4.4%,并不算高。再看进程列表,CPU 使用率最高的进程也只有 0.3%,还是不高呀。我们运行下面的命令:
$ watch -d cat /proc/softirqsCPU0 CPU1HI:00TIMER: 1083906 2368646NET_TX: 539NET_RX: 1550643 1916776BLOCK:00IRQ_POLL:00TASKLET:333637 3930SCHED:963675 2293171HRTIMER:00RCU: 1542111 1590625
通过 /proc/softirqs 文件内容的变化情况,你可以发现, TIMER(定时中断)、NET_RX(网络接收)、SCHED(内核调度)、RCU(RCU 锁)等这几个软中断都在不停变化。
其中,NET_RX,也就是网络数据包接收软中断的变化速率最快。而其他几种类型的软中断,是保证 Linux 调度、时钟和临界区保护这些正常工作所必需的,所以它们有一定的变化倒是正常的。
内核选项命令参数等汇总
sar
系统活动报告工具
hping3
tcp/ip测试工具
tcpdump
抓包工具
top
curl
watch