0

我正在尝试跟踪 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 没有这样的选项。

谢谢您的帮助!

4

1 回答 1

0

好吧,它并不完美,但您仍然可以通过以下方式使用 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-06-06T08:37:49.637 回答