我正在尝试跟踪在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相关。