Команда, яка розрізняє введення / виведення диска та вхід / вивід сокета


0

Я хотів би виміряти кількість вводу / виводу на день до / dev / sda. Тому я спробував,

iotop -aoP

Ось результат через 1 день:

DISK WRITE COMMAND
   55,06 G python / usr / bin / xpra start: 103
    3,35 G [btrfs-transacti]
  773,73 М [очищувач btrfs]
   25.20 M python / usr / bin / xpra вкладення: 103
   19,33 М [kworker / u4: 3]
   15,88 М [kworker / u4: 5]
    9,79 М rsyslogd

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

Чи є інший інструмент, який може визначити справжній введення / вивід блокового пристрою?

Поки я спробував iotop, iostat, blktrace, / sys / block / sda / stat та / proc / diskstats.


Я, мабуть, мав би згадати, що / dev / sda має файлову систему btrfs.
А. Нгуєн

Відповіді:


0

Ви можете спробувати SystemTap (stap) .

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

Крім того, якщо ви вирішили піти з ним, посібник для початківців - це досить непоганий ресурс.


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]))
    }
}

але це також дало результати, схожі на йотоп.

Нарешті я знайшов публікацію в блозі від автора 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, тому мені не вдалося протестувати цей сценарій.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.