【问题标题】:How to track total data (including metadata) read/written to a disk in Ubuntu Linux?如何跟踪在 Ubuntu Linux 中读取/写入磁盘的总数据(包括元数据)?
【发布时间】:2019-07-20 21:50:42
【问题描述】:

我正在尝试跟踪 Linux 中特定进程写入或读取磁盘的总数据。 使用 dstat 工具,我可以使用dstat -d 跟踪系统范围的读取、写入调用。 使用strace -e trace=read,write,我可以跟踪系统调用的返回值。

这是一个示例程序,我想为其获取真实系统读写值(包括写入和读取磁盘的元数据):

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>

int main(){

char block[4096]="0";
int count=500;
int fd, size;

for(int i=0;i<4096;i++)
{
  char a='0';
  block[i]=a;
}

fd = open("file.txt",O_CREAT|O_WRONLY, 0644);

while(count--){
  size = write(fd,block,4096);
}
fsync(fd); //Flush all data to disk
close(fd);

iotop 之类的工具也没什么用,因为它们会给出不断变化的值。 dstat -d 选项是我最接近跟踪实际读取、写入值的方法,但我只想将其缩小到一个特定的进程,而 dstat 没有这样的选项。

感谢您的帮助!

【问题讨论】:

    标签: linux system-calls strace ptrace fsync


    【解决方案1】:

    好吧,它并不完美,但您仍然可以通过以下方式使用 strace:

    strace -o /tmp/out -e trace=read,write -p $(pidof name)  &
    

    另一方面,您可以每隔一秒循环运行以下序列:

    awk {'print $NF'} /tmp/out > /tmp/out2;
    echo "" > /tmp/out;
    awk '{ sum += $1 } END { print sum }' /tmp/out2
    

    其他注意事项:

    • 您可能需要对 strace 的输出进行额外清理(用于系统调用失败等)。
    • 读/写不是唯一与 io 相关的系统调用,但我假设您可以调整您感兴趣的进程的跟踪选项。
    • 如果您有一个多线程程序,您可能需要添加“-f”strace 标志。
    • 读/写与磁盘 io 无关,它们也可能与网络 io 相关。

    【讨论】:

      猜你喜欢
      • 2019-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-13
      • 2013-05-13
      • 2018-02-25
      • 1970-01-01
      相关资源
      最近更新 更多