如何正确按磁盘写入量排序iotop输出并提取Top10进程?
问题:iotop筛选Top10磁盘写入进程时排序异常
当前使用以下命令筛选磁盘写入量最高的Top10进程并记录日志:
/usr/sbin/iotop -b -n1 -qqq | sort -k1.36,1.43 -rn | head >> iotop.log
但按固定字符位置排序未考虑数值后的单位,导致排序结果异常:
TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND b' 48925 be/4 oracle 0.00 B/s 80.31 K/s 0.00 % 0.00 % tnslsnr LISTENER_SCAN1 -no_crs_notify -inherit' b' 49852 be/4 oracle 0.00 B/s 10.04 K/s 0.00 % 0.00 % ora_lg00_dbmxp2' b'1332594 be/4 root 0.00 B/s 6.67 M/s 0.00 % 0.00 % nessus-agent-module -q'
实际6.67 M/s的磁盘写入量远高于80.31 K/s,却排在最后,需要更优的排序方案。
优化方案
方法1:用Awk统一单位为字节后排序
通过Awk解析磁盘写入量的数值和单位,将其转换为统一的字节数,以此作为排序依据,最后还原原输出内容:
/usr/sbin/iotop -b -n1 -qqq | awk ' BEGIN { # 定义单位转换系数 unit["B/s"]=1 unit["K/s"]=1024 unit["M/s"]=1024*1024 unit["G/s"]=1024*1024*1024 } { # 拆分DISK WRITE列的数值和单位(第6列) split($6, val_unit, " ") bytes = val_unit[1] * unit[val_unit[2]] # 把转换后的字节数放在行首,方便排序 print bytes, $0 } ' | sort -rn | head -n10 | awk '{ $1=""; print substr($0, 2) }' >> iotop.log
- 第一步:Awk将每一行的磁盘写入量转为字节数,追加到行首
- 第二步:按字节数倒序排序
- 第三步:去掉行首的字节数,保留原格式内容并写入日志
方法2:利用iotop内置排序(仅针对IO总占比)
如果可以接受按总IO占比排序,直接使用iotop的-o(仅显示有IO活动的进程)和-P(按进程而非线程显示)参数,再取Top10:
/usr/sbin/iotop -b -n1 -qqq -o -P | head -n10 >> iotop.log
注意:此方法是按总IO占比排序,并非单独的磁盘写入量,若需严格按写入量排序,优先选方法1。
内容的提问来源于stack exchange,提问作者yong321
相关产品推荐
相关产品推荐

