diff options
Diffstat (limited to 'documentation/content/ru/books/handbook/dtrace/_index.adoc')
| -rw-r--r-- | documentation/content/ru/books/handbook/dtrace/_index.adoc | 247 | 
1 files changed, 247 insertions, 0 deletions
diff --git a/documentation/content/ru/books/handbook/dtrace/_index.adoc b/documentation/content/ru/books/handbook/dtrace/_index.adoc new file mode 100644 index 0000000000..a36b03b848 --- /dev/null +++ b/documentation/content/ru/books/handbook/dtrace/_index.adoc @@ -0,0 +1,247 @@ +--- +description: 'Эта глава объясняет, как использовать DTrace в FreeBSD' +next: books/handbook/usb-device-mode +params: +  path: /books/handbook/dtrace/ +part: 'Часть III. Администрирование системы' +prev: books/handbook/cutting-edge +showBookMenu: true +tags: ["DTrace", "features", "guide", "tutorial", "kldload"] +title: 'Глава 27. DTrace' +weight: 31 +--- + +[[dtrace]] += DTrace +:doctype: book +:toc: macro +:toclevels: 1 +:icons: font +:sectnums: +:sectnumlevels: 6 +:sectnumoffset: 27 +:partnums: +:source-highlighter: rouge +:experimental: +:images-path: books/handbook/dtrace/ + +ifdef::env-beastie[] +ifdef::backend-html5[] +:imagesdir: ../../../../images/{images-path} +endif::[] +ifndef::book[] +include::shared/authors.adoc[] +include::shared/mirrors.adoc[] +include::shared/releases.adoc[] +include::shared/attributes/attributes-{{% lang %}}.adoc[] +include::shared/{{% lang %}}/teams.adoc[] +include::shared/{{% lang %}}/mailing-lists.adoc[] +include::shared/{{% lang %}}/urls.adoc[] +toc::[] +endif::[] +ifdef::backend-pdf,backend-epub3[] +include::../../../../../shared/asciidoctor.adoc[] +endif::[] +endif::[] + +ifndef::env-beastie[] +toc::[] +include::../../../../../shared/asciidoctor.adoc[] +endif::[] + +[[dtrace-synopsis]] +== Обзор + +DTrace, также известный как Dynamic Tracing, был разработан Sun(TM) в качестве инструмента для выявления узких мест в производительности рабочих и предпроизводственных систем. Помимо диагностики проблем с производительностью, DTrace можно использовать для исследования и отладки неожиданного поведения как в ядре FreeBSD, так и в пользовательских программах. + +DTrace — это выдающийся инструмент для профилирования, обладающий впечатляющим набором возможностей для диагностики проблем в системе. Его также можно использовать для запуска предварительно написанных скриптов, чтобы воспользоваться его функциональностью. Пользователи могут создавать собственные утилиты, используя язык DTrace D, что позволяет настраивать профилирование в соответствии с конкретными потребностями. + +Реализация FreeBSD обеспечивает полную поддержку DTrace в ядре и экспериментальную поддержку DTrace в пользовательском пространстве. DTrace в пользовательском пространстве позволяет пользователям выполнять трассировку границ функций для программ пользовательского пространства с использованием провайдера `pid`, а также вставлять статические зонды в программы пользовательского пространства для последующей трассировки. Некоторые порты, такие как package:databases/postgresql12-server[] и package:lang/php74[], имеют опцию DTrace для включения статических зондов. + +Официальное руководство по DTrace поддерживается проектом illumos по адресу https://illumos.org/books/dtrace/bookinfo.html[illumos Dynamic Tracing Guide]. + +Прочитав эту главу, вы будете знать: + +* Что такое DTrace и какие возможности он предоставляет. +* Различия между реализацией DTrace в Solaris(TM) и реализацией, предоставляемой FreeBSD. +* Как включить и использовать DTrace в FreeBSD. + +Прежде чем читать эту главу, вы должны: + +* Понимать основы UNIX(R) и FreeBSD (crossref:basics[basics,Основы FreeBSD]). +* Иметь некоторое представление о безопасности и о том, как она относится к FreeBSD (crossref:security[security,Безопасность]). + +[[dtrace-implementation]] +== Различия в реализациях + +В то время как DTrace в FreeBSD схож с тем, что представлен в Solaris(TM), различия существуют. Основное различие заключается в том, что в FreeBSD DTrace реализован в виде набора модулей ядра, и DTrace нельзя использовать до загрузки этих модулей. Чтобы загрузить все необходимые модули: + +[source, shell] +.... +# kldload dtraceall +.... + +Начиная с FreeBSD 10.0-RELEASE, модули автоматически загружаются при запуске man:dtrace[1]. + +FreeBSD использует параметр ядра `DDB_CTF` для включения поддержки загрузки данных man:ctf[5] из модулей ядра и самого ядра. `CTF` — это Compact C Type Format от Solaris(TM), который инкапсулирует упрощённую форму отладочной информации, аналогичную `DWARF` и устаревшему stabs. Данные `CTF` добавляются в бинарные файлы с помощью инструментов сборки man:ctfconvert[1] и man:ctfmerge[1]. Утилита `ctfconvert` обрабатывает отладочные секции `DWARF``ELF`, созданные компилятором, а `ctfmerge` объединяет секции `CTF``ELF` из объектных файлов в исполняемые файлы или разделяемые библиотеки. + +В FreeBSD есть некоторые провайдеры, которых нет в Solaris(TM). Наиболее примечательным является провайдер `dtmalloc`, который позволяет трассировать man:malloc[9] по типам в ядре FreeBSD. Некоторые провайдеры, присутствующие в Solaris(TM), такой как `cpc`, отсутствуют в FreeBSD. Они могут появиться в будущих версиях FreeBSD. Кроме того, некоторые провайдеры, доступные в обеих операционных системах, несовместимы в том смысле, что их пробы имеют разные типы аргументов. Таким образом, скрипты `D`, написанные для Solaris(TM), могут работать или не работать без изменений в FreeBSD, и наоборот. + +Из-за различий в безопасности, только пользователь `root` может использовать DTrace в FreeBSD. В Solaris(TM) есть несколько проверок безопасности низкого уровня, которые пока отсутствуют в FreeBSD. Поэтому доступ к [.filename]#/dev/dtrace/dtrace# строго ограничился только пользователем `root`. + +DTrace распространяется под лицензией Common Development and Distribution License (`CDDL`). Чтобы ознакомиться с текстом этой лицензии в FreeBSD, см. [.filename]#/usr/src/cddl/contrib/opensolaris/OPENSOLARIS.LICENSE# или просмотрите её онлайн по адресу http://opensource.org/licenses/CDDL-1.0[http://opensource.org/licenses/CDDL-1.0]. Хотя ядро FreeBSD с поддержкой DTrace лицензировано под `BSD`, лицензия `CDDL` применяется при распространении модулей в бинарной форме или при загрузке бинарных файлов. + +[[dtrace-enable]] +== Включение поддержки DTrace + +В FreeBSD 9.2 и 10.0 поддержка DTrace встроена в ядро [.filename]#GENERIC#. Пользователям более ранних версий FreeBSD или тем, кто предпочитает статически компилировать поддержку DTrace, следует добавить следующие строки в пользовательский конфигурационный файл ядра и перекомпилировать ядро, следуя инструкциям в crossref:kernelconfig[kernelconfig,Настройка ядра FreeBSD]: + +[.programlisting] +.... +options         KDTRACE_HOOKS +options         DDB_CTF +makeoptions	DEBUG=-g +makeoptions	WITH_CTF=1 +.... + +Пользователи архитектуры AMD64 также должны добавить эту строку: + +[.programlisting] +.... +options         KDTRACE_FRAME +.... + +Эта опция обеспечивает поддержку man:dtrace_fbt[4]. Хотя DTrace будет работать без этой опции, поддержка трассировки входов и выходов функций будет ограничена. + +После перезагрузки системы FreeBSD с новым ядром или загрузки модулей DTrace с помощью `kldload dtraceall`, установите текущий DTrace Toolkit (package:sysutils/dtrace-toolkit[]) — набор готовых скриптов для сбора системной информации. Включает скрипты для проверки открытых файлов, использования памяти, загрузки CPU и многое другое. Некоторые скрипты также присутствуют в базовой системе FreeBSD — см. [.filename]#/usr/share/dtrace#. + +[NOTE] +==== +Скрипты в каталоге [.filename]#/usr/share/dtrace# были специально портированы для FreeBSD. Не все скрипты из DTrace Toolkit будут работать на FreeBSD без изменений, и для некоторых может потребоваться доработка. +==== + +Набор инструментов DTrace включает множество скриптов на специальном языке DTrace. Этот язык называется D и очень похож на C++. Подробное обсуждение языка выходит за рамки данного документа. Обратитесь к странице man:d[7] для обзора языка D в FreeBSD. Язык D также подробно рассмотрен в https://www.illumos.org/books/dtrace/bookinfo.html[illumos Dynamic Tracing Guide]. + +[[dtrace-out-of-kernel]] +== Включение DTrace во внешних модулях ядра + +Чтобы добавить поддержку DTrace во внешний модуль ядра, что полезно для разработки и отладки, включите следующую строку в Makefile модуля: + +[.programlisting] +.... +CFLAGS+= -DKDTRACE_HOOKS +.... + +Этот флаг включает DTrace-хуки во время компиляции, позволяя проводить расширенную отладку и мониторинг модуля. Убедитесь, что модуль перекомпилирован после этого изменения, чтобы активировать функциональность DTrace. + +[[dtrace-using]] +== Использование DTrace + +Скрипты DTrace состоят из списка одного или нескольких _проб_ (точек инструментирования), где каждая проба связана с действием. Когда условие для пробы выполняется, запускается соответствующее действие. Например, действие может происходить при открытии файла, запуске процесса или выполнении строки кода. Действие может заключаться в записи некоторой информации или изменении контекстных переменных. Чтение и запись контекстных переменных позволяют пробам обмениваться информацией и совместно анализировать взаимосвязь различных событий. + +Для просмотра всех проб администратор может выполнить следующую команду: + +[source, shell] +.... +# dtrace -l | more +.... + +У каждого зонда есть `ID`, `PROVIDER` (например, `dtrace` или `fbt`), `MODULE` и `FUNCTION NAME`. Дополнительную информацию об этой команде можно найти в man:dtrace[1]. + +Примеры в этом разделе дают общее представление о том, как использовать два полностью поддерживаемых скрипта из DTrace Toolkit: [.filename]#hotkernel# и [.filename]#procsystime#. + +Скрипт [.filename]#hotkernel# предназначен для определения функции, которая использует наибольшее время ядра. Он выводит информацию, похожую на следующую: + +[source, shell] +.... +# cd /usr/local/share/dtrace-toolkit +# ./hotkernel +Sampling... Hit Ctrl-C to end. +.... + +Как указано, используйте комбинацию клавиш kbd:[Ctrl+C], чтобы остановить процесс. После завершения скрипт отобразит список функций ядра и информацию о времени, сортируя вывод в порядке возрастания времени: + +[source, shell] +.... +kernel`_thread_lock_flags                                   2   0.0% +0xc1097063                                                  2   0.0% +kernel`sched_userret                                        2   0.0% +kernel`kern_select                                          2   0.0% +kernel`generic_copyin                                       3   0.0% +kernel`_mtx_assert                                          3   0.0% +kernel`vm_fault                                             3   0.0% +kernel`sopoll_generic                                       3   0.0% +kernel`fixup_filename                                       4   0.0% +kernel`_isitmyx                                             4   0.0% +kernel`find_instance                                        4   0.0% +kernel`_mtx_unlock_flags                                    5   0.0% +kernel`syscall                                              5   0.0% +kernel`DELAY                                                5   0.0% +0xc108a253                                                  6   0.0% +kernel`witness_lock                                         7   0.0% +kernel`read_aux_data_no_wait                                7   0.0% +kernel`Xint0x80_syscall                                     7   0.0% +kernel`witness_checkorder                                   7   0.0% +kernel`sse2_pagezero                                        8   0.0% +kernel`strncmp                                              9   0.0% +kernel`spinlock_exit                                       10   0.0% +kernel`_mtx_lock_flags                                     11   0.0% +kernel`witness_unlock                                      15   0.0% +kernel`sched_idletd                                       137   0.3% +0xc10981a5                                              42139  99.3% +.... + +Этот скрипт также работает с модулями ядра. Чтобы использовать эту возможность, запустите скрипт с ключом `-m`: + +[source, shell] +.... +# ./hotkernel -m +Sampling... Hit Ctrl-C to end. +^C +MODULE                                                  COUNT   PCNT +0xc107882e                                                  1   0.0% +0xc10e6aa4                                                  1   0.0% +0xc1076983                                                  1   0.0% +0xc109708a                                                  1   0.0% +0xc1075a5d                                                  1   0.0% +0xc1077325                                                  1   0.0% +0xc108a245                                                  1   0.0% +0xc107730d                                                  1   0.0% +0xc1097063                                                  2   0.0% +0xc108a253                                                 73   0.0% +kernel                                                    874   0.4% +0xc10981a5                                             213781  99.6% +.... + +Скрипт [.filename]#procsystime# захватывает и выводит время использования системных вызовов для заданного идентификатора процесса (`PID`) или имени процесса. В следующем примере был создан новый экземпляр [.filename]#/bin/csh#. Затем был запущен [.filename]#procsystime#, который оставался в ожидании, пока в другом экземпляре `csh` было набрано несколько команд. Вот результаты этого теста: + +[source, shell] +.... +# ./procsystime -n csh +Tracing... Hit Ctrl-C to end... +^C + +Elapsed Times for processes csh, + +         SYSCALL          TIME (ns) +          getpid               6131 +       sigreturn               8121 +           close              19127 +           fcntl              19959 +             dup              26955 +         setpgid              28070 +            stat              31899 +       setitimer              40938 +           wait4              62717 +       sigaction              67372 +     sigprocmask             119091 +    gettimeofday             183710 +           write             263242 +          execve             492547 +           ioctl             770073 +           vfork            3258923 +      sigsuspend            6985124 +            read         3988049784 +.... + +Как показано, системный вызов man:read[2] использовал наибольшее время в наносекундах, тогда как системный вызов man:getpid[2] использовал наименьшее количество времени.  | 
