Linux下的监控工具丰富繁杂,如果只知道top、free之类的就太少了,而且也不能胜任日常的Linux管理工作,尤其是在排除Web服务器问题时。
本文给出5个Linux下功能更为强大的监控工具,有了它们就能涵盖日常监控80%的任务。下图为Linux下监控各个模块的实用工具,对于应用级运维来说,一般不需要监控特别底层的东西。
vmstat
相比于看各个进程cpu使用和内存使用而言,vmstat可以看机器全局的cpu、内存和io使用情况。
Vmstat 2表示以2秒为间隔,进行无限数量的采样,采样数据的各个列含义为:
r表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。
b表示阻塞的进程,这个不多说,进程阻塞,大家懂的。
swpd虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。
free空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。
buff是用来存储目录里面有什么内容,权限等的缓存,我本机大概占用300多M
cache 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时间。
iostat
iostat命令是另一个研究磁盘吞吐量的工具。和sar类似,iostat可以使用间隔和计数参数。第一个间隔的输出包含Linux总运行时间的指标。
不使用选项,iostat只显示覆盖启动以来全部时间的一组指标。
CPU信息包含基本上和top一样的字段。iostat CPU输出显示在用户模式中执行、执行正常进程、在内核(系统)模式中执行,进程等待I/O完成时处于空闲和没有等待进程时处于空闲的CPU时间的百分比。CPU行是所有CPU的摘要。
磁盘信息与sar -d提供的信息类似。输出包括每秒传输数(tps)、每秒512字节块读取数(Blk_read/s)、每秒512字节块写入数(Blk_wrtn/s)和512字节块读取(Blk_read)和写入(Blk_wrtn)的总数量。
iostat提供几个用于定制输出的开关。最有用的有:
-c只显示CPU行
-d显示磁盘行
-k以千字节为单位显示磁盘输出
-t在输出中包括时间戳
-x在输出中包括扩展的磁盘指标
iostat -x较为高级,输出信息也较多,各列的含义如下:
rrqm/s,wrqm/s:每秒钟合并的读写请求数。多个单独的I/O请求可以合并到一个传输请求中,因为每个传输请求可以有不同的大小。
r/s,w/s:每秒钟读写请求数。
rsec/s,wsec/s:每秒钟读写的扇区数。
rkB/s,wkB/s:每秒钟读写了多少KB。
avgrq-sz:请求的平均大小,此值是以扇区为单位。
avgqu-sz:请求队列的平均长度。
await:显示系统级别(内核)所占用CPU的百分比。
svctm:I/O请求的平均服务时间(单位为毫秒)。
%util:I/O请求过程中CPU时间的百分比(设备的带宽使用率)。当接近100%时设备处于饱和状态。
sar
sar命令包含选项、采样间隔时间和采样次数。选项较多,包含各种资源的监控,常见选项有:
-A所有的报告总和
-a文件读,写报告
-B报告附加的buffer cache使用情况
-b buffer cache使用情况
-c系统调用使用报告
-d硬盘使用报告
-g有关串口I/O情况
-h关于buffer使用统计数字
-m IPC消息和信号灯活动
-n命名cache
-p调页活动
-q运行队列和交换队列的平均长度
-R报告进程的活动
-r没有使用的内存页面和硬盘块
-u CPU利用率
-v进程,i节点,文件和锁表状态
-w系统交换活动
-y TTY设备活动
常见的命令:sar 1 10,没有选项则显示CPU的简单信息;
sar -n DEV 1 10,记录网络使用情况;
sar -v 1 10,记录内核中各个表的使用情况,信息列的含义如下,显示格式是实际使用表项/可以使用的表项数,显示内容表示,核心使用完全正常,三个表没有出现溢出现象,核心参数不需调整,如果出现溢出时,要调整相应的核心参数,将对应的表项数加大。
proc-sz:目前核心中正在使用或分配的进程表的表项数,由核心参数MAX-PROC控制。
inod-sz:目前核心中正在使用或分配的i节点表的表项数,由核心参数MAX-INODE控制。
file-sz:目前核心中正在使用或分配的文件表的表项数,由核心参数MAX-FILE控制。
ov:溢出出现的次数。
Lock-sz:目前核心中正在使用或分配的记录加锁的表项数,由核心参数MAX-FLCKRE控制。
Sar -d 1 10,记录设备使用情况,%busy的值比较小,说明用于处理传送请求的有效时间太少,文件系统效率不高,一般来讲,%busy值高些,avque值低些,等待队列通常为2较好,达到10以上就有问题了,文件系统的效率比较高,如果%busy和avque值相对比较高,说明硬盘传输速度太慢,需调整。
device:sar命令正在监视的块设备的名字。
%busy:设备忙时,传送请求所占时间的百分比。
avque:队列站满时,未完成请求数量的平均值。
r+w/s:每秒传送到设备或从设备传出的数据量。
blks/s:每秒传送的块数,每块512字节。
avwait:队列占满时传送请求等待队列空闲的平均时间。
avserv:完成传送请求所需平均时间(毫秒)。
Sar -b 1 10,记录buffer和cache的使用情况。最重要的是%cache和%wcache两列,它们的值体现着buffer的使用效率,%rcache的值小于90或者%wcache的值低于65,应适当增加系统buffer的数量,buffer数量由核心参数NBUF控制,使%rcache达到90左右,%wcache达到80左右。但buffer参数值的多少影响I/O效率,增加buffer,应在较大内存的情况下,否则系统效率反而得不到提高。
bread/s:每秒从硬盘读入系统缓冲区buffer的物理块数。
lread/s:平均每秒从系统buffer读出的逻辑块数。
%rcache:在buffer cache中进行逻辑读的百分比。
bwrit/s:平均每秒从系统buffer向磁盘所写的物理块数。
lwrit/s:平均每秒写到系统buffer逻辑块数。
%wcache:在buffer cache中进行逻辑读的百分比。
pread/s:平均每秒请求物理读的次数。
pwrit/s:平均每秒请求物理写的次数。
Sar -g 1 10,记录串口IO使用情况。
ovsiohw/s:每秒在串口I/O硬件出现的溢出。
ovsiodma/s:每秒在串口I/O的直接输入输出通道高速缓存出现的溢出。
ovclist/s:每秒字符队列出现的溢出。
netstat
Netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。
从整体上看,netstat的输出结果可以分为两个部分:
一个是Active Internet connections,称为有源TCP连接,其中"Recv-Q"和"Send-Q"指的是接收队列和发送队列。这些数字一般都应该是0。如果不是则表示软件包正在队列中堆积。这种情况只能在非常少的情况见到。
另一个是Active UNIX domain sockets,称为有源Unix域套接口(和网络套接字一样,但是只能用于本机通信,性能可以提高一倍)。Proto显示连接使用的协议,RefCnt表示连接到本套接口上的进程号,Types显示套接口的类型,State显示套接口当前的状态,Path表示连接到套接口的其它进程使用的路径名。
netstat选项包括-选项和采样间隔,-选项含义如下:
-a (all)显示所有端口,默认不显示LISTEN相关
-t (tcp)仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n拒绝显示别名,能显示数字的全部转化成数字,用于加快显示速度
-l仅列出有在Listen (监听)的套接字服務状态
-p显示建立相关链接的进程号和程序名
-r显示路由信息,路由表
-e显示以太网信息,包括扩展信息,例如uid等
-s按各个协议进行统计
-c每隔一个固定时间,执行该netstat命令。
提示:LISTEN和LISTENING的状态只有用-a或者-l才能看到
常见的选项组合如下:
-at列出所有TCP端口信息
-au列出所有UDP端口信息
-lt列出所有监听TCP端口信息
-lu列出所有监控UDP端口信息
-st显示TCP端口统计信息
-su显示UDP端口统计信息
netstat -ap | grep ssh找出相应程序的端口信息
netstat -an | grep ‘:80‘找出指定端口信息
-ant以数字显示所有TCP端口信息
-e表示以太网信息,若接收错和发送错接近为零或全为零,网络的接口无问题。但当这两个字段有100个以上的出错分组时就可以认为是高出错率了。高的发送错表示本地网络饱和或在主机与网络之间有不良的物理连接;高的接收错表示整体网络饱和、本地主机过载或物理连接有问题,可以用Ping命令统计误码率,进一步确定故障的程度。netstat -e和ping结合使用能解决一大部分网络故障。
ifstat
ifstat是监控各个网卡输入输出速率的程序,并非Linux系统的内置监控程序,需要独立下载。其安装十分简单,一路./configure、make、make install即可。
ifstat命令选项和vmstat命令类似,都是后面接两个数字,第一个数字是采样间隔秒数,第二个数字是采样参数。
ifstat的输出结果很简单,是各个网卡的输入输出吞吐量,单位是kbps。