Как сценарий SystemTap может определить текущее количество потоков?

Я хочу написать сценарий SystemTap, который может определить фактическое количество потоков для текущего PID внутри вызова зонда. Число должно быть таким же, как показано в выходных данных /proc/4711/status в данный момент.

Мой первый подход заключался в подсчете возникновения событий kprocess.create и kprocess.exit, но это, очевидно, дает вам только относительное увеличение/уменьшение количества потоков.

Как сценарий SystemTap может использовать одну из заданных функций API для определения этого числа? Может быть, сценарий каким-то образом мог прочитать ту же информацию о ядре, которая используется для вывода файловой системы proc?


person Peter Tröger    schedule 09.01.2013    source источник


Ответы (1)


В любом случае вы будете подвержены условиям гонки — stap-зонд не может блокировать структуры ядра, что необходимо для гарантии того, что список задач не изменится во время его подсчета. Это особенно верно для общего контекста проверки systemtap, например, в середине kprobe.

Для первого подхода вы можете добавить итерацию списка задач во время «пробного начала {}», чтобы заполнить начальные счетчики потоков из бита встроенного кода C. Одной из проблем может быть установка глобальных переменных сценария systemtap из встроенного кода C (для этого нет задокументированного API), но если вы посмотрите на то, что генерирует транслятор (stap -p3), это должно быть выполнимо.

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

person fche    schedule 09.01.2013