IOTOP输出得更有效率
IOTOP输出得更有效率
平常我们查看磁盘IO的时候,习惯使用iotop,例如查看大量文件复制时磁盘io的情况。

千万级文件同步,前期要大量读取文件进行对比,增量同步。iotop显示了很多无用的信息。有没有简单的方法只显示我们关心的进程io信息呢?
我们可以man iotop 看看详细的使用方法。
-p PID, --pid=PID
A list of processes/threads to monitor (all by default).
我们可以增加 –pid 参数只看我们关心的进程io信息。
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
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
29723 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % rsync -a --delete /wls/prdNfsNas/data/ /wls/data2
手工一个一个增加pid是不是有点麻烦?有没有再简单一点的方法呢?
使用rsync进行文件同步,我们先找出 rsync进程的pid:
# pgrep rsync
29714
29722
29723
29729
29730
父进程创建子进程,我们只看第一个就好:
pgrep rsync|head -1
将该进程PID存入变量留作备用:
parentID=$(pgrep rsync|head -1)
然后查看该父进程的树状结构:
# pstree -p $parentID
rsync_nas.sh(29714)───rsync_nas.sh(29722)───rsync(29723)───rsync(29729)───
过滤出相应的PID:
# pstree -p $parentID | grep -oE '[0-9]+'
29714
29722
29723
29729
29730
拼装成iotop要求的格式:
# pstree -p $parentID | grep -oE '[0-9]+' | sed 's/.*/--pid=&/'
--pid=29714
--pid=29722
--pid=29723
--pid=29729
--pid=29730
去掉换行符,多行变一行:
# pstree -p $parentID | grep -oE '[0-9]+' | sed 's/.*/--pid=&/' | tr "\n" " "
--pid=29714 --pid=29722 --pid=29723 --pid=29729 --pid=29730
最后变成带参数的iotop命令:
# pstree -p $parentID | grep -oE '[0-9]+' | sed 's/.*/--pid=&/' | tr "\n" " " | sed 's/^/iotop /'
iotop --pid=29714 --pid=29722 --pid=29723 --pid=29729 --pid=29730
一步一步看明白后,我们把上述命令组合成一个命令,方便日后使用:
parentID=$(pgrep rsync|head -1);$(pstree -p $parentID | grep -oE '[0-9]+' | sed 's/.*/--pid=&/' | tr "\n" " " | sed 's/^/iotop /')

是不是好看多了?很有意思吧,日后碰到类似的,可以举一反三,触类旁通。