Linux系统性能剖析工具(一)
最近抽空翻了System Performance这本书,内容主要是讲如何使用工具去查找Linux系统的性能瓶颈。前面我特意把“如何使用工具“这几个字加粗了,除了这就是这本书的核心之外,还有是因为这里面其实含有两层意思:一是字面的意思——怎么使用这些工具以及通过这些个工具能够获取到哪些信息;二是关于工具使用的时间和场合,应该在什么时候使用什么样的工具。我觉得第二点尤为重要,Linux系统经过这么些年的开源演化,伴随着也产生了很多优秀的系统剖析工具,不过对于需要做软件优化的工程师——特别是新人来说,可能就会懵逼了。所以把这些工具梳理出来,系统化叙述成册以便索引是很重要的。
这里我把书中提到的工具并结合一些例子做简单总结,因为篇幅关系及循序渐进的需要,我会分成2~3篇文章陆陆续续的发出来。在此篇里面,主要关注一些基本的命令的用法,如uptime, top, iostat, vmstat等。把它们集中在这里,一个是因为这些命令都比较简单,二是确实非常的常用,可能出问题了第一个想到的就是这些命令了。比如可能首先会用uptime看一下整个系统最近的负载,如果load很高的话然后就会用top去看看哪些任务占用的CPU资源,然后再去检查某一个进程等等。
对于每个命令,我会先贴上在我的机器上执行的输出,然后加以注释,如果有需要的话也会举例加以说明。就此开始吧:
uptime
b20yang@ubuntu$ uptime
23:49:23 up 79 days, 5:13, 2 users, load average: 0.00, 0.01, 0.05
最后三个数字分别表示过去1分钟,5分钟,15分钟系统的负载,可以依此判断系统负载最近的变化趋势。
top/htop
b20yang@ubuntu$ top
%Cpu(s): 0.2 us, 0.3 sy, 0.0 ni, 99.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 3880708 total, 3711540 used, 169168 free, 1347968 buffers
KiB Swap: 2042876 total, 593940 used, 1448936 free. 834140 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1839 b20yang 20 0 1690320 236636 17060 S 0.7 6.1 453:30.65 compiz
1 root 20 0 117196 4452 3148 S 0.0 0.1 1:30.42 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.52 kthreadd
相比uptime,top会显示更多的信息,包括进程级别CPU LOAD、交换分区和物理内存的使用率等。可以通过top找到哪些进程占用了比较多的系统资源。那么如果通过top找到了cpu load很高的进程之后,那接下来应该怎么办呢?接下来就应该去分析这个进程的code execution path,找出为什么用了这么多的资源。 htop是top的高级版本。
mpstat
b20yang@ubuntu$ mpstat -P ALL 1
02:24:11 PM CPU %user %nice %sys %iowait %irq %soft %steal %idle intr/s
02:24:12 PM all 0.00 0.00 0.07 0.00 0.00 0.00 0.00 99.93 618.00
02:24:12 PM 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 0.00
02:24:12 PM 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 0.00
02:24:12 PM 2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 4294967288.00
02:24:12 PM 3 0.00 0.00 1.98 0.00 0.00 0.00 0.00 98.02 0.00
02:24:12 PM 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02:24:12 PM 5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 0.00
02:24:12 PM 6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 0.00
02:24:12 PM 7 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02:24:12 PM 8 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02:24:12 PM 9 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02:24:12 PM 10 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02:24:12 PM 11 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 0.00
用这个命令可以很方便的看到CPU各个核心之间负载是否均衡。
iostat
b20yang@ubuntu$ iostat 1
avg-cpu: %user %nice %system %iowait %steal %idle
0.00 0.00 0.00 0.00 0.00 100.00
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.00 0.00 0.00 0 0
sdb 0.00 0.00 0.00 0 0
iostat主要用来检查系统输入输出设备的使用状态,比如磁盘的tps等。如果我们在一个终端执行“dd bs=1014 count=1024k if=/dev/zero of=/tmp/tmp.bin”,同时在另外一个终端上面执行命令iostat 1,那么可以看到sda上面的kB_wrtn/s急剧上涨。
b20yang@ubuntu$ iostat 1
avg-cpu: %user %nice %system %iowait %steal %idle
0.51 0.00 0.00 95.96 0.00 3.54
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 73.00 4.00 73728.00 4 73728
vmstat
b20yang@ubuntu$ 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 613484 1236068 382688 750232 0 0 0 0 66 166 0 0 99 0 0
0 0 613484 1236068 382688 750232 0 0 0 0 64 178 0 0 100 0 0
0 0 613480 1236068 382688 750232 12 0 12 0 61 158 1 0 100 0 0
0 0 613480 1236068 382688 750232 0 0 0 0 52 126 0 1 100 0 0
vmstat主要用来检查系统内存,交换分区、磁盘块设备等状态。类似的,也可以看看命令“dd bs=1014 count=1024k if=/dev/zero of=/tmp/tmp.bin”是如何影响vmstat的。
b20yang@ubuntu$ 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
3 2 611476 1163584 389952 822688 0 0 5 16 1 1 0 0 99 0 0
0 1 611476 1078792 389956 907204 0 0 4 58816 268 352 1 1 25 73 0
1 3 611476 1006452 389964 979660 0 0 0 49240 227 267 2 9 15 75 0
1 2 611476 965156 389976 1020360 0 0 4 122084 215 293 1 4 0 95 0
1 1 611476 828852 389976 1153044 0 0 0 81920 293 414 0 1 17 82 0
0 1 611476 748700 389984 1230996 0 0 8 140064 245 276 2 7 31 60 0
0 2 611476 687552 389988 1289972 0 0 4 131072 190 271 1 7 10 82 0
0 2 611476 687392 389992 1290024 0 0 4 131072 120 8305 1 2 0 98 0
