2010-11-22 3 views
2

Я делаю некоторое интенсивное программирование ввода/вывода в C на GNU/Linux, и я хотел бы иметь возможность отслеживать все вызовы ввода-вывода и знать тайминги, которые приложение тратит спать, ожидая ввода-вывода для каждого вызоваИнструмент для трассировки таймингов системных вызовов io

Appart from the DIY method using gettimeoftheday везде, есть ли какой-нибудь инструмент для этого? Я хочу иметь возможность отличать вызовы друг от друга.

Ех выход, который был бы полезным:

 
sendto at myprog.c:42 : 30µs 
recvfrom at myprog.c:48 : 45µs 
... 

Примечание: то, что я хочу, это в режиме реального времени, а не процессорное время, как правило, дают профайлеров.

Благодаря

+0

Что такое ОС? Например. В Mac OS X есть «Инструменты», которые делают такие вещи. – 2010-11-22 18:40:20

+0

Немного от темы, но на всякий случай это станет высоким результатом в Google. Чтобы сделать именно это в `python`, вы можете проверить этот инструмент http://mg.pov.lt/blog/you-gotta-love-profiling.html – Falmarri 2010-11-22 18:48:35

ответ

3

Команда strace имеет опцию -T, которая должна делать то, что вам нужно. Я проверил исходный код, он вызывает gettimeofday (2), чтобы получить время, поэтому он сообщает время настенных часов, а не время процессора.

Пример вывода из strace -p 2956 -T на компьютере:

stat("/proc/sys/fs/binfmt_misc", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0 <0.000028> 
stat("/media/Klatch", {st_mode=S_IFDIR|0711, st_size=4096, ...}) = 0 <0.000021> 
stat("/media/Drum", {st_mode=S_IFDIR|0711, st_size=4096, ...}) = 0 <0.000021> 
close(18)        = 0 <0.000019> 
munmap(0x7fa088e60000, 4096)   = 0 <0.000022> 
open("/etc/mtab", O_RDONLY)    = 18 <0.000024> 
fstat(18, {st_mode=S_IFREG|0644, st_size=742, ...}) = 0 <0.000015> 

время находится в конце строки, в секундах. Это составляет от 15 до 28 микросекунд для системных вызовов в приведенном выше примере.

+0

Принять более глубокий взгляд на опции синхронизации, которые дает вам strace. Существуют режимы абсолютного, относительного и кумулятивного таймера. Все они имеют хорошее применение. – Marcin 2010-11-22 19:03:00

0

Существует швейцарский армейский нож, который по какой-то странной причине не все знают, может быть, потому что это слишком просто (и также уродливо). Запустите его под GDB и just pause it несколько раз, например 10. Каждый раз изучайте стек вызовов.

Если 50% времени находится в режиме ввода-вывода, 50% +/- образцов отобразит его в I/O, и каждая строка кода в стеке вызовов покажет часть цепочки причин он выполняет ввод-вывод. То же самое для сна или любого другого блокирующего вызова. Если время не заблокировано, как вы пузырь-сортировка огромного массива, это покажет это тоже и почему. Если он проводит время в какой-либо системной библиотеке, где вы просто не знаете (или не заботитесь), если она заблокирована или нет, такая же сделка.

Если это займет больше времени, потому что какой-то другой процесс использует часть процессорного времени, это не имеет значения, потому что это не очень сильно изменяет то, как ваш код проводит свое время на процентной основе. Вы все равно узнаете, сколько IO или сон или хруст, который вы делаете, в процентах, и именно поэтому.

Если вы хотите что-то красивое, хотя и не более эффективно, дайте Zoom попытку.

Смежные вопросы