---
title: Бүлэг 26. DTrace
part: хэсэг III. Системийн Удирдлага
prev: books/handbook/cutting-edge
next: books/handbook/partiv
---

[[dtrace]]
= DTrace
:doctype: book
:toc: macro
:toclevels: 1
:icons: font
:sectnums:
:sectnumlevels: 6
:source-highlighter: rouge
:experimental:
:skip-front-matter:
:toc-title: Гарчиг
:table-caption: Хүснэгт
:figure-caption: Зураг
:example-caption: Жишээ
:xrefstyle: basic
:relfileprefix: ../
:outfilesuffix:
:sectnumoffset: 26

ifeval::["{backend}" == "html5"]
:imagesdir: ../../../images/books/handbook/dtrace/
endif::[]

ifeval::["{backend}" == "pdf"]
:imagesdir: ../../../../static/images/books/handbook/dtrace/
endif::[]

ifeval::["{backend}" == "epub3"]
:imagesdir: ../../../../static/images/books/handbook/dtrace/
endif::[]

include::shared/authors.adoc[]
include::shared/releases.adoc[]
include::shared/mn/mailing-lists.adoc[]
include::shared/mn/teams.adoc[]
include::shared/mn/urls.adoc[]

toc::[]

[[dtrace-synopsis]]
== Ерөнхий агуулга

DTrace буюу Dynamic Tracing (Динамик Мөрдөлт) нь үйлдвэрлэлд ашиглаж байгаа болон ашиглахын өмнөх системүүдэд үйл ажиллагааны саад тотгоруудыг олоход зориулагдсан Sun(TM)-с хөгжүүлсэн хэрэгсэл юм. Энэ нь ямар ч тохиолдолд дибаг хийгч хэрэгсэл биш боловч үйл ажиллагаа болон бусад асуудлуудыг цаг тухайд нь олох системийн анализ хийхэд зориулагдсан хэрэгсэл юм.

DTrace нь системийн асуудлуудыг оношлоход зориулагдсан сэтгэл хөдлөм боломжуудтай гайхамшигтай профиль хийгч хэрэгсэл юм. Энэ нь өөрийн боломжуудыг ашиглахын тулд өмнө нь бичигдсэн скриптүүдийг ажиллуулж бас болдог. Хэрэглэгчид нь тусгай зориулалтаар өөрсдийн профиль хийлтийг өөрчлөх боломжтой DTrace D хэлийг ашиглан бүр өөрсдийн хэрэгслүүдийг зохиож болох юм.

Энэ бүлгийг уншсаны дараа, та дараах зүйлсийг мэдэх болно:

* DTrace гэж юу болох ямар ямар боломжуудаар хангадаг талаар.
* Solaris(TM)-ийн DTrace шийдэл болон FreeBSD-д байгаа хоёрын хоорондын ялгаанууд.
* FreeBSD дээр DTrace-ийг хэрхэн идэвхжүүлж ашиглах талаар.

Энэ бүлгийг уншихаасаа өмнө та дараах зүйлсийг гүйцэтгэх хэрэгтэй:

* UNIX(R) болон FreeBSD-ийн үндсүүдийг (crossref:basics[basics,Юниксийн үндэс]) ойлгох.
* Цөмийн тохиргоо/эмхэтгэлтийн (crossref:kernelconfig[kernelconfig,FreeBSD цөмийг тохируулах нь]) үндсийг мэддэг байх.
* Аюулгүй байдлын талаар болон энэ нь FreeBSD-д хэрхэн хамааралтай байх талаар зарим ойлголттой байх (crossref:security[security,Аюулгүй байдал]).
* FreeBSD эхийг хэрхэн авч дахин бүтээх талаар ойлгох (crossref:cutting-edge[updating-upgrading,FreeBSD-г шинэчилж сайжруулах нь]).

[WARNING]
====

Энэ боломж нь туршилтын гэж тооцогддог. Зарим тохиргоонууд ажиллагааны хувьд дутуу, зарим хэсэг нь ерөөсөө ажиллахгүй байж болох юм. Цагийн явцад энэ боломж нь үйлдвэрлэлд ашиглагдахад бэлэн гэж тооцогдох бөгөөд энэ баримт нь тэр тохиолдолд таарахаар өөрчлөгдөх болно.
====

[[dtrace-implementation]]
== Шийдлийн ялгаанууд

FreeBSD дээрх DTrace нь Solaris(TM)-д байдагтай маш төстэй боловч цааш үргэлжлүүлэхээсээ өмнө тайлбарлах ёстой ялгаанууд байдаг. Хэрэглэгчдийн мэдрэх үндсэн ялгаа нь FreeBSD дээр DTrace нь тусгайлан идэвхжүүлэх ёстой байдаг. DTrace нь зөв ажиллахын тулд идэвхжүүлсэн байх ёстой цөмийн тохиргоонууд болон модулиуд байдаг. Эдгээрийг дараа тайлбарлах болно.

CTF өгөгдлийг цөмийн модуль болон цөмөөс өөрөөс нь дуудахад зориулсан дэмжлэгийг идэвхжүүлэх цөмийн `DDB_CTF` тохиргоо байдаг. CTF нь Solaris(TM)-ийн Compact C Type буюу Шахмал C Төрөл бөгөөд DWARF болон venerable stab-уудтай (хүндтэй хатгалтууд) адил дибаг мэдээллийн багасгасан хэлбэрийг агуулдаг. Энэ CTF өгөгдөл нь `ctfconvert` болон `ctfmerge` гэсэн бүтээх хэрэгслүүдээр хоёртын файлуудад нэмэгддэг. `ctfconvert` хэрэгсэл нь эмхэтгэгчийн үүсгэсэн DWARFELF дибаг хэсгүүдийг задлан ялгаж `ctfmerge` нь обьектуудын CTFELF хэсгүүдийг ажилладаг файлууд юм уу эсвэл хуваалцсан сангууд руу нийлүүлдэг. Цөм болон FreeBSD бүтээлтэд зориулж үүнийг хэрхэн идэвхжүүлэх талаар дэлгэрэнгүй тайлбар удахгүй бичигдэх болно.

Solaris(TM)-д байдгаас өөр хангагчид FreeBSD-д байдаг. Хамгийн алдартай нь `dtmalloc` хангагч бөгөөд FreeBSD цөмд `malloc()`-ийг төрлөөр нь мөрдөх боломжийг бүрдүүлдэг.

Зөвхөн `root` DTrace-ийг FreeBSD дээр ашиглаж болно. Энэ нь аюулгүй байдлын ялгаатай холбоотой бөгөөд FreeBSD-д байдаггүй хэдэн доод түвшний аюулгүй байдлын шалгалтууд Solaris(TM)-д байдаг. Тийм болохоор [.filename]#/dev/dtrace/dtrace# нь зөвхөн `root` хэрэглэгчээр хатуу хязгаарлагдсан байдаг.

Төгсгөлд нь DTrace програм хангамж нь Sun(TM)-ий CDDL лицензийн доор байдаг. `Common Development and Distribution License` буюу Нийтлэг Хөгжүүлэлт ба Түгээлтийн Лиценз нь FreeBSD-тэй цуг ирдэг бөгөөд [.filename]#/usr/src/cddl/contrib/opensolaris/OPENSOLARIS.LICENSE# юм уу эсвэл онлайн хэлбэрээр http://www.opensolaris.org/os/licensing[http://www.opensolaris.org/os/licensing] хаягаас харж болно.

Энэ лиценз нь DTrace тохиргоотой FreeBSD цөм нь BSD лицензтэй хэвээр гэсэн үг боловч модулиуд нь хоёртын хэлбэрээр түгээгдэх үед юм уу эсвэл хоёртын файлууд дуудагдсан үед CDDL нь хүчин төгөлдөр болдог.

[[dtrace-enable]]
== DTrace дэмжлэгийг идэвхжүүлэх

DTrace-д зориулсан дэмжлэгийг идэвхжүүлэхийн тулд дараах мөрүүдийг цөмийн тохиргооны файлд нэмнэ:

[.programlisting]
....
options         KDTRACE_HOOKS
options         DDB_CTF
....

[NOTE]
====
AMD64 архитектурын хэрэглэгчид өөрсдийн цөмийн тохиргооны файлдаа дараах мөрийг нэмэхийг хүсэх болно:

[.programlisting]
....
options         KDTRACE_FRAME
....

Энэ тохиргоо нь FBT боломжид зориулсан дэмжлэгийг хангадаг. DTrace нь энэ тохиргоогүйгээр ажилладаг боловч функцийн хязгаарын мөрдөлтөд зориулсан дэмжлэг хязгаарлагдмал байх болно.
====

Бүх эх CTF тохиргоонуудтай дахин бүтээгдэж суулгагдсан байх ёстой. Ингэхийн тул FreeBSD-ийн эхийг доорх тушаалуудыг ашиглан дахин бүтээнэ:

[source,bash]
....
# cd /usr/src

# make WITH_CTF=1 kernel
....

Системийг дахин ачаалах хэрэгтэй.

Дахин ачаалж шинэ цөмийг санах ойд дуудагдсаны дараа Korn бүрхүүлийн дэмжлэгийг нэмэх хэрэгтэй. DTrace хэрэгслүүд нь `ksh` дээр бичигдсэн хэд хэдэн хэрэгслүүдтэй болохоор энэ нь хэрэгтэй юм. package:shells/ksh93[]-г суулгах хэрэгтэй. Эдгээр хэрэгслүүдийг package:shells/pdksh[] эсвэл package:shells/mksh[] дээр ажиллуулж бас болно.

Төгсгөлд нь одоогийн DTrace хэрэгслүүдийг олж авах хэрэгтэй. Хэрэв FreeBSD 10 бол DTrace хэрэгслүүдийг [.filename]#/usr/shared/dtrace# байрлалаас олж болно. Үгүй бол DTrace хэрэгслүүдийг package:sysutils/DTraceToolkit[] портоос суулгаж болно.

[[dtrace-using]]
== DTrace-г ашиглах

DTrace боломжийг ашиглахаас өмнө DTrace төхөөрөмж байх хэрэгтэй. Төхөөрөмжийг дуудахын тулд дараах тушаалыг ажиллуулна:

[source,bash]
....
# kldload dtraceall
....

DTrace дэмжлэг одоо боломжтой болсон байх ёстой. Бүх шалгалтыг харахын тулд администратор дараах тушаалыг одоо ажиллуулж болно:

[source,bash]
....
# dtrace -l | more
....

Дэлгэцийн буфферийг түргэн дүүргэх болохоор бүх гаралтыг `more` хэрэгсэл рүү дамжуулдаг. Энд хүрэхэд DTrace-ийг ажиллаж байна гэж үзнэ. Одоо уг хэрэгслийг шалгаж үзэх цаг боллоо.

Уг хэрэгсэл нь системийн мэдээллийг цуглуулахын тулд DTrace-тэй цуг ажиллуулж болох ашиглахад бэлэн скриптүүдийн цуглуулга юм. Нээлттэй файлууд, санах ой,CPU-ийн хэрэглээ болон өөр олон зүйлсийг шалгах скриптүүд байдаг. Скриптүүдийг дараах тушаалаар задалж болно:

[source,bash]
....
# gunzip -c DTraceToolkit* | tar xvf -
....

`cd` ашиглан тэр сан руу өөрчилж жижиг үсгээр бичигдсэн нэртэй бүх файлууд дээр ажиллуулах зөвшөөрлүүдийг `755` руу өөрчлөх хэрэгтэй.

Эдгээр бүх скриптүүдийн агуулгад өөрчлөлт хийх хэрэгтэй болно. [.filename]#/usr/bin/ksh# гэснийг [.filename]#/usr/local/bin/ksh# болгох ёстой бөгөөд [.filename]#/usr/bin/sh#-ийг [.filename]#/bin/sh# болгон ашиглахаар, төгсгөлд нь [.filename]#/usr/bin/perl#-г [.filename]#/usr/local/bin/perl# болгон ашиглахаар болгож өөрчлөх хэрэгтэй.

[IMPORTANT]
====
FreeBSD дээрх DTrace дэмжлэг нь _бүрэн бус_ бөгөөд _туршилтын_ гэдгийг уншигчид сануулах нь ухаалаг болох юм. Эдгээр скриптүүдийн олонхи нь ажиллахгүй бөгөөд тэдгээр нь хэтэрхий Solaris(TM)-д тусгайлан зориулсан эсвэл одоо дэмжигдээгүй байгаа шалгалтуудыг ашигладаг.
====

Үүнийг бичиж байх үед DTrace хэрэгслийн зөвхөн хоёр скрипт FreeBSD дээр бүрэн дэмжигдсэн: эдгээр нь [.filename]#hotkernel# болон [.filename]#procsystime# скриптүүд юм. Эдгээр хоёрыг бид энэ бүлгийн дараагийн хэсгүүдэд авч үзэх болно.

[.filename]#hotkernel# нь аль функц цөмийн ихэнх хугацааг ашиглаж байгааг илрүүлэхээр хийгдсэн. Хэвийнээр ажиллуулахад энэ нь дараахтай төстэй гаралтыг харуулах болно:

[source,bash]
....
# cd /usr/shared/dtrace/toolkit
# ./hotkernel
Sampling... Hit Ctrl-C to end.
....

Системийн администратор процессийг зогсоохын тулд kbd:[Ctrl+C] товчлуурын хослолыг ашиглах ёстой. Зогсоосны дараа скрипт нь цөмийн функцуудын жагсаалт болон хугацааны мэдээллийг харуулах бөгөөд гаралтыг хугацааны ихэссэн дарааллаар эрэмбэлж харуулна:

[source,bash]
....
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,bash]
....
# ./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,bash]
....
# ./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
....

Энд үзүүлснээр `read()` системийн дуудлага ихэнх цагийг, `getpid()` системийн дуудлага хамгийн бага хугацааг ашигласныг наносекундаар харуулж байна.

[[dtrace-language]]
== D хэл

DTrace хэрэгсэл нь DTrace-ийн тусгай хэл дээр байдаг олон скриптүүдийг агуулдаг. Энэ хэл нь Sun(TM)-ийн баримтаар "D хэл" гэгддэг бөгөөд C++ хэлтэй тун төстэй юм. Энэ хэлний талаарх гүнзгий хэлэлцүүлэг нь энэ баримтаас хүрээнээс гадна юм. Энэ нь http://wikis.oracle.com/display/DTrace/Documentation[http://wikis.oracle.com/display/DTrace/Documentation] хаяг дээр дэлгэрэнгүй хэлэлцэгдсэн байдаг.
