Инструмент для отслеживания времени системных вызовов io - PullRequest
2 голосов
/ 22 ноября 2010

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

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

Ex для вывода, который был бы полезен:

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

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

Спасибо

Ответы [ 2 ]

3 голосов
/ 22 ноября 2010

Команда 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 голосов
/ 23 ноября 2010

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

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

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

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

...