如何跟踪总数据(包括元数据)读/写入Ubuntu Linux中的磁盘



我正在尝试跟踪在Linux中为特定过程写入或从磁盘上读取的总数据。使用DSTAT工具,我能够使用dstat -d跟踪系统范围的读取,编写呼叫。使用strace -e trace=read,write,我能够跟踪系统调用的返回值。

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

#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没有这样的选择。

谢谢您的帮助!

好吧,这不是完美的,但是您仍然可以使用以下方式使用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的Ouput进行其他清洁(用于Syscall失败等)。
  • 读/写入不是唯一相关的syscalls,但我认为您可以调整感兴趣的过程的跟踪选项。
  • 如果您有多线程程序,则可能要添加" -f" strace标志。
  • 读/写入与磁盘io无关,它们也可能与网络IO相关。

最新更新