os:centos7,需要用到的工具:iostat、iotop、pidstat
1、iostat工具
如果没有这个工具可以通过yum安装
[root@centos ~]# yum -y install sysstat
[root@centos ~]# iostat -x 1 3
avg-cpu: %user %nice %system %iowait %steal %idle
0.12 0.00 0.00 0.00 0.00 99.88
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.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
输出内容较宽,如果屏幕宽可以看的明白一点,字段说明:
avg-cpu段
%usr CPU在用户模式下的时间百分比
%nice CPU处在带NICE值的用户模式下的时间百分比
%system CPU在系统模式下的时间百分比
%iowait CPU等待输入输出完成时间的百分比
%steal 管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比
%idle CPU空闲时间百分比
Device段
Device:设备名称
tps:每秒的IO读、写请求数量,多个逻辑请求可以组合成对设备的单个I/O请求。
Blk_read/s (kB_read/s, MB_read/s):从设备读取的数据量,以每秒若干块(千字节、兆字节)表示。块相当于扇区,因此块大小为512字节。
Blk_wrtn/s (kB_wrtn/s, MB_wrtn/s):写入设备的数据量,以每秒若干块(千字节、兆字节)表示。块相当于扇区,因此块大小为512字节。
Blk_read (kB_read, MB_read):读取块的总数(千字节、兆字节)。
Blk_wrtn (kB_wrtn, MB_wrtn):写入块的总数(千字节,兆字节)。
rrqm/s:每秒合并到设备的读请求数。即delta(rmerge)/s
wrqm/s:每秒合并到设备的写入请求数。即delta(wmerge)/s
r/s:每秒完成的读I/O设备次数。即delta(rio)/s
w/s:每秒完成的写I/0设备次数。即delta(wio)/s
rsec/s (rkB/s, rMB/s):每秒读取设备的扇区数(千字节、兆字节)。每扇区大小为512字节
wsec/s (wkB/s, wMB/s):每秒写入设备的扇区数(千字节、兆字节)。每扇区大小为512字节
avgrq-sz:平均每次设备I/O操作的数据量(扇区为单位)。即delta(rsec+wsec)/delta(rio+wio)
avgqu-sz:平均每次发送给设备的I/O队列长度。
await:平均每次IO请求等待时间。(包括等待队列时间和处理时间,毫秒为单位)
r_await:平均每次IO读请求等待时间。(包括等待队列时间和处理时间,毫秒为单位)
w_await:平均每次IO写请求等待时间。(包括等待队列时间和处理时间,毫秒为单位)
svctm:平均每次设备I/O操作的处理时间(毫秒)。警告!不要再相信这个字段值,这个字段将在将来的sysstat版本中删除。
%util:一秒中有百分之多少的时间用于I/O操作,或者说一秒中有多少时间I/O队列是非空的。当该值接近100%时,设备饱和发生。
iostat参数详解
-c: 仅显示CPU统计信息,与-d选项互斥
-d:仅显示磁盘统计信息,与-c选项互斥
-h:使用NFS(Network File System网络文件系统)的输出报告,更加友好可读。需要使用-n参数开启NFS。
-k:以 kb 为单位显示,默认情况下,iostat的输出是以block作为计量单位,加上这个参数可以以kb作为计量单位显示。(该参数仅在linux内核版本2.4以后数据才是准确的)
-m:以 mb 为单位显示(该参数仅在linux内核版本2.4以后数据才是准确的)
-N:显示磁盘阵列(LVM) 信息。
-V:显示版本信息
-x:显示更详细的磁盘报告信息,默认只显示六列,加上该参数后会显示更详细的信息(该参数仅在linux内核版本2.4以后数据才是准确的)
-n:显示NFS(Network File System网络文件系统) 使用情况(该参数仅在linux内核版本2.6.17以后有效)
-t:输出报告时显示系统时间
-p:[ { device [,…] | ALL } ] 显示磁盘分区的相关统计信息(默认粒度只到磁盘,没有显示具体的逻辑分区)
-y:跳过不显示第一次报告的数据,因为iostat使用的是采样统计,所以iostat的第一次输出的数据是自系统启动以来的累计的数据
性能分析
-
I/O瓶颈:
如果%iowait的值过高,表示硬盘存在I/O瓶颈
-
内存不足:
%idle值高,表示CPU较空闲,如果%idle值高但系统响应慢时,有可能是CPU在等待分配内存,此时应加大内存容量
-
CPU资源不足:
-
IOPS计算:
计算方式: r/s+w/s
I/O per second,即每秒钟可以处理的I/O个数。随机读写频繁的应用(一般指I/O小于64KB的应用场景),如小文件存储(图片)、OLTP数据库、邮件服务器,关注随机读写性能,IOPS是关键衡量指标。
-
吞吐量计算:
计算方式: rkB/s+wkB/s 顺序读写频繁的应用,传输大量连续数据,如电视台的视频编辑,视频点播VOD(Video On Demand),关注连续读写性能。数据吞吐量是关键衡量指标。
-
示例
#每隔 1秒刷新显示,显示3次
iostat 1 3
#每隔 2秒刷新显示详细信息,显示3次
iostat -x 2 3
#每隔 1秒刷新,显示CPU统计信息3次
iostat -c 1 3
#每隔 1秒刷新显示详细信息,显示3次,去除第1次
iostat -x -y 1 3
2、iotop工具
查看占用IO高的进程,需要使用iotop命令,如果没有可以通过yum安装
[root@centos ~]# yum -y install iotop
[root@centos ~]# iotop -oP
Total DISK READ : 0.00 B/s | Total DISK WRITE : 0.00 B/s
Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 0.00 B/s
PID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
90336 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.01 % [kworker/3:1
可以看到进程号,磁盘写入量,读取量,IO百分比以及是哪个命令执行的
常用选项
-o:只显示有io操作的进程
-b:批量显示,无交互,主要用作记录到文件。
-n NUM:显示NUM次,主要用于非交互式模式。
-d SEC:间隔SEC秒显示一次。
-p PID:监控的进程pid。
-u USER:监控的进程用户。
常用参数
-o 只显示正在产生I/O的进程或线程,运行过程中,可以通过按o随时切换
-b 非交互式下运行,一般用来记录日志
-n NUM 设置监控(显示)次数,主要用于非交互式,默认无限
-d SEC 设置显示的间隔秒数,支持非整数
-p PID 只显示指定进程(PID)的信息
-u USER 显示指定用户的进程信息
-P 只显示进程,不显示所有线程
-a 累积的I/O,显示从iotop启动后每个进程累积的I/O总数,便于诊断问题
-k 显示使用KB单位
-t 非交互模式下,加上时间戳
-q 只在第一次监测时显示列名. 去除头部一些行:这个参数可以设置最多3次来移除头部行:-q列头部只在最初交互显示一次;-qq列头部不显示;-qqq,I/O的总结不显示
常用快捷键
r:改变排序顺序。
o:只显示有IO输出的进程。
p:进程/线程的显示方式的切换。
a:显示累积使用量。
q:退出。
1.排序字段:使用键盘左右箭头控制排序的字段(排序字段右侧有">"或"<",例如: IO>)\
2.排序方式:"r"键可以控制升序还是降序排列(">"表示降序,"<"表示升序);
3.仅显示有IO发生的进程:"o"控制是否仅显示发生IO的进程;
4.进程/线程:"p"键控制线程号/进程号的(PID/TID)
5.累积流量:"a"键控制是否显示累积IO量,更加利于查看问题
6.强制刷新:"q"键退出,除了这些键之外的任意键都会强制刷新。
3、pidstat工具
#每2秒更新一次
[root@centos ~]# pidstat -d 2
Linux 3.10.0-957.el7.x86_64 (centos) 08/01/2023 _x86_64_ (8 CPU)
04:31:23 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s Command
04:31:24 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s Command
04:31:25 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s Command
因为我这里是测试的机器,所以几乎没有读写操作,通过此命令可以看出是哪个进程id占用的io
常用参数
-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:显示命令名和所有参数
输出字段
UID:用户id
PID:进程id
%user:表示用户进程所使用cpu的百分比
%system:表示内核进程所使用cpu的百分比
%guest:表示运行vCPU时所消耗的cpu时间百分比
%wait:表示任务在等待运行时花费的cpu的百分比。
%CPU:表示进程所使用cpu的百分比
CPU:处理进程的cpu编号
Command:进程对应的命令
注:运行pidstat不加任何选项,统计的信息为系统启动开始的各项统计信息