Я хотел бы измерить количество операций ввода-вывода в день в /dev /sda. Я попробовал,

iotop -aoP

Вот вывод через 1 день:

DISK WRITE       COMMAND
   55.06 G      python /usr/bin/xpra start :103
    3.35 G      [btrfs-transacti]
  773.73 M      [btrfs-cleaner]
   25.20 M      python /usr/bin/xpra attach :103
   19.33 M      [kworker/u4:3]
   15.88 M      [kworker/u4:5]
    9.79 M      rsyslogd

Проблема в том, что выходные данные не различают ввод / вывод в / dev / sda и ввод / вывод для сокета X11, / tmp /.X11-Unix / X103. Например, ведущая запись выполняет ввод-вывод только для сокета X11. Я не уверен, выполняет ли запись [btrfs-transacti] дисковый ввод-вывод или сокет-ввод / вывод.

Есть ли другой инструмент, который может определить истинный ввод / вывод для блочного устройства?

До сих пор я пробовал iotop, iostat, blktrace, /sys /block /sda /stat и /proc /diskstats.

2 ответа2

0

Вы можете попробовать SystemTap (степ).

Он предназначен для пользователей с более глубокими знаниями ядра, но я нашел две страницы из руководства для начинающих, которые, кажется, выполняют то, что вы хотите: мониторинг ввода-вывода (по устройству) и суммирование трафика чтения / записи диска.

Кроме того, если вы решите пойти с ним, руководство для начинающих является довольно хорошим ресурсом.

0

Сначала я попробовал сценарии SystemTap, упомянутые в ответе Виктора Нонова, но они дали результаты, аналогичные iotop.

Затем я попробовал другой скрипт SystemTap, полученный из этого поста,

#! /usr/bin/env stap
# bio.stp

global writes

probe ioblock.request {
    if(bio_rw_num(rw) == BIO_WRITE){
           writes[devname] <<< size
           printf("Device: %s  bytes_written: %d\n", devname, @sum(writes[devname]))
    }
}

probe end {
    printf("\n")
    foreach([devname] in writes-) {
        printf("Device: %s  bytes_written: %d\n", devname, @sum(writes[devname]))
    }
}

но это также дало результаты, аналогичные iotop.

В конце концов я обнаружил найденное в блоге сообщение от автора DTrace, в котором говорится, что сценарии SystemTap « отслеживаются на уровне виртуальной файловой системы (VFS), а не на уровне диска ». Автор включает в себя сценарий DTrace, который утверждает, что измеряет количество прочитанных байтов как на уровне VFS, так и на уровне диска. (Сценарий измеряет только чтение, а не запись).

#!/usr/sbin/dtrace -qs
     2
dtrace:::BEGIN { printf("Tracing... Hit Ctrl-C to end.\n"); }
     4
fbt::fop_read:entry
{    
        @io[execname, "VFS"] = sum(args[1]->uio_resid);
}    
     9
io:::start
/args[0]->b_flags & B_READ/ 
{   
        @io[execname, "disk"] = sum(args[0]->b_bcount);
}   
    15
dtrace:::END
{   
        printf("   %-18s %-8s %12s\n", "EXEC", "LEVEL", "BYTES");
        printa("   %-18s %-8s %@12d\n", @io);
} 

К сожалению, у меня возникли проблемы с компиляцией DTrace, поэтому я не смог протестировать этот скрипт.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .