如何解决iotop输出中磁盘写入进程排序的单位识别问题,正确获取Top10高写入进程并记录日志
解决iotop输出按磁盘写入量正确排序的问题
首先,最优雅的解决方案是直接利用iotop自身的排序功能,不需要额外调用sort命令——这不仅更高效,还能完全避免单位解析的问题:
方案一:用iotop内置的排序选项
iotop支持通过--sort参数指定排序字段,并且可以加-前缀实现降序排序。对于磁盘写入量,我们可以用--sort=-DISK_WRITE:
/usr/sbin/iotop -b -n1 -qqq --sort=-DISK_WRITE | head >> iotop.log
说明:
--sort=-DISK_WRITE:让iotop直接按**磁盘写入量(降序)**排列进程,内部已经处理了单位转换(K/M/G/s),排序结果完全符合实际大小。- 这个方案省去了管道中额外的
sort步骤,减少了系统开销,逻辑也更清晰。
方案二:用GNU sort的人类可读排序(如果需要保留管道处理)
如果因为某些原因必须用sort命令,GNU sort提供的-h选项可以直接识别带单位的数值(K/M/G等),自动按实际大小排序。你只需要调整sort的列参数,指向DISK WRITE字段(默认是第5列):
/usr/sbin/iotop -b -n1 -qqq | sort -k5,5hr | head >> iotop.log
说明:
-k5,5:指定按第5列(DISK WRITE)排序;h:启用人类可读数值排序,自动解析K/M/G后缀;r:反向排序(从大到小);- 注意:这个方案依赖GNU sort,大部分现代Linux发行版默认都包含,但如果是嵌入式系统或非GNU环境可能不支持。
方案三:手动用awk转换单位(兼容性最强)
如果你的系统没有GNU sort,或者需要更灵活的处理,可以用awk将所有写入量转换成统一的字节每秒数值,再排序:
/usr/sbin/iotop -b -n1 -qqq | awk '{ # 拆分DISK WRITE字段为数值和单位 split($5, write_val, / /) num = write_val[1] unit = write_val[2] # 转换为字节每秒 if (unit == "K/s") num *= 1024 else if (unit == "M/s") num *= 1024^2 else if (unit == "G/s") num *= 1024^3 # 把转换后的数值放在行首,方便排序 print num, $0 }' | sort -nr | cut -d' ' -f2- | head >> iotop.log
说明:
awk先将K/M/G/s转换成字节每秒的数值,把这个数值放在每行开头;sort -nr按数值反向排序;cut -d' ' -f2-去掉开头的数值,恢复原来的输出格式;- 这个方案兼容性极强,几乎能在所有支持awk和sort的系统上运行。
内容的提问来源于stack exchange,提问作者yong321
相关产品推荐
相关产品推荐

