Fork me on GitHub

Linux常用性能分析工具

前言

上周五公司搞了双十一“大促”,虽然时间紧凑,还是引起了团队上下高度重视,在有限的两天时间里,进行了充分的压测和性能分析,最终的结果也是不错的。对于性能分析工具,又做了一次熟悉的过程,这里结合网上优秀博文做了下整理。

性能监控,要看哪些

一张表搞定:

检测目标指标工具
cpuusr<=70%, sys<=35%, usr+sys<=70%top
memoryswap in (si) == 0,swap out (so) == 0; 可用空间>=30%;应用程序可用内存/系统物理内存 <= 70%vmstat 1;free; /proc/meminfo
ioiowait% < 20%sar; iostat -x;
networkudp:缓冲区不挤压, 无丢包 tcp:重传率netstat -lunp; netstat -su; /proc/net/snmp

良好状态指标:

  • cpu:

    • CPU利用率:User Time <= 70%,System Time <= 35%,User Time + System Time <= 70%
    • 上下文切换:与CPU利用率相关联,如果CPU利用率状态良好,大量的上下文切换也是可以接受的
    • 可运行队列:每个处理器的可运行队列<=3个线程
  • memory:swap in(si)==0,swap out(so)==0;应用程序可用内存/系统物理内存 <= 70%

  • io:iowait % < 20% ;提高命中率的一个简单方式就是增大文件缓存区面积,缓存区越大预存的页面就越多,命中率也越高。Linux 内核希望能尽可能产生次缺页中断(从文件缓存区读),并且能尽可能避免主缺页中断(从硬盘读),这样随着次缺页中断的增多,文件缓存区也逐步增大,直到系统只有少量可用物理内存的时候 Linux 才开始释放一些不用的页。
  • network:
    • 对于UDP,接收、发送缓冲区不长时间有等待处理的网络包
    • 对于TCP而言,不会出现因为缓存不足而存在丢包的事,因为网络等其他原因,导致丢了包,协议层也会通过重传机制来保证丢的包到达对方。所以,更多的专注重传率

监控工具

列举一些常用且实用的工具。

top命令

最常用的命令,每次压测第一使用率的命令。top命令可以实时监控系统运行状态,它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使用.内存使用和执行时间对任务进行排序。

命令格式:

top [参数]

命令参数:

-b 批处理
-c 显示完整的治命令
-I 忽略失效过程
-s 保密模式
-S 累积模式
-i<时间> 设置间隔时间
-u<用户名> 指定用户名
-p<进程号> 指定进程
-n<次数> 循环显示的次数

使用top命令后,可见如下交互信息:

top - 22:44:08 up 667 days,  4:15,  9 users,  load average: 4.07, 3.54, 3.30
Tasks: 406 total,   1 running, 405 sleeping,   0 stopped,   0 zombie
Cpu(s): 15.3%us,  0.7%sy,  0.0%ni, 84.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  32899876k total, 31996032k used,   903844k free,   337144k buffers
Swap: 15624188k total,  1577788k used, 14046400k free,  9132796k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                  
47210 staging   20   0 13.6g 743m 6224 S 5204  2.3  5128980h java                                                                                                     
35314 staging   20   0 16.6g 830m  11m S    4  2.6 243:11.07 java                                                                                                     
32098 staging   20   0 10.1g 524m 9208 S    4  1.6 664:05.61 java                                                                                                     
12789 staging   20   0 13.7g 635m  18m S    3  2.0  67:37.08 java                                                                                                     
 3198 staging   20   0 1193m  38m 5016 S    2  0.1   1942:19 PM2 v2.7.2: God                                                                                          
29642 staging   20   0 13.0g 416m 5348 S    2  1.3   1428:13 java                                                                                                     
21707 staging   20   0 13.4g 412m  11m S    2  1.3 110:47.28 java                                                                                                     
20115 staging   20   0 13.7g 614m  18m S    1  1.9  46:43.89 java                                                                                                     
43796 staging   20   0 16.6g 579m  11m S    1  1.8 102:33.21 java                                                                                                     
12320 staging   20   0 13.7g 653m  18m S    1  2.0  60:49.53 java                                                                                                     
24179 look      20   0 17596 1560  960 R    1  0.0   0:00.16 top                                                                                                      
31933 staging   20   0 11.1g 424m 9084 S    1  1.3 208:44.23 java                                                                                                     
33717 staging   20   0 1206m  49m 8824 S    1  0.2   3:45.91 node /data/web-                                                                                          
40163 staging   20   0 13.5g 534m  15m S    1  1.7  72:56.82 java                                                                                                     
 7974 staging   20   0 13.0g 435m 8804 S    1  1.4 259:16.18 java                                                                                                     
13487 staging   20   0 13.0g 413m 9084 S    1  1.3 188:53.99 java                                                                                                     
15855 root      20   0  9.9g 861m 1524 S    1  2.7   1544:16 java                                                                                                     
17886 staging   20   0 12.8g 239m 6396 S    1  0.7 692:52.16 java                                                                                                     
18725 staging   20   0 13.5g 519m  15m S    1  1.6  39:54.70 java                                                                                                     
27444 root      20   0 10.4g 503m 1280 S    1  1.6   2753:21 java                                                                                                     
31900 staging   20   0 8991m 422m 9156 S    1  1.3 136:25.31 java                                                                                                     
32034 staging   20   0 10.8g 461m 9376 S    1  1.4 152:14.69 java

上述信息很多,逐个解释。

第一行,任务队列信息,同 uptime 命令的执行结果

参数示例含义
22:44:08当前系统时间
up 667 days, 4:15已经运行667天4小时15分(未重启过)
9 users当前9个用户登录系统
load average: 4.07, 3.54, 3.30系统负载,后面三个参数分别是一分钟,五分钟和十五分钟;load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。

第二行,Tasks — 任务(进程):

参数示例含义
406 total总进程数,共有206个进程
1 running正在运行进程数,1个
405 sleeping休眠状态进程数,405个
0 stopped停止进程数,0个
0 zombie僵尸进程数(处于无响应状态),0个

第三行,cpu状态信息:

参数示例含义
15.3%us用户空间占用CPU的百分比
0.7%sy内核空间占用CPU的百分比
0.0%ni改变过优先级的进程占用CPU的百分比
84.0%id空闲CPU百分比
0.0%waIO等待占用CPU的百分比
0.0%hi硬中断(Hardware IRQ)占用CPU的百分比
0.0%si软中断(Software Interrupts)占用CPU的百分比
0.0%st在内存紧张环境下,pagein 强制对不同的页面进行的 steal 操作

第四行,cpu状态信息:

参数示例含义
32899876k total物理内存总量(32GB)
31996032k used使用中的内存总量(31GB)
903844k free空闲内存总量(903M)
337144k buffers缓存的内存量 (337M)

第五行,cpu状态信息:

参数示例含义
15624188k total交换区总量(15.6GB)
1577788k used使用的交换区总量(1.5GB)
14046400k free空闲交换区总量(14GB)
9132796k cached缓冲的交换区总量(9.1GB)

说明:

第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心。

如果出于习惯去计算可用内存数,这里有个近似的计算公式:第四行的free + 第四行的buffers + 第五行的cached,按这个公式此台服务器的可用内存:18537836k +169884k +3612636k = 22GB左右。

对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。

第六行。空行。

第七行,各进程(任务)的状态监控: PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
参数示例 | 含义 —|— PID | 进程id USER | 进程所有者 PR | 进程优先级 NI | nice值。负值表示高优先级,正值表示低优先级 VIRT | 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES RES | 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA SHR | 共享内存大小,单位kb S | 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程 %CPU | 上次更新到现在的CPU时间占用百分比 %MEM | 进程使用的物理内存百分比 TIME+ | 进程使用的CPU时间总计,单位1/100秒 COMMAND | 进程名称(命令名/命令行)

top命令下,常用交互操作:

  • h:显示帮助画面
  • 1:显示CPU信息。可监控每个逻辑CPU的状况。(%cpu的值是跟内核数成正比的,如8核cpu的%cpu最大可以800%。)
  • H:显示线程。
  • 排序。
    • Cpu : 在top交互界面按shift+pP
    • Mem :在top交互界面按shift+mM
    • Time :在top交互界面按shift+tT
  • 显示程序名。在top交互界面按c。
  • 监控进程下的线程。在命令行输入top -H -p pid,其中pid为进程id,进入界面后显示的PID为线程ID;或者使用命令top -H -p pid进入界面之后在按shift+h来显示线程。

vmstat

vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监控。不足之处是无法对某个进程进行深入分析。 vmstat工具提供了一种低开销的系统性能观察方式,适合在高负荷的服务器上控系统的健康情况。

命令格式:

vmstat [-a] [-n] [-S unit] [delay [ count]]
vmstat [-s] [-n] [-S unit]
vmstat [-m] [-n] [delay [ count]]
vmstat [-d] [-n] [delay [ count]]
vmstat [-p disk partition] [-n] [delay [ count]]
vmstat [-f]
vmstat [-V]

命令参数:

-a:显示活跃和非活跃内存
-f:显示从系统启动至今的fork数量 。
-m:显示slabinfo
-n:只在开始时显示一次各字段名称。
-s:显示内存相关统计信息及多种系统活动数量。
delay:刷新时间间隔。如果不指定,只显示一条结果。
count:刷新次数。如果不指定刷新次数,但指定了刷新时间间隔,这时刷新次数为无穷。
-d:显示磁盘相关统计信息。
-p:显示指定磁盘分区统计信息
-S:使用指定单位显示。参数有 k 、K 、m 、M ,分别代表1000、1024、1000000、1048576字节(byte)。默认单位为K(1024 bytes)
-V:显示vmstat版本信息。

使用示例,1秒输出一次,输出20次,单位为MB:

~$ vmstat 1 20 -S M
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 2  0   1540   1079    348   8715    0    0     0     6    0    0  5  0 94  0
18  0   1540   1078    348   8715    0    0     0    40 11476 16550 32  1 67  0
 1  0   1540   1078    348   8715    0    0     0     0 9431 16197 11  0 89  0
 0  0   1540   1079    348   8715    0    0     0   244 8325 15550  1  0 99  0
 6  0   1540   1079    348   8715    0    0     0     0 8770 15459  5  0 95  0
 0  0   1540   1080    348   8715    0    0     0   100 13954 20077 37  1 62  0
 0  0   1540   1080    348   8715    0    0     0    36 8661 16188  1  0 98  0
 2  0   1540   1080    348   8715    0    0     0     0 8708 16158  1  0 98  0
 1  0   1540   1081    348   8715    0    0     0    68 10946 16001 33  0 66  0
 1  0   1540   1080    348   8715    0    0     0     0 9380 17035  1  1 98  0
 0  0   1540   1080    348   8715    0    0     0   128 8447 15719  1  0 99  0
20  0   1540   1080    348   8715    0    0     0    44 10066 15924 15  1 84  0
 1  0   1540   1081    348   8715    0    0     0     0 11834 16701 41  1 59  0
 1  0   1540   1080    348   8715    0    0     0   144 8346 15732  1  1 98  1
 2  0   1540   1080    348   8715    0    0     0     0 8378 15545  1  0 98  0
 2  0   1540   1080    348   8715    0    0     0   120 16144 21775 36  1 63  0
 3  0   1540   1079    348   8715    0    0     0    60 8911 16162  3  1 97  0
 1  0   1540   1079    348   8715    0    0     0     0 8645 16013  1  1 99  0
 5  0   1540   1079    348   8715    0    0     0   272 9153 15929  6  1 92  1
 2  0   1540   1080    348   8715    0    0     0     0 12723 16598 52  1 48  0
  • procs

    • R 列表示运行和等待 CPU 时间片的进程数,这个值如果长期大于系统 CPU 个数,说明CPU 不足,需要增加 CPU。
    • B 列表示在等待资源的进程数,比如正在等待 I/O 或者内存交换等。
  • memory

    • swpd 列表示切换到内存交换区的内存大小(单位 KB),通俗讲就是虚拟内存的大小。如果 swap 值不为 0 或者比较大, 只要 si、so 的值长期为 0,这种情况一般属于正常情况
    • free 列表示当前空闲的物理内存(单位 KB) 。
    • buff 列表示 buffers cached 内存大小,也就是缓冲区大小,一般对块设备的读写才需要缓冲。
    • cache 列表示 page cached 的内存大小,也就是缓存大小,一般作为文件系统进行缓冲,频繁访问的文件都会被缓存,如果 cache 值非常大说明缓存文件比较多,如果此时 io中的 bi 比较小,说明文件系统效率比较好。
  • swap

    • si 列表示由磁盘调入内存,也就是内存进入内存交换区的内存大小。
    • so 列表示由内存进入磁盘,也就是有内存交换区进入内存的内存大小。 一般情况下,si、so 的值都为 0,如果 si、so 的值长期不为 0,则说明系统内存不足,需要增加系统内存。
  • io

    • bi 列表示由块设备读入数据的总量,即读磁盘,单位 kb/s。
    • bo 列表示写到块设备数据的总量,即写磁盘,单位 kb/s。 如果 bi+bo 值过大,且 wa 值较大,则表示系统磁盘 IO 瓶颈。
  • system

    • in 列表示某一时间间隔内观测到的每秒设备中断数。
    • cs 列表示每秒产生的上下文切换次数。 这 2 个值越大,则由内核消耗的 CPU 就越多。
  • cpu

    • us 列表示用户进程消耗的 CPU 时间百分比,us 值越高,说明用户进程消耗 cpu 时间越多,如果长期大于 50%,则需要考虑优化程序或者算法。
    • sy 列表示系统内核进程消耗的 CPU 时间百分比,一般来说 us+sy 应该小于 80%,如果大于 80%,说明可能处于 CPU 瓶颈。
    • id 列表示 CPU 处在空闲状态的时间百分比。
    • wa 列表示 IP 等待所占的 CPU 时间百分比,wa 值越高,说明 I/O 等待越严重,根据经验 wa 的参考值为 20%,如果超过 20%,说明 I/O 等待严重,引起 I/O 等待的原因可能是磁盘大量随机读写造成的, 也可能是磁盘或者此哦按监控器的贷款瓶颈 (主要是块操作)造成的。
字段含义
Procs(进程)r: 运行队列中进程数量;b: 等待IO的进程数量
Memory(内存)swpd: 使用虚拟内存大小;free: 可用内存大小;buff: 用作缓冲的内存大小;cache: 用作缓存的内存大小
Swapsi: 每秒从交换区写到内存的大小;so: 每秒写入交换区的内存大小
IO:(现在的Linux版本块的大小为1024bytes)bi: 每秒读取的块数; cs: 每秒上下文切换数
system(系统)in: 每秒中断数,包括时钟中断;cs: 每秒上下文切换数
CPU(以百分比表示)us: 用户进程执行时间(user time);sy: 系统进程执行时间(system time);id: 空闲时间(包括IO等待时间),中央处理器的空闲时间,以百分比表示;wa: 等待IO时间

备注: 如果r经常大于4,且id经常少于40,表示cpu的负荷很重。如果pi,po长期不等于0,表示内存不足。如果disk经常不等于0,且在 b中的队列大于3,表示io性能不好。

free

free命令可以显示Linux系统中空闲的、已用的物理内存及swap内存,及被内核使用的buffer。也是经典常用命令之一。

命令格式:

free [参数]

命令参数:

-b  以Byte为单位显示内存使用情况。 
-k  以KB为单位显示内存使用情况。 
-m  以MB为单位显示内存使用情况。
-g   以GB为单位显示内存使用情况。 
-o  不显示缓冲区调节列。 
-s<间隔秒数>  持续观察内存使用状况。 
-t  显示内存总和列。 
-V  显示版本信息。

使用实例:

chenruiwen@ubuntu$ free -m
             total       used       free     shared    buffers     cached
Mem:         32128      31103       1025          0        348       8739
-/+ buffers/cache:      22014      10114
Swap:        15257       1540      13717

字段解释:

  • Mem:物理内存大小。
  • total:总计物理内存的大小。
  • used:已使用多大。
  • free:可用有多少。
  • shared:多个进程共享的内存总额。
  • buffers:缓冲区内存总量。
  • cached:交换区缓冲区内存总量。
  • 第三行(-/+ buffers/cached):系统的物理内存真实使用量,可通过used-buffers-cached计算得到,因为buffers和cached也是占用物理内存得来,可以通过释放它们来获得这部分内存。
  • Swap:交换区总量,也叫虚拟内存。

第二行(Mem)的used/free与第三行(-/+ buffers/cache) used/free的区别:

这两个的区别在于使用的角度来看。

Mem行是从OS的角度来看,因为对于OS,buffers/cached 都是属于被使用,所以他的可用内存是1025MB,已用内存是31103MB,其中包括,内核(OS)使用 + Application(X,oracle,etc)使用的 + buffers + cached.

-/+ buffers/cache行是从应用程序角度来看,对于应用程序来说,buffers/cached是等于可用的,因为buffer/cached是为了提高文件读取的性能,当应用程序需在用到内存的时候,buffer/cached会很快地被回收。

例如本机的可用内存为: 22014MB(-/+ buffers/cache: used) = 1025MB(Mem:free) + 348MB(Mem:buffers) + 8739MB(Mem:cached)

cache 和 buffer的区别:

Cache:高速缓存,是位于CPU与主内存间的一种容量较小但速度很高的存储器。

由于CPU的速度远高于主内存,CPU直接从内存中存取数据要等待一定时间周期,Cache中保存着CPU刚用过或循环使用的一部分数据,当CPU再次使用该部分数据时可从Cache中直接调用,这样就减少了CPU的等待时间,提高了系统的效率。

Cache又分为一级Cache(L1 Cache)和二级Cache(L2 Cache),L1 Cache集成在CPU内部,L2 Cache早期一般是焊在主板上,现在也都集成在CPU内部,常见的容量有256KB或512KB L2 Cache。

Buffer:缓冲区,一个用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。 通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据时,速度快的设备的操作进程不发生间断。

Free中的buffer和cache:(它们都是占用内存)

buffer : 作为buffer cache的内存,是块设备的读写缓冲区 cache: 作为page cache的内存,文件系统的cache

如果 cache 的值很大,说明cache住的文件数很多。如果频繁访问到的文件都能被cache住,那么磁盘的读IO 必会非常小。

/proc/meminfo 文件

/proc/meminfo是了解Linux系统内存使用状况的主要接口,我们最常用的freevmstat等命令就是通过它获取数据的。此信息最为丰富,但是我个人使用不多。

使用示例如下,至于各参数的含义,还是留给Google吧:

~$ cat /proc/meminfo
MemTotal:       32899876 kB
MemFree:         4919948 kB
Buffers:           95612 kB
Cached:          1170384 kB
SwapCached:      1345120 kB
Active:         22391896 kB
Inactive:        4236700 kB
Active(anon):   21918324 kB
Inactive(anon):  3448892 kB
Active(file):     473572 kB
Inactive(file):   787808 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:      15624188 kB
SwapFree:        5905244 kB
Dirty:              7212 kB
Writeback:             0 kB
AnonPages:      24023988 kB
Mapped:            33772 kB
Shmem:              4408 kB
Slab:             764240 kB
SReclaimable:     598480 kB
SUnreclaim:       165760 kB
KernelStack:       70024 kB
PageTables:       125652 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    32074124 kB
Committed_AS:   52714036 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      342184 kB
VmallocChunk:   34342341604 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:      271296 kB
DirectMap2M:    25896960 kB
DirectMap1G:     7340032 kB

sar

sar(System ActivityReporter系统活动情况报告)是目前Linux上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存使用状况、进程活动及IPC有关的活动等,sar命令由sysstat安装包安装。

sar安装直接yum install -y sysstat,然后先执行sar -o 2 3,来生成所需文件,之后使用就正常啦。

命令格式:

sar [选项] [<时间间隔> [<次数>]]

命令参数:

-A:所有报告的总和
-b:显示I/O和传递速率的统计信息
-B:显示换页状态
-d:输出每一块磁盘的使用信息
-e:设置显示报告的结束时间
-f:从制定的文件读取报告
-i:设置状态信息刷新的间隔时间
-P:报告每个CPU的状态
-R:显示内存状态
–u:输出cpu使用情况和统计信息
–v:显示索引节点、文件和其他内核表的状态
-w:显示交换分区的状态
-x:显示给定进程的装
-r:报告内存利用率的统计信息

sar监控CPU

使用示例,输出cpu使用情况和统计信息,每2秒输出一次,输出10次:

~$ sar -u 2 10
Linux 3.2.0-23-generic (localhost)   2018年11月12日  _x86_64_        (24 CPU)

13时43分03秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
13时43分05秒     all      2.23      0.02      0.93      0.15      0.00     96.67
13时43分07秒     all      1.54      0.00      0.65      0.11      0.00     97.71
13时43分09秒     all      0.99      0.00      0.65      1.12      0.00     97.24
13时43分11秒     all      2.02      0.02      0.92      0.13      0.00     96.91
13时43分13秒     all      1.39      0.00      0.63      0.44      0.00     97.53
13时43分15秒     all      1.85      0.02      1.01      0.06      0.00     97.06
13时43分17秒     all      2.11      0.00      0.70      0.02      0.00     97.17
13时43分19秒     all      1.37      0.00      0.51      0.72      0.00     97.41
13时43分21秒     all      1.62      0.02      0.93      0.06      0.00     97.37
13时43分23秒     all      1.39      0.00      0.59      0.27      0.00     97.75
Average:        all      1.65      0.01      0.75      0.31      0.00     97.28

参数说明:

  • %usr:用户进程消耗的 CPU 时间百分比
  • %nice: 运行正常进程消耗的 CPU 时间百分比
  • %system:系统进程消耗的 CPU 时间百分比
  • %iowait:I/O 等待所占 CPU 时间百分比
  • %steal:在内存紧张环境下,pagein强制对不同的页面进行的steal操作。虚拟服务占用的CPU时间百分比,这个值一般为0.
  • %idle:CPU 空闲状态的时间百分比

在所有的显示中,我们应主要注意%iowait%idle

%iowait 的值过高,表示硬盘存在I/O瓶颈, %idle值高,表示 CPU 较空闲,如果%idle 值高但系统响应慢时,有可能是 CPU 等待分配内存, 此时应加大内存容量。

%idle 值如果持续低于 10,那么系统的CPU处理能力相对较低,表明系统中最需要解决的资源是CPU。

sar监控内存

使用示例,显示内存使用信息

~$ sar -r 2 3
Linux 3.2.0-23-generic (localhost)   2018年11月12日  _x86_64_        (24 CPU)

14时04分38秒 kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact
14时04分40秒   4984120  27915756     84.85    104060   1157104  52363184    107.91  22343076   4227168
14时04分42秒   4983772  27916104     84.85    104060   1157416  52363184    107.91  22343080   4227344
14时04分44秒   4983516  27916360     84.85    104072   1157584  52363184    107.91  22343148   4227532
Average:      4983803  27916073     84.85    104064   1157368  52363184    107.91  22343101   4227348
  • 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 -B 2 3
Linux 3.2.0-23-generic (localhost)   2018年11月12日  _x86_64_        (24 CPU)

14时17分35秒  pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s pgscank/s pgscand/s pgsteal/s    %vmeff
14时17分37秒      0.00     16.00    135.00      0.00    395.50      0.00      0.00      0.00      0.00
14时17分39秒      0.00    168.00     26.00      0.00    435.00      0.00      0.00      0.00      0.00
14时17分41秒      0.00   1142.00    517.50      0.00    679.50      0.00      0.00      0.00      0.00
Average:         0.00    442.00    226.17      0.00    503.33      0.00      0.00      0.00      0.00
  • pgpgin/s:表示每秒从磁盘或 SWAP 置换到内存的字节数(KB)。
  • pgpgout/s:表示每秒从内存置换到磁盘或 SWAP 的字节数(KB)。
  • fault/s:每秒钟系统产生的缺页数,即主缺页与次缺页之和(major + minor)。
  • majflt/s:每秒钟产生的主缺页数。

使用示例,显示系统虚拟内存分页状态

$ sar -W 2 3
Linux 3.2.0-23-generic (localhost)   2018年11月12日  _x86_64_        (24 CPU)

17时08分41秒  pswpin/s pswpout/s
17时08分43秒      0.00      0.00
17时08分45秒      0.00      0.00
17时08分47秒      0.00      0.00
Average:         0.00      0.00
  • pswpin/s:每秒系统换入的交换页面(swap page)数量。
  • pswpout/s:每秒系统换出的交换页面(swap page)数量。

sar监控负载

使用示例,查看平均负载

~$ sar -q 2 3
Linux 3.2.0-23-generic (localhost)   2018年11月12日  _x86_64_        (24 CPU)

21时36分24秒   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15   blocked
21时36分26秒         1      8321      0.92      0.71      0.72         0
21时36分28秒         0      8321      0.92      0.71      0.72         0
21时36分30秒         1      8322      0.92      0.71      0.72         0
Average:            1      8321      0.92      0.71      0.72         0
  • unq-sz:运行队列的长度(等待运行的进程数)
  • plist-sz:进程列表中进程(processes)和线程(threads)的数量
  • ldavg-1:最后1分钟的系统平均负载
  • ldavg-5:过去5分钟的系统平均负载
  • ldavg-15:过去15分钟的系统平均负载

sar监控I/O

使用示例,显示缓冲区使用情况:

~$ sar -b 2 3
Linux 3.2.0-23-generic (localhost)   2018年11月12日  _x86_64_        (24 CPU)

21时40分00秒       tps      rtps      wtps   bread/s   bwrtn/s
21时40分02秒     18.50      0.00     18.50      0.00    288.00
21时40分04秒     15.50      0.00     15.50      0.00    240.00
21时40分06秒      5.50      0.00      5.50      0.00     44.00
Average:        13.17      0.00     13.17      0.00    190.67
  • tps:每秒钟物理设备的 I/O 传输总量。
  • rtps:每秒钟从物理设备读入的数据总量。
  • wtps:每秒钟向物理设备写入的数据总量。
  • bread/s:每秒钟从物理设备读入的数据量,单位为 块/s。
  • bwrtn/s:每秒钟向物理设备写入的数据量,单位为 块/s。

使用示例,监控设备使用情况:

~$ sar -d 2 3
Linux 3.2.0-23-generic (localhost)   2018年11月12日  _x86_64_        (24 CPU)

21时50分47秒       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
21时50分49秒    dev8-0     17.50      0.00    868.00     49.60      0.71     40.57      6.17     10.80

21时50分49秒       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
21时50分51秒    dev8-0      5.00      0.00     40.00      8.00      0.02      3.60      3.60      1.80

21时50分51秒       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
21时50分53秒    dev8-0     53.50      0.00    800.00     14.95      4.70     87.89      3.03     16.20

Average:          DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
Average:       dev8-0     25.33      0.00    569.33     22.47      1.81     71.45      3.79      9.60
  • tps:每秒从物理磁盘 I/O 的次数.多个逻辑请求会被合并为一个 I/O 磁盘请求,一次传输的大小是不确定的。
  • rd_sec/s:每秒读扇区的次数。
  • wr_sec/s:每秒写扇区的次数。
  • avgrq-sz:平均每次设备 I/O 操作的数据大小(扇区)。
  • avgqu-sz:磁盘请求队列的平均长度。
  • await:从请求磁盘操作到系统完成处理,每次请求的平均消耗时间,包括请求队列等待时间,单位是毫秒(1 秒=1000 毫秒)。
  • svctm:系统处理每次请求的平均时间,不包括在请求队列中消耗的时间。
  • %util:I/O 请求占 CPU 的百分比,比率越大,说明越饱和。
  • avgqu-sz 的值较低时,设备的利用率较高。 当%util 的值接近 1% 时,表示设备带宽已经占满。
  • await-svctm=io等待时间。

sar总结

sar可监控的太多了,这里做个总结。

  • 要判断系统瓶颈问题,有时需几个 sar 命令选项结合起来
  • 怀疑 CPU 存在瓶颈,可用 sar -u 和 sar -q 等来查看
  • 怀疑内存存在瓶颈,可用 sar -B、sar -r 和 sar -W 等来查看
  • 怀疑 I/O 存在瓶颈,可用 sar -b、sar -u 和 sar -d 等来查看

iostat

iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。同vmstat一样,iostat也有一个弱点,就是它不能对某个进程进行深入分析,仅对系统的整体情况进行分析。iostat属于sysstat软件包。可以用yum install sysstat 直接安装。

命令格式:

 iostat[参数][时间][次数]

命令参数:

 -C 显示CPU使用情况
-d 显示磁盘使用情况
-k 以 KB 为单位显示
-m 以 M 为单位显示
-N 显示磁盘阵列(LVM) 信息
-n 显示NFS 使用情况
-p[磁盘] 显示磁盘和分区的情况
-t 显示终端和CPU的信息
-x 显示详细信息
-V 显示版本信息

显示所有磁盘分区的情况

~$ iostat -x
Linux 3.2.0-23-generic (localhost)   2018年11月12日  _x86_64_        (24 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           2.56    0.01    2.38    0.17    0.00   94.88

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.10     6.61    0.61    8.95     6.79   169.04    36.80     0.04    4.44   10.29    4.04   3.64   3.47

参数说明:

  • rrqm/s:每秒进行 merge 的读操作数目,即 delta(rmerge)/s 。
    • wrqm/s:每秒进行 merge 的写操作数目,即 delta(wmerge)/s 。
    • r/s:每秒完成的读 I/O 设备次数,即 delta(rio)/s 。
    • w/s: 每秒完成的写 I/O 设备次数,即 delta(wio)/s 。
    • rsec/s:每秒读扇区数,即 delta(rsect)/s。
    • wsec/s:每秒写扇区数,即 delta(wsect)/s
    • rkB/s:每秒读 K 字节数,是 rsect/s 的一半,因为每扇区大小为 512 字节。
    • wkB/s:每秒写 K 字节数,是 wsect/s 的一半
    • avgrq-sz:平均每次设备 I/O 操作的数据大小 (扇区),即 delta(rsect+wsect)/delta(rio+wio) 。
    • avgqu-sz:平均 I/O 队列长度,即 delta(aveq)/s/1000 (因为 aveq 的单位为毫秒)。
    • Await: 平均每次设备 I/O 操作的等待时间 (毫秒), 即 delta(ruse+wuse)/delta(rio+wio) 。
    • Svctm:平均每次设备 I/O 操作的服务时间 (毫秒),即delta(use)/delta(rio+wio)
    • %util:一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的,即 delta(use)/s/1000 (因为 use 的单位为毫秒) 。

显示所有设备负载情况

 ~$ iostat
Linux 3.2.0-23-generic (localhost)   2018年11月12日  _x86_64_        (24 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           2.56    0.01    2.38    0.17    0.00   94.88

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               9.55         6.79       169.04  391806012 9758159776

参数说明:

  • %user:CPU处在用户模式下的时间百分比。
  • %nice:CPU处在带NICE值的用户模式下的时间百分比。
  • %system:CPU处在系统模式下的时间百分比。
  • %iowait:CPU等待输入输出完成时间的百分比。
  • %steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。
  • %idle:CPU空闲时间百分比。

    :如果%iowait的值过高,表示硬盘存在I/O瓶颈,%idle值高,表示CPU较空闲,如果%idle值高但系统响应慢时,有可能是CPU等待分配内存,此时应加大内存容量。%idle值如果持续低于10,那么系统的CPU处理能力相对较低,表明系统中最需要解决的资源是CPU。

  • tps:每秒从物理磁盘 I/O 的次数.多个逻辑请求会被合并为一个 I/O 磁盘请求,一次传输的大小是不确定的。磁盘的一次读或者写都是一次 I/O 操作

  • Blk_read/s:每秒读取的数据块数。
  • Blk_wrtn/s :每秒写入的数据块数。
  • Blk_read:读取的所有块数。
  • Blk_wrtn :写入的所有块数。

netstat

netstat命令用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接,TCP和UDP监听,进程内存管理的相关报告。

如果你的计算机有时候接收到的数据报导致出错数据或故障,你不必感到奇怪,TCP/IP可以容许这些类型的错误,并能够自动重发数据报。但如果累计的出错情况数目占到所接收的IP数据报相当大的百分比,或者它的数目正迅速增加,那么你就应该使用netstat查一查为什么会出现这些情况了。

命令格式:

netstat [-acCeFghilMnNoprstuvVwx][-A<网络类型>][--ip]

命令参数:

-a或–all 显示所有连线中的Socket。
-A<网络类型>或–<网络类型> 列出该网络类型连线中的相关地址。
-c或–continuous 持续列出网络状态。
-C或–cache 显示路由器配置的快取信息。
-e或–extend 显示网络其他相关信息。
-F或–fib 显示FIB。
-g或–groups 显示多重广播功能群组组员名单。
-h或–help 在线帮助。
-i或–interfaces 显示网络界面信息表单。
-l或–listening 显示监控中的服务器的Socket。
-M或–masquerade 显示伪装的网络连线。
-n或–numeric 直接使用IP地址,而不通过域名服务器。
-N或–netlink或–symbolic 显示网络硬件外围设备的符号连接名称。
-o或–timers 显示计时器。
-p或–programs 显示正在使用Socket的程序识别码和程序名称。
-r或–route 显示Routing Table。
-s或–statistice 显示网络工作信息统计表。
-t或–tcp 显示TCP传输协议的连线状况。
-u或–udp 显示UDP传输协议的连线状况。
-v或–verbose 显示指令执行过程。
-V或–version 显示版本信息。
-w或–raw 显示RAW传输协议的连线状况。
-x或–unix 此参数的效果和指定”-A unix”参数相同。
–ip或–inet 此参数的效果和指定”-A inet”参数相同。

常用的有两个:netstat -plntnetstat -i.

~$ netstat -i
Kernel Interface table
Iface   MTU Met   RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eth1       1500 0  26920306700      0 26842853 0      23410550297      0      0      0 BMRU
lo        16436 0  9819751923      0      0 0      9819751923      0      0      0 LRU

字段说明:

  • Iface:表示网络设备的接口名称。
  • MTU:表示最大传输单元,单位为字节。
  • RX-OK/TX-OK:表示已经准确无误地接收/发送了多少数据包。
  • RX-ERR/TX-ERR:表示接收/发送数据包时候产生了多少错误。
  • RX-DRP/TX-DRP:表示接收/发送数据包时候丢弃了多少数据包。
  • RX-OVR/TX-OVR:表示由于误差而丢失了多少数据包。
  • Flg 表示接口标记,其中
    • B 已经设置了一个广播地址。
    • L 该接口是一个回送设备。
    • M 接收所有数据包(混乱模式) 。
    • N 避免跟踪。
    • O 在该接口上,禁用 AR P。
    • P 这是一个点到点链接。
    • R 接口正在运行。
    • U 接口处于“活动”状态。
  • 其中 RX-ERR/TX-ERR、 RX-DRP/TX-DRP 和 RX-OVR/TX-OVR 的值应该都为 0,如果不为 0,并且很大,那么网络质量肯定有问题,网络传输性能也一代会下降。
$  netstat -plnt
(No info could be read for "-p": geteuid()=1000 but you should be root.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:2281            0.0.0.0:*               LISTEN      -               
tcp        0      0 0.0.0.0:18889           0.0.0.0:*               LISTEN      -               
tcp        0      0 0.0.0.0:27017           0.0.0.0:*               LISTEN      -               
tcp        0      0 0.0.0.0:30090           0.0.0.0:*               LISTEN      -               
tcp        0      0 10.0.0.114:22122        0.0.0.0:*               LISTEN      -               
tcp        0      0 10.0.0.114:22123        0.0.0.0:*               LISTEN      -               
tcp        0      0 0.0.0.0:1099            0.0.0.0:*               LISTEN      -               
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      -               
tcp        0      0 0.0.0.0:9100            0.0.0.0:*               LISTEN      -               
tcp        0      0 0.0.0.0:30060           0.0.0.0:*               LISTEN      -               
tcp        0      0 0.0.0.0:6380            0.0.0.0:*               LISTEN      -               
tcp        0      0 0.0.0.0:48781           0.0.0.0:*               LISTEN      -       

字段说明:

  • Proto :协议
  • Recv-Q:表示接收队列。
  • Send-Q :表示发送队列。
  • LocalAddress :表示本地机器名、端口
  • Foreign Address :表示远程机器名、端口
  • State:表示状态,其中:
    • LISTEN :在监听状态中。
    • ESTABLISHED:已建立联机的联机情况。
    • TIME_WAIT:该联机在目前已经是等待的状态。
  • PID/Program name:进程id/进程名

总结

Linux的性能分析工具非常多,这里只是总结了冰山一角,也是参考了很多优秀的博文:

-------------本文结束,感谢您的阅读-------------
贵在坚持,如果您觉得本文还不错,不妨打赏一下~
0%