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、内存、磁盘等资源进行分析。可以帮助我们缩写问题范围,给下一步定位问题提供更明确的方向。
这个命令主要用于查看系统运行时间。
[test@localhost ~]$ uptime
23:38:48 up 4:59, 1 user, load average: 0.01, 0.02, 0.05
各字段说明如下:
可以通过负载因子大致判断出当前有多少任务在等待运行。在Linux系统中,这包含了想要或者正在使用CPU的任务,以及在I/O上阻塞的任务。
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均为重要的系统日志。
[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标签:
memory标签:
swap标签:(swap in/out)
io标签:(block in/out)
system标签:
cpu标签:
即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
各字段说明如下:
和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可以用于提供丰富的磁盘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队列非空的时间比率。
在进行问题分析时,我们往往需要关注以下几个问题:
一个典型案例如下图所示(下图来源于知乎)。该图为数据库服务器执行iostat命令后的结果,当时大约有100人并发执行,每一个效率都很低。
从数据报告可以看到,avgqu-sz(平均等待处理的I/O请求队列)长度为0,未出现I/O等待。而%user为74.40,说明瓶颈不在I/O,故应该是执行了CPU密集型业务,很可能是因为系统存在大量无索引的SQL查询,而导致CPU飙高。