区分磁盘 I/O 和套接字 I/O 的命令

区分磁盘 I/O 和套接字 I/O 的命令

我想测量每天对 /dev/sda 的 I/O 量。所以我尝试了,

iotop -aoP

这是 1 天后的输出:

磁盘写入命令
   55.06 G python /usr/bin/xpra 启动:103
    3.35 G [btrfs-transacti]
  773.73 M [btrfs-清洁器]
   25.20 M python /usr/bin/xpra 附加:103
   19.33 万 [kworker/u4:3]
   15.88 万 [kworker/u4:5]
    9.79 M rsyslogd

问题是输出没有区分对 /dev/sda 的 I/O 和对 X11 套接字 /tmp/.X11-unix/X103 的 I/O。例如,领先的条目仅对 X11 套接字执行 I/O。我不确定条目 [btrfs-transacti] 是在执行磁盘 I/O 还是套接字 I/O。

是否有其他工具可以确定块设备的真实 I/O?

到目前为止,我已经尝试了 iotop、iostat、blktrace、/sys/block/sda/stat 和 /proc/diskstats。

答案1

你可以试试SystemTap(stap)

它是为具有更高级内核知识的用户设计的,但我从初学者指南中找到了两页,似乎可以满足您的要求:I/O 监控(按设备)汇总磁盘读/写流量

另外,如果你决定使用它初学者指南是相当不错的资源。

答案2

我最初尝试了 Victor Nonov 的回答中提到的 SystemTap 脚本,但它们产生的结果与 iotop 类似。

然后我尝试了另一个源自的 SystemTap 脚本这篇博文

#! /usr/bin/env stap
# bio.stp

global writes

probe ioblock.request {
    if(bio_rw_num(rw) == BIO_WRITE){
           writes[devname] <<< size
           printf("Device: %s  bytes_written: %d\n", devname, @sum(writes[devname]))
    }
}

probe end {
    printf("\n")
    foreach([devname] in writes-) {
        printf("Device: %s  bytes_written: %d\n", devname, @sum(writes[devname]))
    }
}

但这也产生了与iotop类似的结果。

最后我找到了博客文章来自作者跟踪其中指出 SystemTap 脚本“在虚拟文件系统 (VFS) 级别而不是磁盘级别进行跟踪“。作者提供了一个 DTrace 脚本,声称可以测量在 VFS 和磁盘级别读取的字节数。(该脚本仅测量读取,而不测量写入)。

#!/usr/sbin/dtrace -qs
     2
dtrace:::BEGIN { printf("Tracing... Hit Ctrl-C to end.\n"); }
     4
fbt::fop_read:entry
{    
        @io[execname, "VFS"] = sum(args[1]->uio_resid);
}    
     9
io:::start
/args[0]->b_flags & B_READ/ 
{   
        @io[execname, "disk"] = sum(args[0]->b_bcount);
}   
    15
dtrace:::END
{   
        printf("   %-18s %-8s %12s\n", "EXEC", "LEVEL", "BYTES");
        printa("   %-18s %-8s %@12d\n", @io);
} 

不幸的是,我在编译 DTrace 时遇到了麻烦,所以无法测试该脚本。

相关内容