IOTOP输出得更有效率

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 /')

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

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注