Представлен релиз системы динамической трассировки SystemTap 2.1, предоставляющий для платформы Linux средства похожие на технологию DTrace. SystemTap позволяет организовать доскональное наблюдение за работающей Linux системой, производить сбор статистики о работе приложений, профилирование и контроль системных вызовов. Управление производится через интерфейс командной строки и специальный Си-подобный язык сценариев. Система протестирована с ядрами Linux начиная с версии 2.6.9 и заканчивая 3.8-rc.
В развитии проекта участвуют такие компании как Red Hat, IBM, Intel, Hitachi и Oracle. В каталоге примеров представлено более 100 скриптов на все случаи жизни, подходящие для слежения за распределением памяти, вводом/выводом, дисковыми операциями, сетевым трафиком (например, анализ работы NFS), работой планировщика задач, обработкой прерываний, использованием системных буферов, установкой блокировок, выполнением системных вызовов, обработкой сигналов и т.п.
Основные улучшения версии 2.1:
- Изменения во фронтэнде (утилите stap):
- Реализованы режимы редактирования файлов сценариев systemtap, работающие в стиле EMACS и VIM;
- Транслятор теперь исключает дубликаты tapset-файлов, встречающиеся при наличии в системе нескольких параллельно установленных наборов правил, что позволяет избежать конфликта при использовании нескольких установленных вариантов systemtap (например, поставляемого с системой и собранного вручную);
- В транслятор добавлена поддержка опции "--suppress-time-limits" (работает в режиме гуру "-g"), при которой перестают действовать заданные в правилах ограничения, привязанные ко времени, что позволяет протестировать работу обработчика в любой момент времени, не дожидаясь нужного периода;
- При выводе ошибок теперь упоминается дополнительная информация о характере проблемы, которую можно получить через man-руководства error::X и warning::X (например, man warning::432);
- Улучшения в языке сценариев:
- Данные о событиях, доступных через подсистему ядра Perf ("perf events") теперь можно читать по требованию. Проверки состояния счётчика могут быть определены в форме counter("NAME"), например "probe perf.type(0).config(0).counter("NAME")";
- Проверки через подсистему Perf могут быть прикреплены к определённым процессам при помощи параметра process("NAME"), например "probe perf.type(0).config(0).process("NAME") { }";
- В циклах foreach теперь может выполняться сортировка агрегированных массивов с использованием произвольной агрегатной функции, например "foreach ([x,y] in array @sum +) { println(@sum(array[x,y])) }";
- Начальная реализация поддержки регулярных выражений, что позволяет выполнять такие сопоставления, как "if ("aqqqqqb" =~ "q*b") { ... }" или "if ("abc" !~ "q*b") { ... }". Реализация построена с использованием инструментария re2c и близка по возможностям и синтаксису к POSIX Extended Regular Expressions, поддерживаемым в glibc. Пока не реализованы возможности выделения частей частей строк и субвыражений, не поддерживаются именованные классы символов ([:alpha:], [:digit:], &c и т.п.);
- Улучшена работа бэкенда dyninst, предоставляющего возможность анализа пользовательских процессов без необходимости загрузки специфичных модулей для ядра Linux и, соответственно, не требующего root-привилегий. Обеспечена поддержка параллельной обработки при проверке многопоточных программ. Обеспечено продолжение проверки после выполнения исследуемым процессом вызова fork. Добавлена поддержка новых типов проверок, таких как таймеры, возвращаемые функциями параметры, привязки к началу/концу выполнения процесса/нити. Добавлена поддержка трассировки уже запущенного процесса через указание опции "-x PID";
- Добавлен тапсет choose_defined.stpm с реализацией макроса @choose_defined(). Объявлены устаревшими тапсеты signal.send.return и signal.handle.return;
- Новые примеры использования SystemTap:
- Примеры трассировки переведены на использование ppfunc() вместо probefunc();
- perf.stp - использование perf.counter для доступа к параметрам производительности;
- regex.stp - проверка имён открываемых файлов в соответствии с регулярным выражением;
- threadstacks.stp - переопределяет используемые по умолчанию значения размера стека new-pthread;
- mutex_contention.stp - анализ конкуренции mutex-ов в pthread;
- ltrace.stp - демонстрация ltrace на базе uprobes;
- pingpong.stp, block.stp, eater.stp, lifegame.stp - набор демонстрационных игр.