在对系统进行管理时,我们经常需要了解系统的负载情况,如CPU、内存等硬件的使用率等。这是了解系统运行状态的一种手段,也是进行系统性能分析时必须要收集的数据。使用nagios、zabbix等监控工具进行数据收集;而系统的短期负载状态可以使用如vmstat、top等工具进行收集和分析。
1、综合分析工具
1.1、vmstat
vmstat,Virtual Memory Statistics,虚拟内存统计,很多Linux发行版都默认安装了此工具。利用vmstat可以对操作系统的内存信息、进程状态、CPU活动等进行监视,不足之初是无法对某个进程进行深入分析。命令语法如下:
vmstat [选项] [间隔时间 [次数]]
常用选项及参数解释:
- -n:在周期性循环输出时,输出的头部信息仅显示一次
- 间隔时间:间隔多长的时间输出一次信息
- 次数:信息一共输出多少次
下面我们使用vmstat每个三秒输出一次信息,并持续三次,对输出结果进行分析:
[root@localhost ~]# vmstat 3 3 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 1 0 0 7465000 2108 344468 0 0 0 0 10 8 0 0 100 0 0 0 0 0 7464968 2108 344468 0 0 0 0 77 60 0 0 100 0 0 0 0 0 7464296 2108 344496 0 0 0 0 262 198 0 0 100 0 0
procs列:
- r列:运行和等待CPU时间片的进程数。这个值如果长期大于CPU核数的2~4倍,则说明CPU不足
- b列:等待资源的进程数,比如正在等待I/O等
memory列:
- swpd列:切换到交换分区的内存数量(单位k)。如果该列不为0,或较大,只要swap列的si、so长期为0,一般不会影响系统性能
- free列:当前空闲的物理内存数量(单位k)
- buff列:buffers占用的内存数量
- cache:cached占用的内存数量
swap列:
- si列:从swap写入内存的数量,由磁盘调入内存
- so列:写入swap的数量,由内存调入磁盘。
- 正常情况下这两个值都为0,如果这两个值长期不为0,则表示内存不足
io列:
- bi列:从块设备读入数据的总量,即读磁盘
- bo列:写入到块设备的数据总量,即写磁盘。
- 这两个值如果超过1000,且CPU列的wa值较大,则表示磁盘IO有性能问题
system列:
- in列:表示在某一时间间隔中观测到的每秒设备中断数
- cs列:表示每秒产生的上下文切换次数
- 这两个值越大,则由内核消耗的CPU时间会越多
cpu列:
- us列:用户进程消耗的CPU时间百分比。该值如果长期大于50%,就需要考虑优化程序或算法了
- sy列:内核进程消耗的CPU时间百分比。us+sy的值应该保持在80%以下
- id列:CPU空闲状态的时间百分比
- wa列:IO等待所占用的CPU时间百分比。wa值越高,说明ID等待越严重。一般来说wa的参考值为20%,如果超过20%,说明IO等待严重,引起IO等待的原因可能是磁盘大量随机读写造成的,也可能是磁盘或者磁盘控制器的带宽瓶颈造成的(主要是块操作)
- st列:虚拟机占用的CPU时间百分比
注意:CPU整体负载不高但是成勋运行缓慢,有可能是由于程序使用单线程的原因,只使用一个CPU导致的。
1.2、iostat
iostat,I/O statistics,输入/输出统计,主要应用在对磁盘I/O的监控上。它的输出主要显示磁盘读写操作的统计信息,同时也会给出CPU的使用情况。iostat也不能对某个进程进行深入分析,仅能对系统的整体情况进行分析。
iostat包含在Sysstat包中,一般不默认安装。Sysstat包包含iostat、sar和mpstat三个工具。
iostat命令语法如下:
iostat [选项] [间隔时间[次数]]
常用选项:
- -c:显示CPU的使用情况
- -d:显示磁盘的使用情况
- -x:显示指定磁盘的统计信息,参数为磁盘设备名
iostat输出信息详解:
[root@localhost ~]# iostat Linux 3.10.0-862.el7.x86_64 (localhost.localdomain) 2018年11月28日 _x86_64_ (8 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.01 0.00 0.01 0.00 0.00 99.98 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 0.08 0.53 0.50 368028 346173 dm-0 0.09 0.49 0.49 338746 343995 dm-1 0.00 0.00 0.00 2228 0
avg-cpu:CPU使用信息
- %user:用户进程消耗的CPU时间百分比
- %nice:改变优先级进程所消耗的CPU时间百分比
- %system:系统进程消耗的CPU时间百分比
- %iowait:IO等待占用的CPU时间百分比
- %steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比
- %idle:CPU空闲时间百分比
Device:硬盘使用信息
- tps:每秒对磁盘的I/O请求数量
- kB_read/s: 每秒读取的数据块
- kB_wrtn/s: 每秒写入的数据块
- kB_read: 读取的所有块数
- kB_wrtn:写入的所有块数
加上-x选项后输出的详细磁盘统计信息:
[root@localhost ~]# iostat -x Linux 3.10.0-862.el7.x86_64 (localhost.localdomain) 2018年12月06日 _x86_64_ (8 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.01 0.00 0.01 0.00 0.00 99.98 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.00 0.01 0.01 0.07 0.27 0.46 19.99 0.00 0.39 2.13 0.20 0.18 0.00 dm-0 0.00 0.00 0.01 0.07 0.25 0.46 17.87 0.00 0.41 2.67 0.23 0.16 0.00 dm-1 0.00 0.00 0.00 0.00 0.00 0.00 47.40 0.00 2.28 2.28 0.00 1.90 0.00
详解:
- rrqm/s:每秒进行的合并读操作数目,即rmerge/s
- wrqm/s:每秒进行的合并写操作数目,即wmerge/s
- r/s:每秒完成的读I/O设备次数,即rio/s
- w/s:每秒完成的写I/O设备次数,即wio/s
- rsec/s:每秒读扇区数
- wsec/s:每秒写扇区数
- rkB/s:每秒读k字节数,为rsec/s的一半,因为每扇区大小为512字节
- wkB/s:每秒写k字节数
- avgrq-sz:平均每次设备I/O操作的数据大小(扇区)
- avgqu-sz:平均I/O队列长度
- await:平均每次设备I/O操作的等待时间(毫秒)
- r_await:每个读操作平均所需的时间
- w_await:每个写操作平均所需的时间
- svctm:平均每次设备I/O操作的服务时间
- %util:一秒中有多少的时间用于I/O操作,或者说是一秒中有多少的时间I/O队列是非空的
1.3、sar
sar是分析系统性能的重要工具之一,通过sar可以全面获取系统的CPU、运行队列、磁盘I/O、交换分区、内存、CPU中断、网络等性能的数据。
sar命令语法如下:
sar [选项] [-o 文件名] [间隔时间[次数]]
常用选项:
- -A:显示系统所有资源设备(CPI、内存、磁盘等)的运行状态
- -u:显示系统所有CPU在采样时间内的负载状态
- -P:显示系统中指定CPU的使用情况
- -d:显示系统所有硬盘设备在采样时间内的使用情况
- -r:显示系统内存在采样时间内的使用情况
- -b:显示缓冲区在采样时间内的使用情况
- -v:显示进程、文件、inode和锁表状态
- -n:显示网络运行状态。可能的参数有 DEV,显示网络接口信息;EDEV,显示网络错误的统计数据;SOCK,显示套接字信息;FULL,显示所有信息
1.4、top
top工具可以用来详细的分析系统的整体负载,它除了可以查看CPU内存的使用情况,还可以查看出具体进程的资源占用。top工具在青蛙学Linux—进程管理中有详细介绍,传送门https://www.cnblogs.com/yu2006070-01/p/9995978.html。
2、CPU分析工具
2.1、uptime
uptime是监控系统性能最常用的一个命令,主要用来统计当前的系统运行状况。命令语法如下:
uptime
以下是该命令的输出内容:
[root@localhost ~]# uptime 14:36:34 up 17 days, 23:21, 1 user, load average: 0.00, 0.01, 0.05
其输出的信息依次为:当前时间、系统开机后运行的时长、当前登录的用户数量、系统一分钟/五分钟/十五分钟内的平均负载。
注意:load average所显示的系统负载值一般不能大于系统的CPU核数。如果长期大于CPU核数则说明CPU繁忙,负载很高;偶尔大于CPU核数则一般不会影响系统性能。
2.2、htop
类似于top的一个工具,对于CPU和内存的负载使用图形表示。它支持垂直方向和水平方向的滚动,可以查看系统上运行的所有进程以及这些进程的完整命令,还可以杀死指定的进程。
htop包含在第三方源epel中,所以通过YUM安装时请确保已经配置了epel源。
htop命令语法如下:
htop
htop运行界面,其显示的项目与top类似:
3、内存分析工具
3.1、free
free是Linux下查看内存使用的常用命令,在青蛙学Linux—内存管理中有详细介绍,传送门https://www.cnblogs.com/yu2006070-01/p/10001951.html。
3.2、smem
smem能够为用户提供内存使用的多种报告,和其他的内存工具不同,smem可以报告PSS。
在Linux系统中使用了虚拟内存virtual memory,因此要准确计算一个进程实际使用的物理内存就不容易。而只知道进程使用的虚拟内存大小也没有太大的用处,因为无法获知进程实际分配的物理内存大小。
这种情况下的三个概念:
- RSS(Resident set size),常用的内存指标,使用top命令可查询。表示进程占用的物理内存大小,但该指标也包好了进程间共享的内存
- PSS(Proportional set size),所有使用某共享库的进程均分该共享库占用的内存。显然所有进程的PSS之和就是系统的内存使用量。它更加准确一些,因为它将共享内存的大小进行平均后在分摊到各进程上去
- USS(Unique set size),进程独自占用的内存,不包含任何共享的内存
smem同样包含在epel源中,使用YUM之前请确保已经正确配置epel源。
smem命令语法如下:
smem [选项]
常用选项:
- -p:以百分比的形式报告内存使用情况
- -u:报告每一个用户的内存使用情况
- -P:报告指定进程的内存使用情况
一个例子:查看sshd的内存使用情况
[root@localhost ~]# smem -P sshd PID User Command Swap USS PSS RSS 1290 root /usr/sbin/sshd -D 0 1028 1535 4328 20545 root sshd: root@pts/0 0 2048 2618 5604 23734 root python /usr/bin/smem -P ssh 0 5496 5965 7692
4、磁盘分析工具
4.1、iotop
iotop是一个用来监视磁盘I/O使用状况的top类工具,可以监测程序使用磁盘I/O的实时信息。可使用YUM进行安装。
iotop命令语法如下:
iotop [选项]
常用选项:
- -p:显示指定进程的I/O情况,参数为PID
- -u:显示指定用户的I/O情况,参数为用户名
- -P:只显示进程,默认为显示所有线程
- -k:以千字节显示
- -t:在每一行前添加当前时间
交互模式下的按键功能:
- o键:只显示有I/O输出的进程
- 左右键:改变排序方式,默认按I/O排序
- p键:线程、进程的切换
iotop界面:
5、网络性能分析工具
5.1、ping
ping为常用的网络连通性测试工具,命令格式如下:
ping IP|域名
5.2、netstat -i
通过该命令组合来显示网络接口的详细信息。命令输出如下:
[root@localhost ~]# netstat -i Kernel Interface table Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg ens160 1500 9299498 3 3 0 52908 0 0 0 BMRU lo 65536 70 0 0 0 70 0 0 0 LRU
详解:
- Iface:网络接口
- MTU:最大传输单元
- RX-OK:准确无误接受的数据包数量
- RX-ERR:接受数据包时产生的错误数量
- RX-DRP:接受数据包时丢弃的数量
- RX-OVR:接受数据包时由于误差而遗失的数量
- TX-OK:准确无误发送的数据包数量
- TX-ERR:发送数据包时产生的错误数量
- TX-DRP:发送数据包时丢弃的数量
- TX-OVR:发送数据包时由于误差而遗失的数量
- Flg:接口标记。可能的值有 L,回环设备;B,设置了广播地址;M,接受所有数据包;R,接口正在运行;U,接口处于活动状态;O,接口上禁用ARP;P,一个点到点的连接
注意:正常情况下RX-ERR/TX-ERR、RX-DRP/TX-DRP和RX-OVR/TX-OVR的值应该都为0,如果这几项不为0且值很大,说明网络状况不佳。
5.3、tcpdump
tcpdump可以将网络中传送的数据包的包头完整的抓取下来进行分析,它支持对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来去掉无用的信息。
tcpdump命令语法如下:
tcpdump [选项]
常用选项:
- -i:指定网卡
- -n:指定IP
- -c:指定抓了多少个包后退出
- -A:以ASCII方式显示包的内容,这对于文本格式的协议包很有用
- -x:以十六进制显示包的内容
- -vvv:显示详细信息
- -s:按指定的长度截取数据。默认60字节,如果包长大于60字节,会出现数据丢失的现象,所以一般设置为0,这样会按照包的长度抓取数据
- -r:从文件中读取
- -w:将抓包结果保存到指定文件
- tcp|udp:抓取指定协议的数据包
- src:抓取指定源地址的数据包
- dst:抓取指定目的地址的数据包
- port:抓取指定端口的数据包
一些例子:
# 抓取经过eth0的数据包 [root@localhost ~]# tcpdump -i eth0 # 抓取经过eth0,基于TCP协议的数据包 [root@localhost ~]# tcpdump -i eth0 tcp # 抓取经过eth0,目的或源端口是22的数据包 [root@localhost ~]# tcpdump -i eth0 port 22 # 抓取经过eth0,源地址是192.168.0.22的数据包 [root@localhost ~]# tcpdump -i eth0 src 192.168.0.22
tcpdump抓取数据包的常见包标志:
- S:SYC,发起连接标志
- P:PUSH,传送数据标志
- F:FIN,关闭连接标志
- ACK:确认包
- RST:RESET,异常关闭连接
- .:没有任何标志