Как отследить общее количество данных (включая метаданные), прочитанных / записанных на диск в Ubuntu Linux?

Я пытаюсь отследить суммарные данные, которые записываются или читаются с диска для определенного процесса в 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 такой опции нет.

Спасибо за помощь!

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, но я предполагаю, что вы можете настроить параметры трассировки для интересующего вас процесса.
  • Если у вас многопоточная программа, вы можете добавить флаг strace "-f".
  • чтение / запись не обязательно актуальны для disk io, они также могут быть актуальны для сетевого io.
Другие вопросы по тегам