Как отследить общее количество данных (включая метаданные), прочитанных / записанных на диск в 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.