曾国藩:一勤天下无难事

Linux 性能监控工具

2019.03.20

注:原文连接:http://tenpercent.top/2018/07/10/Linux-performance-monitor/

Linux 性能指标

  • CPU

    CPU利用率、用户时间(表示CPU在用户进程上的时间百分比)、系统时间(表示CPU花在内核操作上的时间百分比)、空闲时间、平均负载、阻塞、上下文切换、中断等

  • 内存

    空闲内存、Swap利用率、缓冲和缓存、活动和非活动内存等

  • 磁盘IO

    IO等待、平均队列长度、每秒传输(TPS)等

  • 网络

    接收和发送的包、每秒碰撞(各个网络接口所连接网络的所发生的冲突数量)、丢包、错误等

监测工具

以下是对 Linux 的性能进行监控的常用工具:

工具 简介
top 查看进程活动状态以及一些系统状况
vmstat 查看系统状态、硬件和系统信息等
iostat 查看 CPU 负载、硬盘状况
sar 综合工具,查看系统状况
mpstat 查看多处理器状况
netstat 查看网络状况
iptraf 实时网络状态监测
tcpdump 抓取网络数据包,详细分析
tcptrace 网络包分析工具
netperf 网络带宽工具
dstat 综合了 vmstat、iostat、ifstat、netstat 等多个信息

top 工具

top是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。

Tasks: 281 total,   1 running, 280 sleeping,   0 stopped,   0 zombie
%Cpu(s):  8.5 us,  2.8 sy,  0.0 ni, 86.8 id,  1.4 wa,  0.0 hi,  0.4 si,  0.0 st
KiB Mem : 16300820 total,  5955080 free,  2367488 used,  7978252 buff/cache
KiB Swap:        0 total,        0 free,        0 used. 13466504 avail Mem

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
20373 root      20   0 1027288 930680  43260 S  24.0  5.7   1909:36 kube-apiserver
6439 root      20   0  475468 354316  33996 S   9.3  2.2 564:01.71 kube-controller
1852 root      20   0   10.2g 210320  44496 D   6.0  1.3   2724:13 etcd
22023 root      20   0 1456692 111800  36888 S   1.7  0.7  94:26.27 kubelet
3115 root      20   0  489188  24920  11632 S   0.7  0.2 230:39.64 flanneld
3823 root      20   0   47836  24852  12684 S   0.7  0.2 329:49.32 coredns
30021 root      20   0   84596  62604  15272 S   0.7  0.4  92:19.71 kube-scheduler
    9 root      20   0       0      0      0 S   0.3  0.0 215:25.59 rcu_sched
1039 root      20   0 2701956  95516  17744 S   0.3  0.6 701:47.32 dockerd
1983 root      20   0  610316  13200   2376 S   0.3  0.1 331:44.18 barad_agent
3205 root      20   0   68952  36524  13144 S   0.3  0.2 222:29.18 nginx-ingress-c
3482 root      20   0   47300  22620  12664 S   0.3  0.1 116:26.12 coredns
23841 root      20   0  309956  66232   6120 S   0.3  0.4  11:08.46 ruby
26321 root      20   0  162104   2456   1584 R   0.3  0.0   0:00.04 top

PID:进程的ID

USER:进程所有者

PR:进程的优先级别,越小越优先被执行

NI:nice值

VIRT:进程占用的虚拟内存

RES:进程占用的物理内存

SHR:进程使用的共享内存

S:进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负数

%CPU:进程占用CPU的使用率

%MEM:进程使用的物理内存和总内存的百分比

TIME+:该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值。

COMMAND:进程启动命令名称

vmstat 工具

vmstat 是个查看系统整体性能的小工具,小巧,即使在机器负载很高的情况下也运行良好,并且可以用时间间隔采集得到连续的性能数据。

[root@cloud-cn-master-1 ~]# vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
9  1      0 5953600 1868188 6112188    0    0     1    80    1    0 21  5 74  1  0
0  0      0 5953416 1868188 6112232    0    0     0   488 11335 17320  6  3 90  1  0
3  0      0 5952956 1868188 6112260    0    0     0   572 12337 18839  5  4 90  2  0
1  0      0 5951788 1868188 6112264    0    0     0   428 9709 14629  3  3 92  1  0
0  0      0 5952980 1868188 6112284    0    0     0   496 11227 16675  4  3 92  1  0
0  0      0 5952532 1868188 6112328    0    0     0   624 9619 14442  4  3 92  1  0

参数介绍:

  • r,可运行队列的线程数,这些线程都是可运行状态,只不过 CPU 暂时不可用
  • b,被 blocked 的进程数,正在等待 IO 请求
  • in,被处理过的中断数
  • cs,系统上正在做上下文切换的数目
  • us,用户占用 CPU 的百分比
  • sys,内核和中断占用 CPU 的百分比
  • wa,所有可运行的线程被 blocked 以后都在等待 IO,这时候 CPU 空闲的百分比
  • id,CPU 完全空闲的百分比

举两个例子来分析一下:

$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
4  0    140 2915476 341288 3951700  0    0     0     0 1057  523 89 21  0  0  0
4  0    140 2915724 341296 3951700  0    0     0     0 1048  546 79 11  0  0  0
4  0    140 2915848 341296 3951700  0    0     0     0 1044  514 88 22  0  0  0
4  0    140 2915848 341296 3951700  0    0     0    24 1044  564 80 20  0  0  0
4  0    140 2915848 341296 3951700  0    0     0     0 1060  546 78 12  0  0  0

从上面的数据可以看出几点: - interrupts(in) 非常高,context switch(cs) 比较低,说明这个 CPU 一直在不停的请求资源 - user time(us) 一直保持在 80% 以上,而且上下文切换较低 (cs),说明某个进程可能一直霸占着 CPU - run queue(r) 刚好在 4 个

    $ vmstat 1
    procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
    r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
    14  0    140 2904316 341912 3952308  0    0     0   460 1106 9593 36 64  1  0  0
    17  0    140 2903492 341912 3951780  0    0     0     0 1037 9614 35 65  1  0  0
    20  0    140 2902016 341912 3952000  0    0     0     0 1046 9739 35 64  1  0  0
    17  0    140 2903904 341912 3951888  0    0     0    76 1044 9879 37 63  0  0  0
    16  0    140 2904580 341912 3952108  0    0     0     0 1055 9808 34 65  1  0  0

从上面的数据可以看出几点:

  • context switch(cs) 比 interrupts(in) 要高的多,说明内核不得不来回切换进程
  • 进一步观察发现 system time(sy) 很高而 user time(us) 很低,而且加上高频度的上下文切换 (cs),说明正在运行的应用程序调用了大量的系统调用
  • run queue(r) 在 14 个线程以上,而这个机器的硬件配置 (4 核),应该保持在 12 以内。

iostat 工具

iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。iostat属于sysstat软件包。可以用yum install sysstat 直接安装。

[root@cloud-cn-master-1 ~]# iostat -mtx 2
Linux 3.10.0-862.11.6.el7.x86_64 (cloud-cn-master-1)    03/20/2019  _x86_64_    (4 CPU)

03/20/2019 10:54:37 PM
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
        20.55    0.00    5.04    0.51    0.00   73.90

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
vda               0.00     6.06    0.01   33.68     0.00     0.25    15.07     0.05    1.57    5.97    1.57   0.63   2.12
vdb               0.03     4.57    0.09    5.33     0.00     0.06    24.15     0.02    3.95    1.68    3.99   0.52   0.28
vdc               0.00     0.00    0.00    0.00     0.00     0.00    31.86     0.00    0.52    0.52    0.00   0.42   0.00

cpu属性值说明:

  • %user:CPU处在用户模式下的时间百分比。
  • %nice:CPU处在带NICE值的用户模式下的时间百分比。
  • %system:CPU处在系统模式下的时间百分比。
  • %iowait:CPU等待输入输出完成时间的百分比。
  • %steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。
  • %idle:CPU空闲时间百分比。
  • 如果%iowait的值过高,表示硬盘存在I/O瓶颈,%idle值高,表示CPU较空闲,如果%idle值高但系统响应慢时,有可能是CPU等待分配内存,此时应加大内存容量。%idle值如果持续低于10,那么系统的CPU处理能力相对较低,表明系统中最需要解决的资源是CPU。

disk属性值说明:

  • rrqm/s: 每秒进行 merge 的读操作数目。即 rmerge/s
  • wrqm/s: 每秒进行 merge 的写操作数目。即 wmerge/s
  • r/s: 每秒完成的读 I/O 设备次数。即 rio/s
  • w/s: 每秒完成的写 I/O 设备次数。即 wio/s
  • rsec/s: 每秒读扇区数。即 rsect/s
  • wsec/s: 每秒写扇区数。即 wsect/s
  • rkB/s: 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。
  • wkB/s: 每秒写K字节数。是 wsect/s 的一半。
  • avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。
  • avgqu-sz: 平均I/O队列长度。
  • await: 平均每次设备I/O操作的等待时间 (毫秒)。
  • svctm: 平均每次设备I/O操作的服务时间 (毫秒)。
  • %util: 一秒中有百分之多少的时间用于 I/O 操作,即被io消耗的cpu百分比

    如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。

    如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;

    如果 await 远大于 svctm,说明I/O 队列太长,io响应太慢,则需要进行必要优化。

    如果avgqu-sz比较大,也表示有大量io在等待。

sar 工具

sar是System Activity Reporter(系统活动情况报告)的缩写。sar工具将对系统当前的状态进行取样,然后通过计算数据和比例来表达系统的当前运行状态。

查看 cpu使用率

sar -u - %user 用户模式下消耗的CPU时间的比例; - %nice 通过nice改变了进程调度优先级的进程,在用户模式下消耗的CPU时间的比例 - %system 系统模式下消耗的CPU时间的比例; - %iowait CPU等待磁盘I/O导致空闲状态消耗的时间比例; - %steal 利用Xen等操作系统虚拟化技术,等待其它虚拟CPU计算占用的时间比例; - %idle CPU空闲时间比例;

查看平均负载

sar -q - runq-sz:运行队列的长度(等待运行的进程数) - plist-sz:进程列表中进程(processes)和线程(threads)的数量 - ldavg-1:最后1分钟的系统平均负载 - ldavg-5:过去5分钟的系统平均负载 - ldavg-15:过去15分钟的系统平均负载

查看内存使用状况

sar -r - kbmemfree:这个值和free命令中的free值基本一致,所以它不包括buffer和cache的空间. - kbmemused:这个值和free命令中的used值基本一致,所以它包括buffer和cache的空间. - %memused:物理内存使用率,这个值是kbmemused和内存总量(不包括swap)的一个百分比. - kbbuffers和kbcached:这两个值就是free命令中的buffer和cache. - kbcommit:保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap). - %commit:这个值是kbcommit与内存总量(包括swap)的一个百分比.

sar参数说明

  • -A 汇总所有的报告
  • -a 报告文件读写使用情况
  • -B 报告附加的缓存的使用情况
  • -b 报告缓存的使用情况
  • -c 报告系统调用的使用情况
  • -d 报告磁盘的使用情况
  • -g 报告串口的使用情况
  • -h 报告关于buffer使用的统计数据
  • -m 报告IPC消息队列和信号量的使用情况
  • -n 报告命名cache的使用情况
  • -p 报告调页活动的使用情况
  • -q 报告运行队列和交换队列的平均长
  • -R 报告进程的活动情况
  • -r 报告没有使用的内存页面和硬盘块
  • -u 报告CPU的利用率
  • -v 报告进程、i节点、文件和锁表状态
  • -w 报告系统交换活动状况
  • -y 报告TTY设备活动状况

注:原文连接:http://tenpercent.top/2018/07/10/Linux-performance-monitor/