DTrace

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

DTrace — фреймворк динамической трассировки, созданный компанией Sun Microsystems, предназначенный для отладки ядра и приложений в реальном времени. Изначально DTrace был создан для Solaris, затем был открыт под лицензией Common Development and Distribution Licence (CDDL) и портирован на ряд Unix-подобных систем.

DTrace может использоваться для наблюдения за количеством потребляемой памяти, процессорным временем, файловыми системами и сетевыми ресурсами, используемыми активными процессами, на работающей системе. Также можно получить более детальную информацию, например, список аргументов, с которыми вызывается каждая функция, или список процессов, использующих определённый файл.

Сценарии трассировки разрабатываются на специализированном языке[⇨]. Инструмент поддерживает взаимодействие с кодом, сгенерированным для программ, написанным на следующих языках программирования: Си, C++, Java, Erlang, JavaScript, Perl, PHP, Python, Ruby, Tcl, распознавая вызовы функций и исходные контексты вызовов. Ряд Unix-программ поддерживают DTrace, обеспечивая отслеживание операций и системных вызовов, в частности, специальные DTrace-провайдеры разработаны для СУБД MySQL, PostgreSQL, Oracle Database, грид-платформы Univa Grid Engine, браузера Firefox.

Инструмент безопасен для использования в работающей среде: во время тестирования почти не происходит снижения производительности.

Язык сценариев[править | править код]

Сценарии трассировки записываются на специально разработанном для инструмента языке D с си-подобным синтаксисом и оснащённый готовыми функциями и переменными, специфическими для трассировки[1]. Программы на D по структуре напоминают программы awk; они включают список датчиков (англ. probe), которым соответствуют действия. При удовлетворении определённому условию, датчик срабатывает и выполняется соответствующее действие. Условием может являться, например, открытие определённого файла, запуск процесса или исполнение определённой строки кода. Существует возможность передавать информацию от одного датчика другому.

Поскольку инструмент обеспечивает отслеживание с минимальными накладными издержками, одновременно могут быть запущены десятки тысяч датчиков, новые датчики могут быть созданы динамически.

Примеры использования[править | править код]

Сценарии DTrace могут быть запущены из командной строки, используя один или более датчиков в качестве аргументов. Примеры:

# New processes with arguments,
dtrace -n 'proc:::exec-success { trace(curpsinfo->pr_psargs); }'

# Files opened by process,
dtrace -n 'syscall::open*:entry { printf("%s %s",execname,copyinstr(arg0)); }'

# Syscall count by program,
dtrace -n 'syscall:::entry { @num[execname] = count(); }'

# Syscall count by syscall,
dtrace -n 'syscall:::entry { @num[probefunc] = count(); }'

# Syscall count by process,
dtrace -n 'syscall:::entry { @num[pid,execname] = count(); }'

# Disk size by process,
dtrace -n 'io:::start { printf("%d %s %d",pid,execname,args[0]->b_bcount); }'   

# Pages paged in by process,
dtrace -n 'vminfo:::pgpgin { @pg[execname] = sum(arg0); }'

Поддерживаемые платформы[править | править код]

DTrace был представлен в ноябре 2003 года и был официально выпущен как часть операционной системы Solaris 10 в январе 2005 года. Стал первым компонентом проекта OpenSolaris, исходный код которого выпущен под лицензией Common Development and Distribution License (CDDL).

В начале 2009 года DTrace был портирован во FreeBSD (версия 7.1).

Apple добавила поддержку DTrace в Mac OS X 10.5 «Leopard», включая графическую программу Instruments. В отличие от других платформ, в Mac OS X существует флаг (P_LNOATTACH), установка которого делает невозможным трассировку процессов такими средствами как DTrace или gdb. Изначально это создавало проблемы, так как в результате применения этого флага не могла тестироваться другая системная информация. Эта проблема была решена через несколько месяцев в обновлении Mac OS X 10.5.3.

Сообщалось о портировании DTrace на QNX 7.

Из-за лицензии CDDL, несовместимой с GPL, портирование в Linux возможно, но не легитимно. Для Linux разрабатывается утилита с близкой функциональностью под названием SystemTap на основе механизма инструментирования kprobes. Тем не менее, Oracle добавил бета-версию DTrace в Oracle Linux в 2011 году[2], в декабре 2012 года выпущена стабильная версия, инструмент доступен в составе ядра Unbreakable Enterprise Kernel (начиная со второго выпуска), при этом модуль ядра DTrace сохранил лицензию CDDL[3].

Примерные аналоги[править | править код]

Microsoft WPP/ETW, поддерживается от Windows Vista.

Технология разработана на основе WMI, в первую очередь событий WMI, и не более чем упрощает написание кода, возбуждающего данные события.

Исходные файлы с вызовами, возбуждающими события, должны обрабатываться неким препроцессором, который вынесет все строки формата (вызов возбуждения события похож на printf()) в отдельный бинарный файл (.TMF), оставив в переработанном исходном коде только параметры вызовов.

Без наличия TMF-файла для компоненты приложение-потребитель видит только номера событий и их параметры, но не текстовые описания.

Это сильно улучшает производительность системы. Также технология не приводит к снижению производительности в случае, если нет приложения-потребителя.

По состоянию на середину 2010-х годов Microsoft не опубликовал TMF-файлы ни к одному стандартному компоненту Windows, за исключение NDIS (опубликовано около конца 2010).

Примечания[править | править код]

  1. Это специальный предметно-ориентированный язык, созданный для DTrace, не имеющий ничего общего с языком программирования D общего назначения
  2. trying out dtrace
  3. DTrace on Linux

Ссылки[править | править код]

На английском[править | править код]

На русском[править | править код]