linux-磁盘io监控相关工具整理
常见的io监控工具包括iostat、iotop,这里从工具的安装、使用、优缺点进行分析,并给出目前缺少的监控工具
1 iostat
- 功能:用于报告CPU(中央处理器)统计信息和整个系统、适配器、tty设备、磁盘和CD-ROM的输入/输出统计信息;通过观察设备处于活动状态的时间(相对于其平均传输速率)来整理实时报告输出 ,主要用于监视nfs网络文件系统和本地文件系统。
- 参数详解:
- iostat [ -c | -d ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ device [ ... ] | ALL ] [ -p [ device | ALL ] ] [ interval [ count ] ]
- -c: 仅显示CPU统计信息.与-d选项互斥.
- -d:仅显示磁盘统计信息.与-c选项互斥.
- -k:以K为单位显示每秒的磁盘请求数,默认单位块.
- -m: 以M为单位显示每秒的磁盘请求数
- -p:device | ALL,与-x选项互斥,用于显示块设备及系统分区的统计信息.也可以在-p后指定一个设备名,如:# iostat -p hda 或显示所有设备# iostat -p ALL
- -t : 在输出数据时,打印搜集数据的时间.
- -V: 打印版本号和帮助信息.
- -x : 输出扩展信息
- 输出
- 输出分为avg-cpu段和Device段
- 常用命令
- iostat -xm 1 : 每秒输出一次cpu&device信息
- iostat -c 1 2 : 每秒输出一次cpu信息,总共输出2次
- iostat -d 2 : 间隔2秒输出一次device信息
- iostat -xm 1 /dev/sdb : 每秒输出1次sdb的device信息和cpu信息
- iostat -p /dev/sdb -d 1 2 : 每秒输出一次sdb的分区的设备信息,总共输出2次
- 注意事项
- util代表磁盘使用率,对于hdd,使用率达到100%代表已经达到磁盘瓶颈,但对于ssd并不代表已经达到瓶颈,因为util是按照(svctm*(r/s+w/s))/1000,对于ssd因为有并发,所以达到100%只能说明单通道达到了100%
- 参考来源:(23条消息) 优化命令iostat详解_灌南第一帅的博客-CSDN博客_iostat命令详解参数
2 sar
- 功能:系统维护的重要工具,主要帮助我们掌握系统资源的使用情况,特别是内存和CPU 的使用情况,是UNIX系统使用者应该掌握的工具之一
- 参数详解:
- sar [options] [-A] [-o file] t [n]
- 在命令行中,n 和t 两个参数组合起来定义采样间隔和次数,t为采样间隔,是必须有的参数,n为采样次数,是可选的,默认值是1,-o file表示将命令结果以二进制格式存放在文件中,file 在此处不是关键字,是文件名。options 为命令行选项
-
-A:所有报告的总和。
-
-u:CPU利用率
-
-v:进程、I节点、文件和锁表状态。
-
-d:硬盘使用报告。
-
-r:没有使用的内存页面和硬盘块。
-
-g:串口I/O的情况。
-
-b:缓冲区使用情况。
-
-a:文件读写情况。
-
-c:系统调用情况。
-
-R:进程的活动情况。
-
-y:终端设备活动情况
-
-w:系统交换活动。
- -p: 打印出设备名称,不加输出的是设备节点,如dev8-0
- -n: 某个端口设备的网络状态
- sar -d -v -R
- 输出:
-
-
DEV: 网卡/EDEV: 网卡(错误)
- NFS/NFSD/SOCK/IP/EIP/ICMP/EICMP/TCP/ETCP/UDP/SOCK6/IP6/EIP6/ICMP6/EICMP6/UDP6
-
-
- 常用命令:
- sar -d 1 : 间隔1s输出一次设备情况
- sar -u 1 10 : 间隔1s输出一次cpu使用情况,总共输出10次
- sar -d -f /var/log/sa/sa03 -p|grep -E "DEV|sd" : 从文件sa03中过滤出磁盘信息(sa03代表3号,最多保存一个月的日志)
- sar -r 1 10 -o mem.log : 将内存信息每秒打印一次,总共打印10s,并将结果输出到mem.log中
- sar -v 1 3 : 监控目前系统中的资源使用情况
- sar -r -f /var/log/sa/sa21 -p : 查看某天的内存使用情况
- 参考链接:
3 iotop
- 功能:一个类似 top 的工具,用来显示实时的磁盘活动。Linux下的IO统计工具如iostat,nmon等大多数是只能统计到per设备的读写情况。iotop 监控 Linux 内核输出的 I/O 使用信息,并且显示一个系统中进程或线程的当前 I/O 使用情况。它显示每个进程/线程读写 I/O 带宽。它同样显示当等待换入和等待 I/O 的线程/进程花费的时间的百分比。它是一款开源、免费的用来监控磁盘I/O使用状况的类似top命令的工具,iotop可以监控进程的I/O信息。它是Python语言编写的,与iostat工具比较,iostat是系统级别的IO监控,而iotop是进程级别IO监控。
- 参数:
- -o:只显示有io操作的进程
- -b:批量显示,无交互,主要用作记录到文件。
- -n NUM:显示NUM次,主要用于非交互式模式。
- -d SEC:间隔SEC秒显示一次。
- -p PID:监控的进程pid。
- -u USER:监控的进程用户
- -P :只显示进程,不显示线程
- -a :显示累计的io(从iotop启动)
- -k : 以KB为单位显示
- -t : 非交互模式下,显示时间
- -q: 只在第一次监测时显示列名. 去除头部一些行:这个参数可以设置最多3次来移除头部行:-q列头部只在最初交互显示一次;-qq列头部不显示;-qqq,I/O的总结不显示
- 输出:
- 常用命令:
- iotop -o -P : 显示有io操作的进程
- 参考链接:
4 top
- 功能:监视进程和Linux整体性能的工具,所有用户可使用
- 参数:
- top [-] [d delay] [q] [c] [S] [s] [n]
-
d : 改变显示的更新速度,或是在交谈式指令列( interactive command)按 s
-
q : 没有任何延迟的显示速度,如果使用者是有 superuser 的权限则 top 将会以最高的优先序执行
-
c : 切换显示模式,共有两种模式,一是只显示执行档的名称,另一种是显示完整的路径与名称
-
S : 累积模式,会将己完成或消失的子行程 ( dead child process ) 的 CPU time 累积起来
-
s : 安全模式,将交谈式指令取消, 避免潜在的危机
-
i : 不显示任何闲置 (idle) 或无用 (zombie) 的行程
-
n : 更新的次数,完成后将会退出 top
-
b : 批次档模式,搭配 “n” 参数一起使用,可以用来将 top 的结果输出到档案内
- 1 :交互界面中输入数字1,可查看每个cpu的情况
- b : 交互界面中输入字母b,可高亮显示当前运行进程
- 输出:
- 常用命令:
- top 然后在交互中输入i(仅活跃的进程),然后输入1(查看每个cpu的情况),然后输入b(高亮显示)
5 vmstat
- 功能:报告关于内核线程、虚拟内存、磁盘、陷阱和 CPU 活动的统计信息。由 vmstat 命令生成的报告可以用于平衡系统负载活动。系统范围内的这些统计信息(所有的处理器中)都计算出以百分比表示的平均值,或者计算其总和。Linux系统的内存分为物理内存和虚拟内存两种。物理内存是真实的,也就是物理内存条上的内存。而虚拟内存则是采用硬盘空间补充物理内存,将暂时不使用的内存页写到硬盘上以腾出更多的物理内存让有需要的进程使用。当这些已被腾出的内存页需要再次使用时才从硬盘(虚拟内存)中读回内存。这一切对于用户来说是透明的。通常对Linux系统来说,虚拟内存就是swap分区。vmstat(VirtualMeomoryStatistics,虚拟内存统计)是Linux中监控内存的常用工具,可对操作系统的虚拟内存、进程、CPU等的整体情况进行监视
- 参数:
-
- vmstat [-a] [-n] [-S unit] [delay [ count]} : -a显示活跃和非活跃内存 -n只在开始时显示列名称 dealy刷新的时间间隔 count输出的次数 -S:使用制定单位显示(k/K/m/M等)
- vmstat [-s] [-n] [-S unit] : -s显示系统相关信息(如内存/cpu等)
- vmstat [-m] [-n] [delay [ count]] : -m 显示slab信息
- vmstat [-d] [-n] [delay [ count]] : -d显示磁盘相关统计
- vmstat [-p disk partition] [-n] [delay [ count]] : -p显示磁盘分区统计信息
- vmstat [-f] : -f从系统启动至今的fork数量
- vmstat [-V] : -v显示版本信息
- 输出:
-
- swpd: 使用虚拟内存大小
- free: 可用内存大小
- buff: 用作缓冲的内存大小
- cache: 用作缓存的内存大小
- si: 每秒从交换区写到内存的大小
- so: 每秒写入交换区的内存大小
- bi: 每秒读取的块数
- bo: 每秒写入的块数
- in: 代表每秒的中断数目
-
- 常用命令:
- vmstat 1 5: 每隔1s输出一次,共输出5次
- vmstat -f : 查看系统已经fork了多少次
- vmstat -a : 查看active和非active内存情况【注:inact和active的数据来自于/proc/meminfo】
- vmstat -s : 查看内存占用总体情况
- vmstat -d 1 5 : 查看5次磁盘io情况 【注:这些信息主要来自于/proc/diskstats】
- vmstat -p /dev/sdb1 : 查看分区sdb1的情况,只能用来查看分区
- 参考链接:
6 pidstat
- 简介:
- sysstat工具的一个命令,用于监控全部或指定进程的cpu、内存、线程、设备IO等系统资源的占用情况。pidstat首次运行时显示自系统启动开始的各项统计信息,之后运行pidstat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息
- 参数:
- pidstat [ 选项 ] [ <时间间隔> ] [ <次数> ]
- -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:显示命令名和所有参数
- 输出:
- 常用命令:
- pidstat -d 1 -l: 显示磁盘io使用情况,并显示详细指令
- pidstat -r : 显示内存占用情况
- pidstat -u : 显示cpu占用情况
- 参考链接:
7 pt-ioprofile
- 简介
- Percona Toolkit简称pt工具,是Percona公司开发用于管理MySQL的工具,功能包括检查主从复制的数据一致性、检查重复索引、定位IO占用高的表文件、在线DDL等,DBA熟悉掌握后将极大提高工作效率,常用来定位哪个文件IO占用比较高,其原理是对某个pid附加一个strace进程进行IO分析, --profile-pid指定pid, --cell=sizes,该参数将结果已 B/s 的方式展示出来
- 参数:
- pt-ioprofile --profile-pid=18934 --cell=sizes
- 输出:
- 常用命令:
- pt-ioprofile --profile-pid=11220--cell=sizes
- 参考链接:
- 注意事项:
- pt-ioprofile可能会冻结服务,crash进程,是进程变得更糟糕,或者使进程休眠
- pt-ioprofile是一个有干扰的工具,一般不用在生产环境中,除非你能理解和接受风险
8 lsof
- 简介:lsof(list open files),一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能
- 参数:
- lsof [option] filename
- -c: 显示command列中包含string的进程所打开的文件
- -u: 显示某个用户打开的文件
- -a: 显示满足后续所有条件的文件
- -p: 列出进程号所打开的文件
- -h: 显示帮助信息
- -v: 显示版本信息
- -n:列出使用nfs的文件
- +D: 递归打开目录下的所有文件
- +d:列出目录下被打开的文件
- -d:列出占用该文件号的进程
- -g:列出gid(groupid)号进程详情
- -t:仅列出进程
- -r: 循环列出文件直到被中断,后面数字代表循环的频率,
- 输出:
-
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME init 1 root cwd DIR 3,3 1024 2 / init 1 root rtd DIR 3,3 1024 2 / init 1 root txt REG 3,3 38432 1763452 /sbin/init init 1 root mem REG 3,3 106114 1091620 /lib/libdl-2.6.so init 1 root mem REG 3,3 7560696 1091614 /lib/libc-2.6.so init 1 root mem REG 3,3 79460 1091669 /lib/libselinux.so.1 init 1 root mem REG 3,3 223280 1091668 /lib/libsepol.so.1 init 1 root mem REG 3,3 564136 1091607 /lib/ld-2.6.so init 1 root 10u FIFO 0,15 1309 /dev/initctl
- Command: 进程名称
- PID: 进程号
- USER: 用户名
- FD: 文件描述符,如cwd(某个进程运行时所在的目录) 、txt(程序代码,如应用程序的二进制库或者是共享库)、rtd(根目录)、mem(内存映射文件)、mmap(内存映射设备)、数字大头的(0|1|2U|R|W)
- TYPE: 类型,REG(文件)、DIR(目录)、CHR(字符)、BLK(块设备)、UNIX(套接字)、FIFO(先进先出队列)、IPV4(网际协议套接字)
- DEVICE: 指定磁盘的名称
- SIZE: 文件的大小
- NODE:索引节点,文件在磁盘上的标识
- NAME:打开文件的确切名称
-
- 常用命令
- lsof filename : 打开filename的所有进程
- lsof -c string: 显示command列中包含string的进程所打开的文件
- lsof -u user: 显示所属user进程打开的文件
- lsof -a -c string -u user :同时满足-c&-u两个属性的被打开的文件
- lsof -u ^baihh : 显示不属于baihh进程的文件
- lsof -i : 显示所有打开的端口
- lsof -i :80 : 显示所有打开80端口的进程
- lsof /dev/sda[1234] : 显示打开sda1 sda2 sda3 sda4中任意一个的设备的文件
- lsof -p 300,400,500 : 列出进程300、400、500打开的所有文件
- lsof -t -i: 列出使用某个端口的进程pid
- 参考链接:
9 dstat
- 简介
- 参数
- dstat [-afv] [option] [gap count]: 默认1s显示一次信息
- -c: 显示cpu信息
- -C:只显示指定cpu的信息
- -d:显示磁盘设备信息
- -n:显示网络设备信息
- -N: 指定要显示的网卡
- -g:显示页面(page)相关信息
- -y:显示系统(system)相关信息
- -a: 默认选项,等同于-cdngy
- -p: 显示进程状态
- -m: 显示内存使用情况
- -D: hda,total: include hds and total
- -s: 显示交换分区使用情况
- -S:类似于D/N
- -v: 等同于-pmgdsc -D total
- -r: io请求情况
- --output : 将输出结果以csv格式重定向到指定文件中(可用excel打开)
- -aio: 开启同步io统计
- -fs:开启文件系统统计
- -ipc:开启ipc统计
- -lock:开启文件锁统计
- -raw:开启raw统计(raw lock)
- -socket: 开启socket统计
- -tcp/-udp/-unix/-vm: 开启相关统计
- -stat 通过插件名称开启插件扩展,可能的插件包括(aio/cpu/disk/disk24/disk240ld/fs/int/mem/net/socket/vm等)
- -list:列出所有的插件名称
- -float/-integer: 终端显示浮点型/整型
- -nocolor: 无需颜色
- --disk-util : 显示某一时刻磁盘的繁忙程度
- --disk-tps:磁盘每秒事务数统计
- -top-io 显示正常I/O最大的进程
- --top-io-adv:详细显示
- --freespace 显示当前磁盘空间使用率
- -top-bio 显示块I/O最大的进程,仅显示进程
- --top-bio-ad : 详细显示最消耗块io的进程,包括pid和其他信息
- dstat --top-latency:显示哪个进程有最大的延迟
- 输出
-
[root@iZ23uulau1tZ ~]# dstat ----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system-- usr sys idl wai hiq siq| read writ| recv send| in out | int csw 0 0 99 0 0 0|7706B 164k| 0 0 | 0 0 | 189 225 0 0 100 0 0 0| 0 0 |4436B 826B| 0 0 | 195 248 1 0 99 0 0 0| 0 0 |4744B 346B| 0 0 | 203 242 0 0 100 0 0 0| 0 0 |5080B 346B| 0 0 | 206 242 0 1 99 0 0 0| 0 0 |5458B 444B| 0 0 | 214 244 1 0 99 0 0 0| 0 0 |5080B 346B| 0 0 | 208 242
- hiq: cpu硬中断的次数
- siq:cpu软中断的次数
- int:系统的中断次数(interrrupt)
- csw:系统的上下文切换次数(context switch)
-
- 常用命令
- dstat -stat disk --disk-util --top-io --freespace
- dstat -dD sda --top-io-adv: 显示指定盘的耗用cpu最多的进程【待验证】
- dstat --dstat : 显示dstat本身的cpu、延迟等
- 参考链接
10 atop
- 简介
11 sysdig
12 sysstat
13 iosnoop
- 简介
- 输入
- 无参数: 显示io执行时间,对应的设备,对应得进程号等
- -d maj,min: 磁盘号(主号和副号)
- -s : 显示开始时间
- -t: 显示结束时间
- 输出
-
- 常用命令
- ./iosnoop -st : 输出所有盘的io开始和结束时间
- ./iosnoop -d 65,96 -st : 显示制定盘的io开始时间和结束时间以及访问时间
- 65,96 和磁盘对应关系:
- 65,96 和磁盘对应关系:
参考:Linux 系统监控工具 atop - 走看看 (zoukankan.com)
11 ioping
参考:(23条消息) linux 查看共享磁盘_用于检测查看磁盘活动的Linux命令_小透明熊熊的博客-CSDN博客
总结:以上工具通过某些指令都可以用来分析磁盘io,但目前的工具还缺少分析指定盘的带宽占用进程统计,而此统计在实际应用有重要的意义,比如系统盘io占用,一般我们需要分析哪个进程占用系统盘的io资源比较多,据此来限制此进程的操作,若各位有这种工具,欢迎推荐,共同进步,增长见识!!!
20 系统盘相关