Моя цель - профилировать время выполнения каждой функции в модуле ядра. Используя образцы сценариев, которые я видел в Интернете, я придумал следующий сценарий, чтобы удовлетворить мои потребности. Но иногда я получаю отрицательные значения для рассчитанных латентностей. Хотя, они случаются редко, но я предполагаю, что это указывает на то, что с моим скриптом что-то не так. Может ли кто-нибудь помочь мне с этим, пожалуйста?Скрипт SystemTap для фильтрации задержек функций
probe module(@1).function(@2).call {
begin = gettimeofday_ns()
}
probe module(@1).function(@2).return {
if (begin>0)
stats <<< gettimeofday_ns() - begin
}
probe end {
if (begin == 0) {
printf("No samples observed so far.\n");
} else {
printf("Distribution of %s latencies (in nanoseconds) for %d samples\n", @2, @count(stats))
printf("max/avg/min: %d/%d/%d\n", @max(stats), @avg(stats), @min(stats))
print(@hist_log(stats))
}
}
global begin, stats
Спасибо, это сработало! Я подозревал, что проблема заключается в том, что переменная «begin» является скалярной, но поскольку это мой опыт работы с SystemTap, не имел понятия, что делать. В любом случае, просто из любопытства: если бы я хотел сохранить проблему FOO.call и использовать начальную переменную, как раньше (в основном, не используя @entry), как я могу решить проблему с скалярной переменной? – soofyaan
Вы можете сделать массив и проиндексировать его с помощью tid(). (Могут возникнуть другие осложнения, такие как рекурсивная функция, и в этом случае вам нужно индексировать также уровень вложенности, или ядро может по какой-то причине пропустить зонд .call или .return, и в этом случае сценарий должен терпеть плохое состояние.) – fche