Callgrind / kcachegrind почему запуск программы в valgrind увеличивает время системного вызова?

#profiling #valgrind #callgrind #kcachegrind

Вопрос:

Я профилировал некоторый код, который, вероятно, тратит много времени на выполнение в системных вызовах. Синхронизация некоторых функций вручную и с помощью callgrind, callgrind сообщает, что время системных вызовов примерно в 20, 30 или 40 раз больше, чем просто синхронизация функции (что, конечно, также включает время процессора).

—collect-systime=ON использовался для сбора этого времени системного вызова для каждой функции.

Насколько я знаю, callgrind работает путем подсчета инструкций процессора, а для синхронизации системных вызовов просто позволяет ОС выполнять работу и не вмешивается. Я не понимаю, почему время, затрачиваемое на системные вызовы, увеличивается при профилировании с помощью callgrind, может ли кто-нибудь уточнить?

Является ли callgrind по-прежнему полезным инструментом для профилирования времени, проведенного в системных вызовах?

Ответ №1:

Можете ли вы попробовать --collect-systime=usec и --collect-systime=nsec посмотреть, существенно ли они отличаются? usec может быть, немного быстрее.

Когда указано —collect-systime, Valgrind будет вызывать один из различных системных вызовов времени для каждого из системных вызовов клиентского приложения. Я ожидал бы, что это добавит существенные накладные расходы, особенно если ваше клиентское приложение вызывает очень много «быстрых» системных вызовов.

Комментарии:

1. Это объясняет, почему существует несоответствие, что очень ценно. Значения usec и nsec не работают в моем valgrind, он принимает только » да » или «нет», вероятно, проблема с управлением версиями. Однако теперь я ожидаю, что эти накладные расходы будут пропорциональны «sysCount», что очень полезно. Спасибо!

2. Обратите также внимание, что помимо накладных расходов, используемых callgrind из-за системных вызовов времени, само ядро valgrind добавляет значительные накладные расходы ко всем системным вызовам, например, ему приходится выполнять некоторые системные вызовы sigprocmask до и/или после «реального» системного вызова приложения.