当前位置:首页 > 北京头条 > 北京经验

linux系统瓶颈诊断及分析

2019-07-11 13:30:13 来源:163健康
浏览量:

vmstat

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

[root@nubia ~]# vmstat 2 1procs -----------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 2procs -----------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   

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

  • r : 表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。

  • b: 表示阻塞的进程,这个不多说,进程阻塞,大家懂的。

  • swpd: 虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。

  • free: 空闲的物理内存的大小。

  • buff: Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存。

  • cache: 直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)

  • si: 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。

  • so: 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。

  • bi: 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒

  • bo: 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。

  • in: 每秒CPU的中断次数,包括时间中断

  • cs: 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。

  • us: 用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。

  • sy: 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。

  • id: 空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。

  • wt: 等待IO CPU时间。

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]”

  • cpu使用情况统计(-u)

  • 使用-u选项,pidstat将显示各活动进程的cpu使用统计,执行”pidstat -u”与单独执行”pidstat”的效果一样。

  • 内存使用情况统计(-r)使用-r选项,pidstat将显示各活动进程的内存使用统计:

[root@nubia ~]# pidstat -r -p 53689 2Linux 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  Command15时00分35秒     53689      0.00      0.00 21372504 2930436   4.45  java15时00分37秒     53689      0.00      0.00 21372504 2930436   4.45  java15时00分39秒     53689      0.00      0.00 21372504 2930436   4.45  java15时00分41秒     53689      0.00      0.00 21372504 2930436   4.45  java15时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:  拉起进程对应的命令
  • IO情况统计(-d)
[root@nubia ~]# pidstat -d -p 53689 2Linux 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  Command15时04分31秒     53689      0.00      0.00      0.00  java15时04分33秒     53689      0.00      0.00      0.00  java15时04分35秒     53689      0.00      0.00      0.00  java15时04分37秒     53689      0.00      0.00      0.00  java

输出信息的含义:

kB_rd/s: 每秒进程从磁盘读取的数据量(以kB为单位)kB_wr/s: 每秒进程向磁盘写的数据量(以kB为单位)Command: 拉起进程对应的命令
  • 针对特定进程统计(-p)

  • 常用参数如下:

-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 1Linux 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.38Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %utilsdb               0.00     0.00    0.00    0.00     0.00     0.00     8.83     0.00    1.08   1.08   0.00sda               0.02   384.88    0.12  103.97    13.22  3910.76    37.70     0.39    3.79   0.05   0.52dm-0              0.00     0.00    0.14  488.74    13.18  3909.89     8.02     0.01    2.30   0.01   0.52dm-1              0.00     0.00    0.00    0.00     0.00     0.00     8.00     0.00    0.78   0.76   0.00dm-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: 工作时间或者繁忙时间占总时间的百分比
  • avgqu-sz 和繁忙程度首先我们用超市购物来比对iostat的输出。我们在超市结账的时候,一般会有很多队可以排,队列的长度,在一定程度上反应了该收银柜台的繁忙程度。那么这个变量是avgqu-sz这个输出反应的,该值越大,表示排队等待处理的io越多。

我们搞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的更繁忙一些。参考自:http://blog.csdn.net/shaochenshuo/article/details/76212566

free

[root@nubia ~]# free -mg             total       used       free     shared    buffers     cachedMem:            62         35         27          0          0         20-/+ buffers/cache:         14         48Swap:           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 + free1total1 = used2 + free2used1 = buffers1 + cached1 + used2free2 = buffers1 + cached1 + free1buffer 与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 1Linux 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/s15时59分11秒        lo    211.00    211.00    113.83    113.83      0.00      0.00      0.0015时59分11秒       em1     47.00      3.00      3.80      0.42      0.00      0.00      4.0015时59分11秒       em2     46.00     27.00     12.59      4.01      0.00      0.00      1.0015时59分11秒       em3      0.00      0.00      0.00      0.00      0.00      0.00      0.0015时59分11秒       em4      0.00      0.00      0.00      0.00      0.00      0.00      0.00[root@nubia ~]# sar -n TCP,ETCP 1Linux 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/s16时00分30秒     15.31     15.31    694.90    677.5516时00分29秒  atmptf/s  estres/s retrans/s isegerr/s   orsts/s16时00分30秒      0.00      0.00     35.71      0.00      0.0016时00分30秒  active/s passive/s    iseg/s    oseg/s16时00分31秒     11.00     11.00    371.00    363.0016时00分30秒  atmptf/s  estres/s retrans/s isegerr/s   orsts/s16时00分31秒      0.00      0.00     35.00      0.00      0.00sar -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等来查看