Вывод профилировщика функций Linux

Я хотел бы профилировать поток кода в ядре, чтобы понять, где узкое место. Я обнаружил, что профилировщик функций делает именно это для меня: https://lwn.net/Articles/370423/ К сожалению, вывод, который я вижу, не имеет смысла для меня. По ссылке выше вывод профилировщика функции:

 Function        Hit        Time              Avg
--------          ---       ----              ---   
schedule         22943    1994458706 us     86931.03 us

Где "Время" - это общее время, проведенное внутри этой функции во время выполнения. Так что если у меня есть function_A, которая вызывает function_B, если я правильно понял вывод, то "Время", измеренное для function_A, также включает в себя продолжительность function_B.

Когда я действительно запускаю это на моем компьютере, я вижу другой новый столбец, отображаемый для вывода:

Function           Hit     Time          Avg          s^2   
--------           ---     ----          ---          ---           
__do_page_fault    3077   477270.5us    155.109 us  148746.9us
(more functions..)

Что означает s^2? Это не может быть стандартным отклонением, потому что оно выше среднего...

Я измерил общую продолжительность этого потока кода из пространства пользователя и получил 400 мс. При суммировании столбца s^2 он приблизился к 400 мс. Это заставляет меня думать, что, возможно, это "чистое" время, проведенное в __do_page_fault, которое включает в себя продолжительность вложенных функций.

Это правильно? Я не нашел никакой документации по колонке s^2, поэтому не решаюсь сделать выводы.

Спасибо!

1 ответ

Вы можете увидеть код, который рассчитывает s^2 колонка здесь. Кажется, что это дисперсия (стандартное отклонение в квадрате). Если вы возьмете корень из числа в вашем примере, вы получите 385 нас, что ближе к среднему в этом примере.

Стандартное отклонение все еще больше, чем среднее значение, но это нормально.

Другие вопросы по тегам