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

315
Lembik

Я синхронизирую некоторый код, и я хотел бы сказать, сколько времени уходит на чтение данных с диска. Я не верю результату, который timeдает мне. Например, у меня есть файл 1,3 ГБ, и если я запускаю, wcя получаю

time wc largefile.file  50000000 150000000 1316665179 largefile.file  real 0m26.835s user 0m18.363s sys 0m0.495s 

Это не могло занять <0,5 секунды, чтобы прочитать файл с моего старого жесткого диска.

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


Более подробная информация о том, почему я не вижу, как интерпретировать time. Если я сделаю

time cat largefile.file > /dev/null  real 0m24.230s user 0m0.060s sys 0m1.473s 

тогда хочется сказать, что на ввод-вывод уходит около 22,5 секунд. Но wcцифра сверху подразумевает, что это 8 секунд. Эти две цифры не соответствуют.

2
Лучше повторить 2 измерения при перезагрузке перед каждым. Если файл даже частично находится в памяти, тогда измерение ложно. harrymc 9 лет назад 1
@harrymc Я только что сначала `sync && sudo bash -c 'echo 3> / proc / sys / vm / drop_caches'` получил тот же результат. Это не эффект кэширования, так как общее время одинаково. Lembik 9 лет назад 0
sync не очищает кэш памяти - он просто гарантирует, что блоки, помеченные как грязные, будут записаны на диск. harrymc 9 лет назад 0
@harrymc ОК, но если вы не сделаете синхронизацию, время составит около 0 секунд. Lembik 9 лет назад 0
Поскольку Linux использует кэш-память очень эффективно, при измерении нужно быть очень осторожным. harrymc 9 лет назад 0

1 ответ на вопрос

2
sourcejedi

sys means cpu time spent in-kernel, but you want io-wait time.

Googling turned up another stack exchange answer pointing at "per-process iowait from /proc/$pid/stat". (And maybe need to run the programmer under a debugger and set a breakpoint on exit() / _exit(), so you can read out the iowait before the process goes away ?).

Often I just calculate it by subtracting the cpu time (user+sys) from the realtime. That assumes the process doesn't wait for things you don't count as "IO".

Спасибо. Я добавил некоторые к вопросу, чтобы показать, где моя путаница. Вычитание времени процессора (пользователь + sys) из реального времени не дает однозначных ответов. Lembik 10 лет назад 0
Хорошая точка зрения. Я могу сказать, почему этого не происходит: ввод-вывод может происходить «в фоновом режиме», пока процесс все еще использует процессор. Это время считается временем процессора, а не ожиданием. Надеемся, что большинство программистов понимают фоновые записи (см. Fsync), то есть обратную запись. Фоновое чтение происходит из-за [упреждающего чтения] (https://lwn.net/Articles/155510/). Может быть, мы можем получить то, что хотим, запустив задачу в неактивной системе (хах) и посмотрев поля миллисекунд чтения / записи в `vmstat -d`. sourcejedi 9 лет назад 0

Похожие вопросы