linux系统瓶颈诊断及分析

2018-10-30  本文已影响123人  南风nanfeng

vmstat

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。相比top,我可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样)。
一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数,如:

[root@nubia ~]# vmstat 2 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 27852344 263200 22400860    0    0     0    61    0    0  1  0 99  0  0

2表示每两秒采集一次服务器状态,1表示只采集一次。
实际上,在应用过程中,我们会在一段时间内一直监控,不想监控直接结束vmstat就行了,例如:

[root@nubia ~]# vmstat 2
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 27861840 263024 22397432    0    0     0    61    0    0  1  0 99  0  0    
 0  0      0 27862404 263024 22397456    0    0     0     7 1552 1916  0  0 100  0  0   
 0  0      0 27861416 263024 22397472    0    0     0    44 1371 1544  0  0 100  0  0   

令介绍完毕,现在开始实战讲解每个参数的意思。

mpstat

mpstat是 Multiprocessor Statistics的缩写,是实时系统监控工具。其报告与CPU的一些统计信息,这些信息存放在/proc/stat文件中。在多CPU系统里,其不但能查看所有CPU的平均状况信息,而且能够查看特定CPU的信息。检查CPU使用率是否均衡。
mpstat的语法如下:

mpstat [-P {cpu|ALL}] [internal [count]]

#  mpstat -P ALL 1 5 

pidstat

pidstat主要用于监控全部或指定进程占用系统资源的情况,如CPU,内存、设备IO、任务切换、线程等。pidstat首次运行时显示自系统启动开始的各项统计信息,之后运行pidstat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。

命令形式为”pidstat [option] interval [count]”

[root@nubia ~]# pidstat -r -p 53689 2
Linux 2.6.32-431.el6.x86_64 (test)  2018年06月14日     _x86_64_    (32 CPU)

15时00分33秒       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
15时00分35秒     53689      0.00      0.00 21372504 2930436   4.45  java
15时00分37秒     53689      0.00      0.00 21372504 2930436   4.45  java
15时00分39秒     53689      0.00      0.00 21372504 2930436   4.45  java
15时00分41秒     53689      0.00      0.00 21372504 2930436   4.45  java
15时00分43秒     53689      0.00      0.00 21372504 2930436   4.45  java

以上各列输出的含义如下:

minflt/s: 每秒次缺页错误次数(minor page faults),次缺页错误次数意即虚拟内存地址映射成物理内存地址产生的page fault次数
majflt/s: 每秒主缺页错误次数(major page faults),当虚拟内存地址映射成物理内存地址时,相应的page在swap中,这样的page fault为major page fault,一般在内存使用紧张时产生
VSZ:      该进程使用的虚拟内存(以kB为单位)
RSS:      该进程使用的物理内存(以kB为单位)
%MEM:     该进程使用内存的百分比
Command:  拉起进程对应的命令
[root@nubia ~]# pidstat -d -p 53689 2
Linux 2.6.32-431.el6.x86_64 (test)  2018年06月14日     _x86_64_    (32 CPU)

15时04分29秒       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
15时04分31秒     53689      0.00      0.00      0.00  java
15时04分33秒     53689      0.00      0.00      0.00  java
15时04分35秒     53689      0.00      0.00      0.00  java
15时04分37秒     53689      0.00      0.00      0.00  java

输出信息的含义:

kB_rd/s: 每秒进程从磁盘读取的数据量(以kB为单位)
kB_wr/s: 每秒进程向磁盘写的数据量(以kB为单位)
Command: 拉起进程对应的命令
-u:默认的参数,显示各个进程的cpu使用统计
-r:显示各个进程的内存使用统计
-d:显示各个进程的IO使用情况
-p:指定进程号
-w:显示每个进程的上下文切换情况
-t:显示选择任务的线程的统计信息外的额外信息
-T { TASK | CHILD | ALL }
这个选项指定了pidstat监控的。TASK表示报告独立的task,CHILD关键字表示报告进程下所有线程统计信息。ALL表示报告独立的task和task下面的所有线程。
注意:task和子线程的全局的统计信息和pidstat选项无关。这些统计信息不会对应到当前的统计间隔,这些统计信息只有在子线程kill或者完成的时候才会被收集。
-V:版本号
-h:在一行上显示了所有活动,这样其他程序可以容易解析。
-I:在SMP环境,表示任务的CPU使用率/内核数量
-l:显示命令名和所有参数

iostat

Linux系统中通过iostat我们能查看到系统IO状态信息,从而确定IO性能是否存在瓶颈。
常用参数:

iostat -d -k 1 10        #查看TPS和吞吐量信息
iostat -d -x -k 1 10      #查看设备使  用率(%util)、响应时间(await)
iostat -c 1 10            #查看cpu状态

[root@nubia ~]# iostat -xz 1
Linux 2.6.32-431.el6.x86_64 (localhost)     2018年06月14日     _x86_64_    (32 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.54    0.00    0.08    0.01    0.00   99.38

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sdb               0.00     0.00    0.00    0.00     0.00     0.00     8.83     0.00    1.08   1.08   0.00
sda               0.02   384.88    0.12  103.97    13.22  3910.76    37.70     0.39    3.79   0.05   0.52
dm-0              0.00     0.00    0.14  488.74    13.18  3909.89     8.02     0.01    2.30   0.01   0.52
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     8.00     0.00    0.78   0.76   0.00
dm-2              0.00     0.00    0.00    0.11     0.03     0.87     8.00     0.00    1.05   0.74   0.01

列输出含义:

rrqm/s : 每秒合并读操作的次数
wrqm/s: 每秒合并写操作的次数
r/s :每秒读操作的次数
w/s : 每秒写操作的次数
rMB/s :每秒读取的MB字节数
wMB/s: 每秒写入的MB字节数
avgrq-sz:每个IO的平均扇区数,即所有请求的平均大小,以扇区(512字节)为单位
avgqu-sz:平均为完成的IO请求数量,即平均意义山的请求队列长度
await:平均每个IO所需要的时间,包括在队列等待的时间,也包括磁盘控制器处理本次请求的有效时间。
r_wait:每个读操作平均所需要的时间,不仅包括硬盘设备读操作的时间,也包括在内核队列中的时间。
w_wait: 每个写操平均所需要的时间,不仅包括硬盘设备写操作的时间,也包括在队列中等待的时间。
svctm: 表面看是每个IO请求的服务时间,不包括等待时间,但是实际上,这个指标已经废弃。实际上,iostat工具没有任何一输出项表示的是硬盘设备平均每次IO的时间。
%util: 工作时间或者繁忙时间占总时间的百分比

我们搞4K的随机IO,但是iodepth=1 ,查看下fio的指令和iostat的输出:

fio --name=randwrite --rw=randwrite --bs=4k --size=20G --runtime=1200 --ioengine=libaio --iodepth=1 --numjobs=1 --filename=/dev/sdc --direct=1 --group_reporting

同样是4K的随机IO,我们设置iodepth=16, 查看fio的指令和iostat的输出:

fio --name=randwrite --rw=randwrite --bs=4k --size=20G --runtime=1200 --ioengine=libaio --iodepth=16 --numjobs=1 --filename=/dev/sdc --direct=1 --group_reporting 

注意,内核中有I/O Scheduler队列。我们看到因为avgqu-sz大小不一样,所以一个IO时间(await)就不一样。就好像你在超时排队,有一队没有人,而另一队队伍长度达到16 ,那么很明显,队伍长队为16的更繁忙一些。
参考自:https://blog.csdn.net/shaochenshuo/article/details/76212566

free

[root@nubia ~]# free -mg
             total       used       free     shared    buffers     cached
Mem:            62         35         27          0          0         20
-/+ buffers/cache:         14         48
Swap:           31          0         31

Mem:表示物理内存统计
-/+ buffers/cached:表示物理内存的缓存统计
Swap:表示硬盘上交换分区的使用情况
系统的总物理内存:62G,但系统当前真正可用的内存并不是第一行free 标记的 27G,它仅代表未被分配的内存。
我们使用total1、used1、free1、used2、free2 等名称来代表上面统计数据的各值,1、2 分别代表第一行和第二行的数据。
total1: 表示物理内存总量。
used1: 表示总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用。
free1: 未被分配的内存。
shared1: 共享内存,一般系统不会用到,这里也不讨论。
buffers1: 系统分配但未被使用的buffers 数量。
cached1: 系统分配但未被使用的cache 数量。buffer 与cache 的区别见后面。
used2: 实际使用的buffers 与cache 总量,也是实际使用的内存总量。
free2: 未被使用的buffers 与cache 和未被分配的内存之和,这就是系统当前实际可用内存。
可以整理出如下等式:
total1 = used1 + free1
total1 = used2 + free2
used1 = buffers1 + cached1 + used2
free2 = buffers1 + cached1 + free1
buffer 与cache 的区别
A buffer is something that has yet to be "written" to disk.
A cache is something that has been "read" from the disk and stored for later use.

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 bi会非常小。

Buffer和Cache的区别
缓存(cached)是把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就不要去读硬盘了,若没有命中就读硬盘。其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把不再读的内容不断往后排,直至从中删除。
缓冲(buffers)是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。linux有一个守护进程定 期清空缓冲内容(即写如磁盘),也可以通过sync命令手动清空缓冲。举个例子吧:我这里有一个ext2的U盘,我往里面cp一个3M的MP3,但U盘的 灯没有跳动,过了一会儿(或者手动输入sync)U盘的灯就跳动起来了。卸载设备时会清空缓冲,所以有些时候卸载一个设备时要等上几秒钟。

两者都是RAM中的数据。简单来说,buffer是即将要被写入磁盘的,而cache是被从磁盘中读出来的。
buffer是由各种进程分配的,被用在如输入队列等方面,一个简单的例子如某个进程要求有多个字段读入,在所有字段被读入完整之前,进程把先前读入的字段放在buffer中保存。
cache经常被用在磁盘的I/O请求上,如果有多个进程都要访问某个文件,于是该文件便被做成cache以方便下次被访问,这样可提供系统性能。

sar

检查网络吞吐量
网络统计(-n)
使用-n选项可以对网络使用情况进行显示,-n后接关键词”DEV”可显示eth0、eth1等网卡的信息: 
[root@nubia ~]# sar -n DEV 1
Linux 2.6.32-431.el6.x86_64 (localhost)     2018年06月14日     _x86_64_    (32 CPU)

15时59分10秒     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
15时59分11秒        lo    211.00    211.00    113.83    113.83      0.00      0.00      0.00
15时59分11秒       em1     47.00      3.00      3.80      0.42      0.00      0.00      4.00
15时59分11秒       em2     46.00     27.00     12.59      4.01      0.00      0.00      1.00
15时59分11秒       em3      0.00      0.00      0.00      0.00      0.00      0.00      0.00
15时59分11秒       em4      0.00      0.00      0.00      0.00      0.00      0.00      0.00

[root@nubia ~]# sar -n TCP,ETCP 1
Linux 2.6.32-431.el6.x86_64 (localhost)     2018年06月14日     _x86_64_    (32 CPU)

16时00分29秒  active/s passive/s    iseg/s    oseg/s
16时00分30秒     15.31     15.31    694.90    677.55

16时00分29秒  atmptf/s  estres/s retrans/s isegerr/s   orsts/s
16时00分30秒      0.00      0.00     35.71      0.00      0.00

16时00分30秒  active/s passive/s    iseg/s    oseg/s
16时00分31秒     11.00     11.00    371.00    363.00

16时00分30秒  atmptf/s  estres/s retrans/s isegerr/s   orsts/s
16时00分31秒      0.00      0.00     35.00      0.00      0.00

sar -n SOCK 1 1  #统计socket连接信息
sar -n TCP 1 3 #TCP连接的统计

sar -n 使用总结

-n DEV : 网络接口统计信息。
-n EDEV : 网络接口错误。
-n IP : IP数据报统计信息。
-n EIP : IP错误统计信息。
-n TCP : TCP统计信息。
-n ETCP : TCP错误统计信息。
-n SOCK : 套接字使用。

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

上一篇 下一篇

猜你喜欢

热点阅读