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

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

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

1 Ответ

0 голосов
/ 06 июня 2019

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