You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确按磁盘写入量排序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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 13:32:28