1.简介
iotop:一款类似top的I/O监控工具。
项目主页:http://guichaz.free.fr/iotop/
iotop由python编写(运行需安装Python ≥ 2.7)通过linux内核(2.6.20以上)来监控I/O信息,通过列表的方式展示了当前系统中进程/线程的I/O使用率。如果想要通过iotop获取I/O信息,那么在Linux内核编译时,需要开启CONFIG_TASK_DELAY_ACCT、CONFIG_TASK_IO_ACCOUNTING, CONFIG_TASKSTATS 和 CON‐FIG_VM_EVENT_COUNTERS这三个变量。
iotop监控的主要项:
- 进程/线程的I/O的读写带宽
- 进程/线程swapin的耗时占比
- 进程/线程的I/O阻塞(等待)耗时占比
- 每个进程/线程的I/O优先级
- 系统中I/O总读写带宽
- 系统中I/O实际读写带宽(和总读写带宽有时候值并不一致)
2.安装
2.1 yum/apt安装
Ubuntu
sudo apt install -y iotop
Centos
sudo yum install -y iotop
2.2 源码安装
#下载源码
git clone git://repo.or.cz/iotop.git
#进入对应目录
cd iotop
#编译
python setup.py build
#安装
sudo python setup.py install
3.帮助
输入:iotop -h
Usage: /usr/sbin/iotop [OPTIONS]
DISK READ and DISK WRITE are the block I/O bandwidth used during the sampling
period. SWAPIN and IO are the percentages of time the thread spent respectively
while swapping in and waiting on I/O more generally. PRIO is the I/O priority at
which the thread is running (set using the ionice command).
/*
DISK READ:采样周期内读磁盘的带宽(平均值)
DISK WRITE:采用周期内写磁盘的带宽(平均值)
SWAPIN:磁盘换入的时间占总时间的百分比(内存不够用的时候会进行内存换入到磁盘)
IO: 普通的磁盘读写等待时间占总时间的百分比
PRIO: 进程/线程进行I/O调度时候的优先级(使用ionice设定)
*/
Controls: left and right arrows to change the sorting column, r to invert the
sorting order, o to toggle the --only option, p to toggle the --processes
option, a to toggle the --accumulated option, i to change I/O priority, q to
quit, any other key to force a refresh.
/*
按键控制:
⬅️/➡️:选择排序的列
r:按逆序排列当前IO进程/线程列表
o:同--only参数
p: 同--processes参数
a: 同--accumulated参数
i: 改变I/O优先级
q: 退出iotop
其他任意键:强制刷新当前IO进程/线程列表
*/
Options:
--version show program's version number and exit //显示版本信息
-h, --help show this help message and exit //显示帮助信息
-o, --only only show processes or threads actually doing I/O //显示当前有I/O活动的进程或者线程(也就是没有进行IO操作的进程/线程不展示到列表)
-b, --batch non-interactive mode //非交互模式,即后台模式(这个可以把信息重定位输出到某个文件)
-n NUM, --iter=NUM number of iterations before ending [infinite] //信息刷新次数,默认一直刷新,不会自行退出;如果指定该参数为N,则iotop在更新N次列表信息后自动退出(此参数在批处理模式下比较方便)
-d SEC, --delay=SEC delay between iterations [1 second] //信息刷新间隔,即每隔几秒刷新一次,默认为每隔一秒刷新一次
-p PID, --pid=PID processes/threads to monitor [all] //筛选展示特定PID的进程或者线程,默认为所有进程/线程
-u USER, --user=USER users to monitor [all] //筛选展示特定用户下进程/线程IO,默认为所有用户
-P, --processes only show processes, not all threads //筛选只展示进程的IO信息,默认展示所有进程和线程的IO信息
-a, --accumulated show accumulated I/O instead of bandwidth //设置IO的值为累计IO而不是实时IO
-k, --kilobytes use kilobytes instead of a human friendly unit //设置IO的单位为KB/s,默认根据IO大小自行进行单位适配。(在批处理模式下设置比较方便统计)
-t, --time add a timestamp on each line (implies --batch) //批处理模式,在每行前面加上时间戳
-q, --quiet suppress some lines of header (implies --batch) //批处理模式,只在打印一次列名
-qq column names are never printed, //不打印列名
-qqq the I/O summary is never printed. //连概要信息也不打印
4.例子
1.每隔十秒打印一次信息,仅打印有活跃I/O的进程和线程数据
iotop -d 10 -o
2.每隔十秒打印一次信息,设置单位为KB/s,仅打印有活跃I/O的进程和线程数据
iotop -d 10 -o -k
3.每隔十秒打印一次信息,设置单位为KB/s, 使用累加模式,仅打印有活跃I/O的进程和线程数据
iotop -d 10 -o -k -a
如图:红框里面变成累加值而不是实时值(对比上图)
4.批处理模式1
每隔十秒将iotop中的有活跃IO的进程/线程相关信息输出到文件控制台,并同时输出到文件
iotop -d 10 -o -b | tee iotop.result
5.批处理模式2
其他同上,增加了两个参数,-n和-k,使用计量单位为KB/s,统计十次后自动退出
iotop -d 10 -o -b -k -n 10 | tee iotop.result
6.批处理模式3
这里指定了只打印PID为2025的进程,且在每行都加上时间戳
iotop -p 2025 -t -b -n 10 | tee iotop.result
5. 自动化
我们可以利用第六个例子来获取机器上指定进程的IO信息
例如:机器上部署了两个服务,进程id分别为2025和345,然后执行如下命令(-n自行修改,-n的次数乘以-d的时间即为总统计时间,如下面应该是10*10等于100秒)
iotop -p 2025 -p 345 -t -b -n 10 -d 10| tee iotop.result
然后用awk或者python解析iotop.result,可以生成对应的csv文件。
利用csv文件可以再excel中绘制曲线图或者用python的图形库直接绘图。
博主:测试生财(一个不为996而996的测开码农)
座右铭:专注测试开发与自动化运维,努力读书思考写作,为内卷的人生奠定财务自由。
内容范畴:技术提升,职场杂谈,事业发展,阅读写作,投资理财,健康人生。
csdn:https://blog.csdn.net/ccgshigao
博客园:https://www.cnblogs.com/qa-freeroad/
51cto:https://blog.51cto.com/14900374
微信公众号:测试生财(定期分享独家内容和资源)