案例

工具

  • sar是一个系统活动报告工作,既可以实时查看系统的当前活动,又可以配置保存和报告历史统计数据
  • hping3 是一个可以构造 TCP/IP 协议数据包的工具,可以对系统进行安全审计、防火墙测试等。
  • tcpdump 是一个常用的网络抓包工具,常用来分析各种网络问题。

安装工具

1
$ apt-get install sysstat hping3 tcpdump

操作分析: 步骤1. 在第一个终端开启nginx,并检查是否正常开启

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

步骤2. 在第二个终端,运行hping3命令,模拟nginx的客户端请求 (docker.for.mac.host.internal为容器请求宿主机的地址)

1
$ hping3 -S -p 8080 -i u100 docker.for.mac.host.internal

步骤3. 分析

  1. 在第一个终端执行命令 top
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
Processes: 374 total, 4 running, 1 stuck, 369 sleeping, 1485 threads                           14:05:26
Load Avg: 4.07, 2.65, 1.95  CPU usage: 9.16% user, 42.46% sys, 48.37% idle
SharedLibs: 231M resident, 66M data, 36M linkedit.
MemRegions: 38000 total, 1782M resident, 171M private, 3301M shared.
PhysMem: 8100M used (1788M wired), 90M unused.
VM: 1740G vsize, 1992M framework vsize, 4414(64) swapins, 152514(0) swapouts.
Networks: packets: 1528667/100M in, 1566257/102M out. Disks: 158537/3132M read, 40820/1237M written.

PID   COMMAND      %CPU  TIME     #TH    #WQ  #PORT MEM    PURG   CMPRS  PGRP PPID STATE
790   com.docker.h 162.0 06:54.55 17/1   0    40    2496M+ 0B     85M-   738  785  running
228   symptomsd    95.9  00:23.21 3/1    2/1  84    5612K  0B     2740K  228  1    running
0     kernel_task  52.0  02:35.77 206/9  0    0     91M-   0B     0B     0    0    running

2.在第一个终端运行sar命令

1
2
3
4
5
6
7
8
# -n DEV 表示显示网络收发的报告,间隔 1 秒输出一组数据 
$ sar -n DEV 1
打印
IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcs 
eth0 12607.00 6304.00 664.86 358.11 0.00 0.00 0 
docker0 6302.00 12604.00 270.79 664.66 0.00 0.00 0 
lo 0.00 0.00 0.00 0.00 0.00 0.00 0
veth9f6bbcd 6302.00 12604.00 356.95 664.66 0.00 0.00

分析: rxpck/s 和 txpck/s 分别表示每秒接收、发送的网络帧数,也就是 PPS rxkB/s 和 txkB/s 分别表示每秒接收、发送的千字节数,也就是 BPS

对网卡 eth0 来说,每秒接收的网络帧数比较大,达到了 12607,而发送的网络帧数则 比较小,只有 6304; 每秒接收的千字节数只有 664 KB,而发送的千字节数更小,只有 358 KB。

3.在第一个终端运行tcpdump命令

1
2
3
4
5
# -i eth0 只抓取 eth0 网卡,-n 不解析协议名和主机名
# tcp port 80 表示只抓取 tcp 协议并且端口号为 8080 的网络帧
$ tcpdump -i eth0 -n tcp port 8080
# 打印
06:05:38.908736 IP 172.17.0.1.55372 > 172.17.0.2.80: Flags [F.], seq 807309568, ack 807308582, win 229, options [nop,nop,TS val 3353161100 ecr 1354799123], length 0

分析:表示网络帧从172.17.0.1.55372转发到172.17.0.2的80端口

总结

软中断 CPU 使用率(softirq)升高是一种很常见的性能问题. 碰到网络性能问题,优先使用sar和tcpdump,感觉tcpdump在网络抓包上面非常好用