提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
监控CPU、磁盘、内存、I/O资源命令:mpstat、iostat、pidstat、iotop、top、lsof、tcpdump、nload
提示:以下是本篇文章正文内容,下面案例可供参考
一、本章Linux资源监控命令合集
mpstat、iostat、pidstat、iotop、top 、lsof、tcpdump、nload
(一) mpstat命令——命令主要用于多CPU环境下,它能显示各个CPU状态。这些信息存放在/proc/stat文件中。
1、命令的作用
mpstat是 Multiprocessor Statistics的缩写,是实时系统监控工具。其报告与CPU的一些统计信息,这些信息存放在**/proc/stat**文件中。在多CPU系统里,其不但能查看所有CPU的平均状况信息,而且能够查看特定CPU的信息。
应用于:
分析多CPU的平均负载高的原因
计算机秘籍导致平均负载高
IO导致平均负载高
等待CPU调度导致平均负载高
mpstat经常配合pidstat等其他命令一起分析系统性能瓶颈
2、命令格式与用法
命令格式
mpstat [ 选项 ] [ <时间间隔> [ <次数> ] ]
mpstat [-P {cpu|ALL}] [internal [count]]
[ -A ] 等于“-I ALL、-u、-P ALL”
[ -u ] 显示cpu的使用状态
[ -V ] 显示版本信息并且退出
[ -I { SUM | CPU | SCPU | ALL } ] 显示中断信息
SUM,显示每一个cpu的中断总数
CPU,显示每秒收到的中断总数
SCPU,查看软终端的统计信息
ALL,显示所有的中断统计信息
[ -P { <cpu> [,...] | ON | ALL } ] 制定显示CPU的信息,从0开始,0…N-1,显示制定CPU信息
ALL,显示所有的CPU信息
其中参数的含义
-P {cpu l ALL} | 表示监控哪个CPU, cpu在[0,cpu个数-1]中取值 |
---|
internal | 相邻的两次采样的间隔时间 | count | 采样的次数,count只能和delay一起使用 |
使用实验 直接使用mpstat命令
mpstat
(1)、当mpstat不带参数时,输出为从系统启动以来的平均值。
mpstat
(2)、当没有参数时,mpstat则显示系统启动以后所有信息的平均值。有interval时,第一行的信息自系统启动以来的平均信息。从第二行开始,输出为前一个interval时间段(3秒)的平均信息。
mpstat -P ALL 3
(3)、mpstat -P ALL 3 3
mpstat -P ALL 3 3
ALL:代表统计所有cpu
第一个3:代表采样时间间隔3秒
第二个3:采用次数3次
输出参数的含义
CPU 处理器ID(从0开始) %usr 在internal时间段里,用户态的CPU时间(%),不包含 nice值为负进程 %nice 在internal时间段里,nice值为负进程的CPU时间(%) %sys 在internal时间段里,核心时间(%) %iowait 在internal时间段里,硬盘IO等待时间(%) %iowait 在internal时间段里,硬盘IO等待时间(%) %irq 在internal时间段里,硬中断时间(%) %soft 在internal时间段里,软中断时间(%) %steal 显示虚拟机管理器在服务另一个虚拟处理器时虚拟CPU处在非自愿等待下花费时间的百分比 %guest 显示运行虚拟处理器时CPU花费时间的百分比 %gnice CPU运行niced guest虚拟机所花费的时间百分比 %idle CPU的空闲时间的百分比
注意事项
(1)、 mpstat主要用在当系统变慢,平均负载增大时,我们想判断到底是CPU的使用率增大了,还是IO压力增大的情况。 (2)、如果%iowait的值过高,表示硬盘存在I/O瓶颈,%idle值高,表示CPU较空闲,如果%idle值高但系统响应慢时,有可能是CPU等待分配内存,此时应加大内存容量。%idle值如果持续低于10,那么系统的CPU处理能力相对较低,表明系统中最需要解决的资源是CPU。
(二)、iostat——监控系统设备的IO负载情况,根据这个可以看出当前系统的写入量和读取量,CPU负载和磁盘负载。
1、命令的作用
iostat主要用于监控系统设备的IO负载情况,根据这个可以看出当前系统的写入量和读取量,CPU负载和磁盘负载。
2、命令格式
#iostat [选项] [<时间间隔>] [<次数>]
选项
-c 只显示cpu相关统计信息(默认是同时显示cpu和磁盘信息)
#-d 只显示磁盘统计信息(默认是同时显示cpu和磁盘信息)
-h 使用NFS的输出报告更加友好可读
-j { ID | LABEL | PATH | UUID | … } 磁盘列表的Device列要用什么维度来描述磁盘
#-k 默认情况下,iostat的输出是以block作为计量单位,加上这个参数可以以kb作为计量单位显示。(该参数仅在linux内核版本2.4以后数据才是准确的)
#-m 默认情况下,iostat的输出是以block作为计量单位,加上这个参数可以以mb作为计量单位显示。(该参数仅在linux内核版本2.4以后数据才是准确的)
-N 显示磁盘阵列(LVM) 信息
-n 显示NFS相关统计数据(network fileSystem)。(该参数只在linux内核版本2.6.17之后有用)
-p [ { device [,…] | ALL } ] 显示磁盘分区的相关统计信息(默认粒度只到磁盘,没有显示具体的逻辑分区)
#-t 显示终端和CPU的信息,每次输出报告时显示系统时间。
-V 显示当前iostat的版本信息
-x 显示更详细的磁盘报告信息,默认只显示六列,加上该参数后会显示更详细的信息。(该参数需要在内核版本2.4之后才能使用)
-y 跳过不显示第一次报告的数据,因为iostat使用的是采样统计,所以iostat的第一次输出的数据是自系统启动以来累计的数据
-z 只显示在采样周期内有活动的磁盘
(1)、 iostat
(2)、 iostat -d只显示磁盘统计信息
后面还可以加具体哪个磁盘
例如:iostat -d sdb
(3)、iostat -k以KB为的单位显示所有信息
(4)、iostat -m以MB为的单位显示所有信息
(5)、iostat -t显示终端和CPU的信息,每次输出报告时显示系统时间,并报告每秒向终端读取和写入的字节数
(6)、iostat -t -k 查看TPS和吞吐量信息
(7)、iostat -d -x -k 查看设备使用率(%util)、响应时间(await)
3、参数指令
CPU | – |
---|
%user | CPU处在用户模式下的时间百分比。 | %nice | CPU处在带NICE值的用户模式下的时间百分比。 | %system | CPU处在系统模式下的时间百分比。 | %iowait | CPU等待输入输出完成时间的百分比。 | %steal | 管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。 | %idle | CPU空闲时间百分比。 |
IO | – |
---|
Device段 | 磁盘名称 | tps | 每秒钟发送到的I/O请求数. | Blk_read /s | 每秒读取的block数. | Blk_wrtn/s | 每秒写入的block数. | Blk_read | 读入的block总数. | Blk_wrt | 写入的block总数. |
注:如果%iowait的值过高,表示硬盘存在I/O瓶颈,%idle值高,表示CPU较空闲,如果%idle值高但系统响应慢时,有可能是CPU等待分配内存,此时应加大内存容量。%idle值如果持续低于10,那么系统的CPU处理能力相对较低,表明系统中最需要解决的资源是CPU。
信息说明
| |
---|
| | tps: | 每秒钟发送到的I/O请求数。 | Blk_read/s: | 每秒读取的block数。 | Blk_wrtn/s: | 每秒写入的block数。 | Blk_read: | 读入的block总数。 | Blk_wrtn: | 写入的block总数。 | rrqm/s: | 每秒进行 merge 的读操作数目。即 rmerge/s | wrqm/s: | 每秒进行 merge 的写操作数目。即 wmerge/s | r/s: | 每秒完成的读 I/O 设备次数。即 rio/s | w/s: | 每秒完成的写 I/O 设备次数。即 wio/s | rkB/s: | 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。 | wkB/s: | 每秒写K字节数。是 wsect/s 的一半。 | avgrq-sz: | 平均每次设备I/O操作的数据大小 (扇区)。 | avgqu-sz: | 平均I/O队列长度。 | rsec/s: | 每秒读扇区数。即 rsect/s | wsec/s: | 每秒写扇区数。即 wsect/s | r_await: | 每个读操作平均所需的时间(不仅包括硬盘设备读操作的时间,还包括了在kernel队列中等待的时间。) | w_await: | 每个写操作平均所需的时间(不仅包括硬盘设备写操作的时间,还包括了在kernel队列中等待的时间。) | await: | 平均每次设备I/O操作的等待时间 (毫秒)。 | svctm: | 平均每次设备I/O操作的服务时间 (毫秒)。 | %util: | 一秒中有百分之多少的时间用于 I/O 操作,即被io消耗的cpu百分比 |
(三)、pidstat——用于监控全部或指定进程的cpu、内存、线程、设备IO等系统资源的占用情况。
1、命令的作用
pidstat是sysstat工具的一个命令,用于监控全部或指定进程的cpu、内存、线程、设备IO等系统资源的占用情况。pidstat首次运行时显示自系统启动开始的各项统计信息,之后运行pidstat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。
2、常用的参数:
#-u:默认的参数,显示各个进程的cpu使用统计
-r:显示各个进程的内存使用统计
-d:显示各个进程的IO使用情况
#-p:指定进程号 (后面可以加ALL)表示全部
-w:显示每个进程的上下文切换情况
-t:显示选择任务的线程的统计信息外的额外信息
-T { TASK | CHILD | ALL }
这个选项指定了pidstat监控的。TASK表示报告独立的task,CHILD关键字表示报告进程下所有线程统计信息。ALL表示报告独立的task和task下面的所有线程。
注意:task和子线程的全局的统计信息和pidstat选项无关。这些统计信息不会对应到当前的统计间隔,这些统计信息只有在子线程kill或者完成的时候才会被收集。
-V:版本号
-h:在一行上显示了所有活动,这样其他程序可以容易解析。
-I:在SMP环境,表示任务的CPU使用率/内核数量
-l:显示命令名和所有参数
3、查看所有进程的cpu使用情况
pidstat 或 pidstat -u 或pidstat -p ALL 是一样的
(1)pidstat
(2) pidstat -u
(3)pidstat -p ALL
(4)、参数含义
| |
---|
PID: | 进程ID | %usr: | 进程在用户空间占用cpu的百分比 | %system: | 进程在内核空间占用cpu的百分比 | %guest: | 进程在虚拟机占用cpu的百分比 | %CPU: | 进程占用cpu的百分比 | CPU: | 处理进程的cpu编号 | Command: | 当前进程对应的命令 |
4、内存使用情况
pidstat -r——内存使用情况
| |
---|
PID | 进程ID | minflt / s | 每秒次缺页错误次数(minor page faults),当虚拟内存地址映射为物理内存地址时, 相应的page数据已经加载到page cache,只需要将该page与进程虚拟地址空间进行映射即可 | majflt / s | 每秒主缺页错误次数(major page faults),当虚拟内存映射为物理内存地址时,相应的page数据还在磁盘上,此时则会触发一次major fault, | VSZ | 虚拟内存大小,虚拟机内存的使用KB | RSS | 常驻内存大小,非交换区里内存使用KB | Command | 当前进程对应的命令 |
5、显示进程I/O使用情况
pidstat -d——显示进程I/O使用情况
| |
---|
PID | 进程ID | kB_rd / s | 每秒从磁盘读取的字节数(kb) | KB_wr / s | 每秒写入磁盘的字节数(kb) | KB_ccwr / s | 任务取消的写入磁盘的字节数(kb),当任务截断脏PageCache | iodelay | IO延迟,该延迟包含了等待同步块IO完成和swap块IO完成所花费的延迟 | Command | 当前进程对应的命令 |
6、显示进程上下文切换情况
进程上下文切换,是指从一个进程切换到另一个进程运行。
| |
---|
PID | 进程ID | cswch / s | 每秒主动切换次数 | nvcswch / s | 每秒被动切换次数 | Command | 当前进程对应的命令 |
主动切换:当前进程无法获取所需资源导致的上下文切换。当IO、内存等系统资源不足时就会发生
被动切换:当进程由于CPU时间分片已到等原因,被系统强制调度所发生的上下文切换。当有大佬进程争抢CPU资源时,就容易发生被动切换
(四)、iotop——监控磁盘I/O使用状况
1、命令的作用
iotop是一款开源、免费的用来监控磁盘I/O使用状况的类似top命令的工具,iotop可以监控进程的I/O信息。它是Python语言编写的,与iostat工具比较,iostat是系统级别的IO监控,而iotop是进程级别IO监控。 iotop命令可以用来监控系统中各个进程对IO的使用量,它和top一样可以在非batch模式下运行时进行与用户交互。它主要可以用于监控:
进程/线程的I/O的读写带宽 进程/线程swapin的耗时占比 进程/线程的I/O阻塞(等待)耗时占比 每个进程/线程的I/O优先级 系统中I/O总读写带宽 系统中I/O实际读写带宽(和总读写带宽有时候值并不一致)
| |
---|
Total DISK READ | 从磁盘中读取数据的总速率 | Total DISK WRITE | 从磁盘中写入数据的总速率 | Actual DISK READ | 从磁盘中读取数据的实际速率 | Actulal DISK WRITE | 从磁盘中写入数据的实际速率 | TID | 线程ID,按p可转换成进程ID | PRIO | 优先级 | USER | 线程所有者 | DISK READ | 从磁盘中读取的速率 | DISK WRITE | 往磁盘里写入的速率 | SWAPIN | swap交换百分比 | IO> IO等待所占用的百分比 | | COMMAND 进程命令 | |
2、选项
#-v version:显示版本号
#-h help:显示帮助信息
#-o only:只显示正在产生I/O的进程或线程,运行过程中,可以通过按o随时切换
#-b batch:非交互模式下运行,一般用来记录日志。
#-n NUM--iter=NUM:设置监控(显示)NUM次,主要用于非交互模式。默认无限
#-d SEC--delay=SEC:设置显示的间隔秒数,支持非整数
#-p PID--pid=PID:只显示指定进程(PID)的信息
#-u USER--user=USER:显示指定的用户的进程的信息
#-P processes:只显示进程,不显示所有线程
#-a accumulated:累积的I/O,显示从iotop启动后每个进程累积的I/O总数,便于诊断问题
-k kilobytes:显示使用KB单位
-t time:交互模式下,加上时间戳。
-q quiet:只在第一次监测时显示列名. 去除头部一些行:这个参数可以设置最多3次来移除头部行:-q列头部只在最初交互显示一次;-qq列头部不显示;-qqq,I/O的总结不显示
3、iotop -o ——仅显示实际执行I/O的进程或线程,只显示在划硬盘的程序
4、 iotop -b ——非交互模式,批量处理用来记录日志的
5、iotop -n [次数]—— 设定循环几次
iotop -n 3 在刷新3次后自动退出
6、 iotop -d [时间] —— 设定显示时间间隔
如:iotop -d 1 1秒刷新一次
7、iotop -p 1 —— 查看1进程及他下面的线程情况
8、 iotop -P ——只显示进程
9、 iotop -u 用户监控(全部)
iotop -u root #只显示root下的进程/线程
10、iotop -t 在每一行上添加一个时间戳
11、 iotop -a 显示累计的I/O而不是带宽
常用快捷键(交互模式)
r:改变排序顺序。
o:只显示有IO输出的进程。
p:进程/线程的显示方式的切换。
a:显示累积使用量。
q:退出。
除了-b选项启动的iotop,可以在运行期间执行一些命令如下
|:-|:-|
|左右箭头|改变排序的列|
|r|反向排序,按io|
|o|切换至选项–only|
|p|切换至–processes选项|
|a|切换至–accumulated选项|
|q|退出 |
|i|改变线程的优先级|
交互模式下除了以上这些交互命令键之外的任意键都会强制刷新
(五)、动态进程 top
1、top内容
| |
---|
PID | 进程id号 | USER | 进程所有者的用户名 | PR | 优先级(由内核动态调整),用户不能 | NI | 进程优先级,nice值,负值表示高优先级,正值表示低优先级,用户可自己调整 | VIRT | 虚拟内存,是进程正在使用的所有内存 | RES | 进程所使用的物理内存 | SHR | 共享内存大小,(单位KB) | S | 进程状态 | %CPU | 上次更新到现在的CPU时间占用百分比 | %MEM | 进程使用的物理内存百分比 | TIME+ | 进程使用的CPU时间总计,单位1/100秒 | COMMAND | 命令名/命令行 |
(六)、lsof——查找进程打开了哪些文件以及与打开文件相关联的内容
1、命令的作用
lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户执行。
2、用法格式
lsof (选项)
-a 列出打开文件存在的进程;
#-c<进程名> 列出指定进程所打开的文件;
-g 列出GID号进程详情;
#-d<文件号> 列出占用该文件号的进程;
+d<目录> 列出目录下被打开的文件;
+D<目录> 递归列出目录下被打开的文件;
-n<目录> 列出使用NFS的文件;
-i<条件> 列出符合条件的进程。(4、6、协议、:端口、 @ip )
#-p<进程号> 列出指定进程号所打开的文件;
#-u 列出UID号进程详情;
-h 显示帮助信息;
-v 显示版本信息。
3、lsof 的常用命令
(1)、lsof——列出所有打开的文件(不带参数时,通常会和 “ | more ” 一起使用 )
不带任何参数执行 lsof命令会输出当前所有活跃进程打开的所有文件
lsof | more ——输出当前所有活跃进程打开的所有文件
(2)、 lsof -p 参数——输出指定进程打开的参数
lsof -p 1列出1号进程打开的文件
(3)、lsof -l参数——输出中使用用户 ID 代替用户名
(4)、lsof -u 参数——输出指定用户打开的文件
lsof -u root
(5)、lsof -d 参数
lsof -d 10 输出打开文件描述符10的所有项
(6)、losf filename 输出打开指定文件(/usr/lib64/libgcc_s-4.8.5-20150702.so.1)的进程项
这里举了个例子
lsof输出各列信息的意义
COMMAND:进程的名称 PID:进程标识符 PPID:父进程标识符(需要指定-R参数) USER:进程所有者 PGID:进程所属组 FD:文件描述符,应用程序通过文件描述符识别该文件。 DEVICE:指定磁盘的名称 SIZE:文件的大小 NODE:索引节点(文件在磁盘上的标识) NAME:打开文件的确切名称
FD文件描述符列表
cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改 txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序 lnn:library references (AIX)(库引用); er:FD information error (see NAME column)(fd信息错误); jld:jail directory (FreeBSD)(监控目录); ltx:shared library text (code and data)(共享库文本); mxx :hex memory-mapped type number xx(十六进制内存映射类型号xx); m86:DOS Merge mapped file(DOS合并映射文件); mem:memory-mapped file(内存映射文件); mmap:memory-mapped device(内存映射设备); pd:parent directory(父目录); rtd:root directory(跟目录); tr:kernel trace file (OpenBSD)(内核跟踪文件); v86 VP/ix mapped file(VP/IX映射文件); 0:表示标准输出 1:表示标准输入 2:表示标准错误
文件状态模式
跟在标准输出、标准错误、标准输入后
u:表示该文件被打开并处于读取/写入模式。 r:表示该文件被打开并处于只读模式。 w:表示该文件被打开并处于。 空格:表示该文件的状态模式为unknow,且没有锁定。 -:表示该文件的状态模式为unknow,且被锁定。
在文件状态模式后面,还跟着相关的锁 N:for a Solaris NFS lock of unknown type(对于未知类型的Solaris NFS锁); r:for read lock on part of the file(用于对文件的一部分进行读取锁定); R:for a read lock on the entire file(整个文件的读取锁定); w:for a write lock on part of the file;(文件的部分写锁) W:for a write lock on the entire file;(整个文件的写锁) u:for a read and write lock of any length(对于任意长度的读写锁); U:for a lock of unknown type(对于未知类型的锁); x:for an SCO OpenServer Xenix lock on part of the file(对于文件的sco openserver xenix锁); X:for an SCO OpenServer Xenix lock on the entire file(对于整个文件的sco openserver xenix锁); space:if there is no lock(如果没有锁)
文件类型
DIR:表示目录。 CHR:表示字符类型。 BLK:块设备类型。 UNIX: UNIX 域套接字。 FIFO:先进先出 (FIFO) 队列。 IPv4:网际协议 (IP) 套接字。 DEVICE:指定磁盘的名称 SIZE:文件的大小 NODE:索引节点(文件在磁盘上的标识) NAME:打开文件的确切名称
(七)、tcpdump——tcpdump是一个抓包工具
tcpdump使用 tcpdump -i ens33
(八)、nload——用来监听网络状态和各ip所使用的带宽
命令的作用
nload是一个Linux命令行工具,用于使用有洞察力的图表和流量统计信息实时监视网络流量和带宽使用情况,一般用于实时监控Linux网络下的流量信息,可以通过Incoming和Outgoing两项对比来对进出站的流量进行可视化监控。
先下载epel-release库才能下载nload 安装nload Yum install -y epel-release Yum install -y nload
参数选项 1显示台参数
#nload默认使用的是ens33网卡,若想监控其他网卡,可以在命令后方加上需要监控的网卡
参数说明
#Incoming:进入网卡的流量
#Outgoing:从网卡流出的流量
#Curr:当前流量
#Avg:平均流量
#Min/Max:最大/最小流量
#Ttl:流量总和
常用参数选项
-a 全部数据的刷新时间周期,单位是秒,默认是300
-i 进入网卡的流量图的显示比例最大值设置,默认10240 kBit/s
-m 不显示流量图,只显示统计数据
-o 出去网卡的流量图的显示比例最大值设置,默认10240 kBit/s
-t 显示数据的刷新时间间隔,单位是毫秒,默认500
-u 设置右边Curr、Avg、Min、Max的数据单位,默认是自动变的,注意大小写单位不同
总结
了解:mpstat、iostat、iotop、nload、pidstat、lsof、tcpdump、top这几个命令
|