关于Linux性能分析小结

前言

Netflix技术博曾经发表过一篇文章——《Linux performance analysis in 60000 milliseconds》。在这篇文章中,Netflix公司介绍了10个重要的Linux命令,用于在发现问题的前60秒内快速分析定位问题。这10个命令涉及系统错误、资源饱和率、资源占用率等指标查看。

uptime
dmesg | tail
vmstat 1
mpstat -P ALL 1
pidstat 1
iostat -xz 1
free -m
sar -n DEV 1
sar -n TCP,ETCP 1
top

该文章还提到了分析系统性能问题时常用的一套方法:USE。该方法主要从资源使用率(Utilization)、资源饱和度(Satuation)、错误(Error)这3个角度,对CPU、内存、磁盘等资源进行分析。可以帮助我们缩写问题范围,给下一步定位问题提供更明确的方向。

uptime

这个命令主要用于查看系统运行时间。

[test@localhost ~]$ uptime
 23:38:48 up  4:59,  1 user,  load average: 0.01, 0.02, 0.05

各字段说明如下:

  • 23:38:48 : 代表系统开机时间。
  • 4:59 : 代表当前系统已运行1小时52分。
  • 2 users : 代表当前登录到系统的会话一共2个,注意,这里不是用户,而是会话。
  • load average: 0.01, 0.02, 0.05 : 过去1分钟、5分钟、15分钟内的平均负载。

可以通过负载因子大致判断出当前有多少任务在等待运行。在Linux系统中,这包含了想要或者正在使用CPU的任务,以及在I/O上阻塞的任务。

dmesg | tail

dmesg可以用于查看系统启动后所输出的一系列重要日志。添加tail后,可用于查看最新的几条系统日志。

$ dmesg | tail
[1880957.563150] perl invoked oom-killer: gfp_mask=0x280da, order=0, oom_score_adj=0
[...]
[1880957.563400] Out of memory: Kill process 18694 (perl) score 246 or sacrifice child
[1880957.563408] Killed process 18694 (perl) total-vm:1972392kB, anon-rss:1953348kB, file-rss:0kB
[2320864.954447] TCP: Possible SYN flooding on port 7001. Dropping request.  Check SNMP co

例如,上面输出的oom-killer、SYN flooding均为重要的系统日志。

vmstat 1

[test@localhost ~]$ 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
 0  0      0 15617080    948 329292    0    0     4     1    6    8  0  0 100  0  0
 0  0      0 15617204    948 329292    0    0     0     0   48   66  0  0 100  0  0
 0  0      0 15617204    948 329292    0    0     0     0   32   52  0  0 100  0  0
 0  0      0 15617204    948 329292    0    0     0     0   41   66  0  0 100  0  0
 0  0      0 15617328    948 329292    0    0     0     0   45   65  0  0 100  0  0
 0  0      0 15617328    948 329292    0    0     0     0   47   69  0  0 100  0  0
 0  0      0 15617328    948 329292    0    0     0     0   33   56  0  0 100  0  0
 0  0      0 15617328    948 329292    0    0     0     0   42   64  0  0 100  0  0
 0  0      0 15617328    948 329292    0    0     0     0   30   52  0  0 100  0  0
 0  0      0 15617328    948 329292    0    0     0     0   35   59  0  0 100  0  0
 0  0      0 15617328    948 329292    0    0     0     0   30   54  0  0 100  0  0

vmstat 即virtual memory statistics,主要用于获取系统中进程、内存、磁盘I/O等整体运行状态。如果带参数1,表示每秒输出1次采样结果。各统计项含义如下:

procs标签:

  • r:表示运行队列中进程数量(处于runnable状态的进程数量)。这个值比平均负载能够更好地看出当前CPU是否饱和。如果长期大于CPU(core)个数,则说明当前系统需要增加CPU
  • b:表示等待I/O的进程数量。

memory标签:

  • swpd:使用虚拟内存大小(即磁盘交换),如果swpd不为0,但是si、so长期为0,则这种情况不会影响系统性能
  • free:空闲物理内存大小(单位KB)。
  • buff:用于buffer cache的内存大小。一般情况下,对块设备的读写才需要buffer cache。
  • cache:用于page cache的内存大小。一般作为文件系统的cache,如果cache较大,说明用到cache的文件较多。如果此时I/O中bi比较小,则说明文件系统状态良好。

swap标签:(swap in/out)

  • si:每秒由交换区写到内存的大小,由磁盘调入内存。如果非0,说明内存不足
  • so:每秒写入交换区的内存大小,由内存调入磁盘。如果非0,说明内存不足

io标签:(block in/out)

  • bi:每秒从块设备读入数据的总量(读磁盘)。
  • bo:每秒向块设备写入数据的总量(写磁盘)。

system标签:

  • in:即interrupt,表示每秒中断次数,包括时钟中断。
  • cs:即context switch,表示每秒上下文切换次数。当上下文切换次数高于磁盘I/O和网络I/O次数时,需要进一步排查

cpu标签:

  • us:即user time,用户态CPU时间百分比。如果us值比较高,说明进程在用户态消耗时间较多,但如果长期大于50%,需考虑优化用户程序
  • sy:即system time,内核态CPU时间占比。此处us+sy百分比参考值为80%,如果大于80%说明可能存在CPU不足
  • wa:即wait time,即I/O等待的时间占比。此处wa的参考值为30%,如果超过30%,说明I/O等待严重,这可能是大量磁盘随机访问造成,也可能是磁盘或磁盘访问控制器的带宽瓶颈造成(块操作)。注意,这个时间也包含在了id(idle time)里面,相当于另一种形式的CPU空闲
  • id:即idle time,即CPU处于空闲状态的时间占比。

mpstat -P ALL 1

即multi-processor Statistics。其中-P ALL表示监控所有CPU,1表示1秒输出1次统计信息。相对于vmstat,mpstat可以输出指定CPU的统计信息。

[test@localhost ~]$ mpstat 1
Linux 3.10.0-514.el7.x86_64 (localhost.localdomain)     2018年08月18日  _x86_64_        (4 CPU)

08时44分54秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
08时44分55秒  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
08时44分56秒  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
08时44分57秒  all    0.00    0.00    0.00    0.25    0.00    0.00    0.00    0.00    0.00   99.75
08时44分58秒  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
08时44分59秒  all    0.00    0.00    0.00    0.25    0.00    0.00    0.00    0.00    0.00   99.75
08时45分00秒  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

各字段说明如下:

  • %usr:指定时间间隔内,用户态时间占比,不包含nice值为负的进程。
  • %nice:指定时间间隔内,nice值为负的进程的运行时间占比。
  • %sys:指定时间间隔内,内核态时间占比。
  • %iowait:指定时间间隔内,磁盘I/O等待时间占比。
  • %irq:指定时间间隔内,硬件中断处理时间占比。
  • %soft:指定时间间隔内,软件中断处理事件占比。
  • %steal:指定时间间隔内,虚拟机管理程序服务另一个虚拟处理器时虚拟CPU或CPU无意中等待的时间占比。
  • %guest:指定时间间隔内,显示CPU或CPU运行虚拟处理器所花费的时间占比。
  • %idle:指定时间间隔内,CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间。

pidstat 1

和top不同,pidstat可以用于滚动输出系统中全部或指定进程相关统计信息。

[test@localhost ~]$ pidstat 1
Linux 3.10.0-514.el7.x86_64 (localhost.localdomain)     2018年08月18日  _x86_64_        (4 CPU)

09时21分30秒   UID       PID    %usr %system  %guest    %CPU   CPU  Command
09时21分31秒  1001     10999    0.00    1.00    0.00    1.00     3  pidstat

其中,重要的命令行参数如下:

-p:统计指定进程的相关信息。

-r:显示缺页错误和内存使用率。重要的标签如下:
1. PID:进程标识。
2. minflt/s:每秒次缺页总数,次缺页错误次数是指虚拟内存地址映射成物理内存地址产生的page fault次数,不需要从磁盘加载内存页。
3. majflt/s:每秒主缺页总数,当虚拟内存地址映射成物理内存地址时,相应的page在swap中,这样的page fault为major page fault,一般在内存使用紧张时产生,需要从磁盘加载内存页。
4. VSZ:虚拟内存大小,以kb为单位进行统计。
5. RSS:物理内存大小,以kb为单位进行统计。

-u:统计CPU使用率。重要的标签如下:
1. PID:进程标识。
2. %usr:用户态任务占用CPU百分比。
3. %system:内核态任务占用CPU百分比。
5. %CPU:任务占用CPU百分比。
6. CPU:任务绑定的处理器编号。

-w:报告指定进程上下文切换情况。重要标签如下:
1. PID:进程标识。
2. cswch/s:任务每秒引发的自愿上下文切换,即因进程所需要的资源未就绪而产生的上下文切换。
3. nvcswch/s:任务每秒引发的非资源上下文切换,即操作系统强制当前进程放弃时间片,并转而执行另一任务。

-t:按照线程粒度进行统计。重要标签如下:
1. TGID:线程组leader标识。
2. TID:被监控的线程标识。

-d:I/O统计报告,重要标签如下:
1. kB_rd/s:每秒从磁盘读入的字节数,单位kb。
2. kB_wr/s:每秒向磁盘写入的字节数,单位kb。
3. kB_ccwr/s:每秒写入磁盘被取消的数量,单位kb。

iostat -xz 1

iostat可以用于提供丰富的磁盘I/O状态统计数据,是理解当前磁盘工作负载和性能的重要工具。其中比较重要的命令行参数、统计项如下:

-x:输出详细的I/O信息。

rrqm/s:每秒对磁盘读请求被合并次数,文件系统会对读取同块的请求进行合并。
wrqm/s:每秒对该设备的写请求被合并次数。
r/s:每秒完成的读次数。
w/s:每秒完成的写次数。
rkB/s:每秒读数据量(kB为单位)。
wkB/s:每秒写数据量(kB为单位)。
avgrq-sz:平均每次IO操作的数据量(扇区数为单位)。
avgqu-sz:平均等待处理的I/O请求队列长度。
await:平均每次I/O请求等待时间(包括等待时间和处理时间,毫秒为单位)。
svctm:平均每次I/O请求的处理事件(毫秒为单位)。
%util:采用周期内用于I/O操作的时间比率,即I/O队列非空的时间比率。

在进行问题分析时,我们往往需要关注以下几个问题:

  1. I/O请求队列是否过长?(avgqu-sz)
  2. I/O size是否过大或者过小?(avgrq-sz)
  3. 是否造成I/O等待过长?(await)
  4. 每个I/O处理事件是否过长?(svctm,该值有可能不准确)
  5. 磁盘压力是否过大?(%util,反映磁盘繁忙程度)

一个典型案例如下图所示(下图来源于知乎)。该图为数据库服务器执行iostat命令后的结果,当时大约有100人并发执行,每一个效率都很低。

关于Linux性能分析小结_第1张图片

从数据报告可以看到,avgqu-sz(平均等待处理的I/O请求队列)长度为0,未出现I/O等待。而%user为74.40,说明瓶颈不在I/O,故应该是执行了CPU密集型业务,很可能是因为系统存在大量无索引的SQL查询,而导致CPU飙高。

你可能感兴趣的:(系统分析)