Apr 19 2009

karuwak

DTrace Basic

Posted at 2:20 am under Dtrace, Unix / OpenSolaris

DTrace adalah sebuah fasilitas perunut dinamis komprehensif yang tersedia di Sistem Operasi Solaris 10. Pemanfaatan fasilitas ini ditujukan kepada:

  • Administrators System
  • Teknisi Pendukung Layanan (Service Support Personnel)
  • Pengembang Kernel
  • Pengembang Program Applikasi
  • DTrace dapat digunakan oleh root dan pengguna biasa yang diberi hak-khusus DTrace melalui fasilitas Role-based Access Control (RBAC) di Solaris 10.

Fitur-fitur DTrace

DTrace memiliki fitur-fitur berikut:

  • Memungkinkan modifikasi dinamis terhadap sistem untuk mengumpulkan data-data tertentu
  • Melakukan perunutan di sistem yang aktif
  • Sangat aman karena tidak menimbulkan kegagalan fatal yang tak-terduga
  • Memungkinkan perunutan terhadap program kernel dan program tingkat-pengguna
  • Menjalankan fungsinya dengan beban-kerja rendah ketika perunutan terjadi dan beban-kerja nol ketika perunutan tidak dilakukan.

Kegagalan Transien

Fasilitas DTrace sangat berguna untuk menemukan penyebab utama kegagalan transien. Kegagalan transien adalah suatu perilaku yang tak-diharapkan tetapi tidak menyebabkan kegagalan fatal di sistem. Misalnya:

  • Sebuah aplikasi terhenti dengan pesan kesalahan “file tidak ditemukan”
  • Sebuah aplikasi tidak memberikan tanggapan apa-apa, terperangkap dalam sebuah loop di tingkat pengguna (userland level)
  • Atau, kegagalan transien dipahami juga sebagai sebuah definisi operasi sistem yang “tidak seperti diharapkan”:
  • “Kami berharap per CPU dapat mengakomodasi 100 pengguna, tetapi kenyataan hanya mendukung hingga 60 pengguna CPU.”
  • “Setiap pagi antara pukul 9:30 dan 10:00, kinerja sistem menurun secara drastis”
  • “Mengapa pewaktuan sistem “go way up” ketika saya menjalankan aplikasi ‘X’?”

DTrace dikembangkan untuk menyediakan metode yang lebih efisien dan efektif-biaya untuk mencari penyebab kegagaln transien. Selama ini telah tersedia utilitas-utilitas terfokus-proses untuk men-debug kegagalan transien seperti:

  • truss(1)
  • pstack(1)
  • prstat(1M)

Sayangnya, utilitas-utilitas ini tidak dirancang untuk men-debug masalah-masalah sistemik

Utilitas seperti mdb(1) dan Solaris Crash Analysis Tool (Solaris CAT) dirangcang untuk analisa ***-kematian. Analisa ***-kematian (post-mortem analysis) dapat dilakukan untuk men-debug kegagalan transien dengan menginduksikan kegagalan fatal selama periode kegagalan transien. Sangat nyata, bahwa teknik ini memiliki kekurangan-kekurangan sebagai berikut:

  • Memerlukan penginduksian kegagalan fatal yang hampir selalu memerlukan waktu-tanpa-layanan (downtine) yang lebih lama dibandingkan kegagalan transien-nya sendiri.
  • Ini memerlukan pemecahan masalah yang dinamis dari snapshot statik status sistem.

Men-debug dengan Teknik-teknik yang Invasif

Utilitas-utilitas di atas tidak dapat menemukan penyebab utama kegagalan transien sehingga dibuat teknik-teknik yang lebih invasif. Ini memerlukan pengembangan instrumentasi khusus untuk program kernel dan program pengguna yang mengalami kegagalan. Teknik ini memerlukan fasilitas yang disebut Trace Normal Form (TNF) yang digunakan untuk mereproduksi masalah yang sama dengan menggunakan biner-biner ter-instrumentasi. Teknik ini dilakukan dengan:

  • Menjalankan biner-biner ter-instrumentasi di lingkungan produksi
  • Mereproduksi masalah transient di lingkungan pengembangan

Teknik seperti ini tidak banyak dipraktekan karena memerlukan waktu yang lama, besar kemungkinan mengalami kesalahan dan seringkali tidak efektif.

Kemampuan-kemampuan DTrace

Kerangka kerja DTrace memiliki sekitar 10000 titik-titik perunutan yang disebut probe. Ketika titik instrumentasi diaktifkan maka pengumpulan data-data di dalam kernel atau proses pengguna dapat dilakukan.
Sebuah contoh probe yang disediakan oleh kerangka-kerja DTrace adalah titik-masuk (entry) ke dalam setiap fungsi-fungsi kernel. Informasi yang dapat diperoleh ketika probe ini aktif adalah:

  • Setiap argumen yang diberikan kepada fungsi tersebut
  • Variable global yang ada di dalam Kernel
  • Catatan waktu dalam nanosecond yang diperlukan ketika sebuah fungsi dipanggil
  • Perunutan terhadap stack untuk mengindikasikan kode-kode apa yang dipanggil oleh fungsi ini
  • Process yang sedang berjalan ketika fungsi ini dipanggil
  • Thread yang membuat panggilan terhadap fungsi ini

Gunakan DTrace untuk mengeksplorasi terhadap semua aspek di dalam Solaris 10 OS  sehingga bermanfaat untuk:

  • Memahami bagaimana perangkat lunak tertentu bekerja
  • Menentukan penyebab-utama masalah-masalah kinerja
  • Mengamati semua lapisan fungsional perangkat lunak dari tingkat pengguna hingga kernel
  • Melacak sumber dari perilaku tak-normal

DTrace dilengkapi dengan primitif-primitif manajemen data yang tangguh untuk menyingkirkan kebutuhan ***-pemprosesan data yang terkumpul. Data unwanted di pruned as cloase to the source as possible untuk mencegah beban-kerja akibat membangkitkan dan memfilter unwanted data. DTrace juga menyediakan mekanisme untuk merunut selama proses boot dan mendapatkan semua data perunutan dari kernel crash dump.

Arsitektur DTrace

DTrace membantu pemahaman kerja sistem perangkat lunak dengan kemampuannya untuk secara dinamis memodifikasi kernel dan proses pengguna untuk merekam data tambahan yang dispesifikasikan di lokasi tertentu.

Probe
Probe adalah sebuah lokasi program atau aktifitas – contoh, setiap tik pendetak sistem – dimana kepada probe DTrace dapat mengikatkan sebuah permintaan untuk melakukan sekumpulan aksi seperti merekam penelusuran stack, catatan waktu atau argumen sebuah fungsi.

Bagaimana Probe bekerja?
Probes mirip dengan sensor dapat-diprogram yang disisipkan di titik-titik strategis di dalam sistem operasi. DTrace berguna untuk memprogram sensor-sensor tertentu untuk merekam informasi yang diperlukan. Saat setiap probe memicu (fires), DTrace mengumpulkan data yang berasal dari probe dan menampilkannya ke pengguna. Jika tidak ada aksi dispesifikasikan, DTrace merekam kapan setiap probe memicu dan di CPU mana.

Penyedia (Providers)
Penyedie DTrace menyediakan sekitar 10000 berbagai tipe probe. Probe diimplementasikan oleh penyedia. Sebuah penyedia adalah modul kernel yang mengaktifkan probe agar memicu ketika diakses. Salah satu penyedia adalah penyedia fbt “funcation boundary. Penyedia ini menyediakan probe titik-masuk dan titik-balik untuk hampir semua fungsi di dalam modul kernel.

Bagaimana Probes diaktifkan ?
Probes dan aksi didefinisikan dengan menggunakan bahasa pemograman D. Bahasa D dibuat berbasiskan bahasa pemograman C. Biasanya program D disimpan di dalam file skrip berakhiran .d. Program D diteruskan kepada Konsumer DTrace. Konsumer DTrace generik utama adalah perintah dtrace(1M).
Program D yang dibuat oleh pengguna dikompilasi oleh Konsumer DTrace menjadi bentuk objek yang disebut D intermediate Format (DIT). DIT kemudian dikirim ke kerangka-kerja DTrace di dalam kernel untuk dieksekusi. Probe-probe yang terdapat di dalam program D kemudian di-enable dan penyedia bersangkutan melakukan instrumentasi yang diperlukan untuk memicu probe-probe tersebut.

Komponen-komponen DTrace

DTrace memiliki komponen-komponen berikut:

  • Probe
  • Penyedia
  • Konsumer
  • Bahasa pemograman D

Sebagian besar kerangka-kerja DTrace berada di dalam kernel.

Probe
Probe memiliki atribut-atribut berikut:

  • Probe disediakan oleh sebuah penyedia
  • Probe mengidentifikasikan nama modul dan fungsi yang menyatakan kemampuan instrumentasi probe tersebut
  • Probe memiliki sebuah nama

Keempat atribut ini mendefinisikan sebuah 4-tuple yang secara unik mengidentifikasikan setiap probe:

provider:module:function:name

Selain itu, setiap probe juga memiliki identitas berupa bilangan bulat yang unik.

Penyedia
Penyedia merepresentasikan sebuah metodologi untuk melakukan instrumentasi terhadap sistem. Penyedia menyediakan probe bagi kerangka-kerja DTrace. Penyedia menerima informasi dari DTrace ketika sebuah probe diaktifkan (enable) dan mentransfer kontrol ke DTrace ketika probe yang aktif memicu.

Beberapa penyedia yang ditawarkan oleh DTrace terdiri dari:

  • Penyedia syscall dapat secara dinamis merunut tititk-masuk dan titik-balik untuk setiap panggilan sistem (system call) Solaris.
  • Penyedia sched dapat secara dinamis merunut aktifitas penjadwalan yang penting
  • Penyedia sysinfo menyediakan probe-probe yang berhubungan dengan statistik “sys” di kernel.
  • Penyedia io menyediakan probe-probe perunut yang berkaitan dengan input dan output (I/O) disk.

Bahasa Pemograman D
Bahasa pemograman D digunakan untuk menspesifikasikan probe yang diinginkan dan mengikatkan aksi ke probe tersebut. Spesifikasi probe dan aksinya ini dikonstruksikan di dalam skrip D. Sintak-sintak di dalam skrip D mirip dengan pasangan “pattern action” milik. Bahasa pemograman D banyak mengambil sintak-sintak dari bahasa pemograman C.

Meskipun tanpa pengetahuan tentang bahasa pemograman C ataupun awk(1), program D pada dasarnya cukup mudah dituliskan dan dipahami.

Fitur-fitr bahasa D antara lain:

  • Menyediakan akses lengkap ke struktur data C Kernel, misalnya vnode_t
  • Menyediakan akses lengkap ke variabel-variabel statik dan global kernel
  • Menyediakan dukungan lengkapt terhadap operator-operator ANSI-C
  • Mendukung tipe data strings sebagai tipe data built-in (tidak seperti C, yang menggunakan tipe char * atau char[ ] yang ambigu).

Sekilas Pandang  DTrace

Utilitas dtrace menyediakan antarmuka generik ke semua layanan esensial yang disediakan oleh fasilitas DTrace facility, yaitu:

  • Opsi untuk menampilkan himpunan probe dan penyedia yang dipublikasikan oleh DTrace
  • Opsi untuk meng-enable probe secara langsung dengan menggunakan penspesifikasi deskripsi probe (provider, module, function, name)
  • Opsi untuk menjalankan pengkompilasi D dan mengkompilasi satu atau lebih file program D atau program D dituliskan langsung di perintah baris
  • Opsi untuk membangkitkan program perunut anonim
  • Opsi untuk membangkitkan laporan stabilitas program
  • Opsi untuk memodifikasi perunutan DTrace dan perilaku penyanggaan, dan meng-enable fitur-fitru pengkompilasi D tambahan

Sintaks umum contoh-contoh tersebut adalah:

dtrace -options provider:module:function:name {action}

Aksi DTrace
Aksi adalah pernyataan-pernyataan yang dapat diprogram oleh pengguna yang kemudian dieksekusi di dalam kernel oleh mesin virtual DTrace. Berikut ini adalah properti-properti aksi:

  • Aksi dilakukan ketika probe memicu
  • Aksi secara lengkap dapat diprogram dalam bahasa D
  • Sebagian besar aksi merekam beberapa status spesifik di dalam sistem
  • Sebagian aksi menggunakan ekspresi dalam bahasa D

Beberapa aksi dapat mengubah status sistem dengan cara yang telah terdefinisikan dengan baik

  • Aksi seperti ini disebut aksi desktruktif
  • Aksi destruktif tidak diizinkan secara default

Variabel-variabel Built-In DTrace
Berikut adalah beberapa variabel-varibel built-in D yang lazim dipergunakan:

  • pid – Nomor ID proses
  • execname – Nama file-tereksekusi (executable)
  • timestamp – Selang waktu terhitung sejak boot dalam nanoseconds
  • curthread – Pointer ke struktur kthread_t yang merepresentasikan thread
  • probemod – Nama modul probe
  • probefunc – Nama fungsi probe
  • probename – Nama probe

Fungsi-fungsi Built-In DTrace
DTrace juga menyediakan banyak fungsi built-in untuk melakukan aksi. Contohnya fungsi trace ( ) yang merekam hasil ekspresi D ke dalam penyangga perunutan.

  • trace(pid) merunut nomor ID proses
  • trace(execname) merunut nama dari file-tereksekusi
  • trace(probefunc) merunut nama fungsi sebuah probe

Menuliskan Skrip D

Program DTrace yang makin kompleks akan sulit jika dituliskan langsung di perintah baris. Perintah dtrace(1M) mendukung penggunaan skrip yang dispesifikasikan dengan opsi -s. Cara lain adalah dengan membuat file interpreter DTrace yang dapat dieksekusi langsung. File interpreter selalu diawali dengan baris:

#!/usr/sbin/dtrace -s

Contoh berikut adalah sebuah skrip yang merunut nama file-terksekusi pada saat terjadi titik-masuk setiap panggilan sistem:

# cat syscall.d
syscall:::entry
{
trace(execname);
}

Berdasarkan konvensi, skrip D diberikan akhiran .d suffix. Berikutnya skrip ini dapat dijalankan dengan cara berikut ini:

# dtrace -s sycall.d

Jika file syscall.d ditambahkan izin-akses eksekusi dan tambahkan baris pertama-nya pathname ke interpreter dtrace maka selanjutnya skrip ini dapat dieksekusi secara langsung:
#cat syscall.d
#!/usr/sbin/dtrace -s
syscall:entry
{
trace(execname);
}

# chmod +x syscall.d
# ./syscall.d

Aggregasi

Penggunaan aggregasi data akan lebih berguna daripada data-data individual dalam pemecahan pertanyaan yang berkaitan dengan kinerja. Contohnya, untuk mengetahui banyaknya page faults oleh sebuah process daripada terjadinya setiap individual page fault. Lebih bermanfaat untuk membuat tabel yang berisi nama proses dan jumlah total page faults setiap prosesnya.

Sintaks Aggregasi DTrace
Bentuk umum aggregasi DTrace adalah:

@name[ keys ] = aggfunc ( args );

  • Variable-variable ini didefinisikan sebagai berikut:
  • name – Name variabel aggregasi yang didahului oleh karakter @.
  • keys – Kumpulan ekspresi D yang dipisahkan oleh simbol koma
  • aggfunc – Salah satu fungsi-fungsi aggregasi DTrace
  • args – Kumpulan argumen yang sesuai dengan fungsi aggregasi dipisahkan oleh simbol koma

Predikat
Program D terdiri dari sekumpulan klausa-klausa probe. Klausa probe memiliki bentuk umum sebagai berikut:

probe descriptions
/ predicate /
{
action statements
}

Predikat (predicate) adalah ekspresi D yang terletak diantara simbol garis-miring / /. Predikat dievaluasi saat probe memicu untuk menentukan apakah aksi-aksi terkaitnya akan dieksekusi. Jika ekspresi D dievaluasi dengan nilai nol maka berarti false; jika dievaluasi dengan nilai bukan-nol maka berarti true. Penggunaan predikat bersifat opsional. Predikat selalu ditempatkan diantara deskripsi probe dan pernyataan aksi.
Speculative Healing

Bagian ini menjelaskan sebuah fasilitas DTrace yang disebut perunutan spekulatif, yaitu kemampuan perunutan data sementara yang kemudian akan diteruskan ke penyangga perunutan atau dibuang. Di DTrace, mekanisme utama untuk menyaring perunutan data yang tidak diperlukan adalah dengan predikat. Predikat berguna ketika diketahui kapan sebuah probe memicu tanpa mempedulikan apakah kejadian probe-nya adalah kejadian yang sedang menjadi perhatian atau tidak.

Contoh, jika kejadian yang menjadi perhatian adalah aktifitas yang berkaitan dengan proses tertentu atau pendeskripsi file tertentu maka  diketahui bahwa probe akan memicu jika probe ini terkait dengan proses atau pendeskripsi file yang sedang menjadi perhatian. Namun dalam situasi lain, bisa saja tidak diketahui  pasti apakah sebuah kejadian probe menjadi perhatian atau tidak hingga beberapa lama setelah probe memicu.

Sebagai contoh, jika sebuah panggilan sistem secara tidak teratur mengalami kegagalan dengan kode kesalahan umum (misalnya, EIO atau EINVAL) maka pengamatan terhadap path kode yang menyebabkan kondisi kesalahan perlu dilakukan. Untuk menangkap path kode dapat dilakukan dengan meng-enable setiap probe – tetapi hanya panggilan sistem yang gagal yang dapat diisolasi dengan cara demikian predikat yang sesuai dapat dikonstruksikan.

Jika kegagalan-nya sporadis atau tak-menentu,  dapat dipaksakan untuk melakukan perunutan terhadap semua kejadian yang mungkin menjadi perhatian dan kemudian melakukan ***-proses terhadap data untuk mem-filter kejadian yang tidak terkait dengan path kode yang gagal. Dalam kasus seperti ini, meskipun kejadian yang menjadi perhatian jumlah sedikit tetapi jumlah keseluruhan kejadian yang harus dirunut bisa sangat banyak, ini menjadikan ***-pemrosesan menjadi sangat menyulitkan.

Masalah seperti ini dapat diatasi dengan fasilitas perunutan spekulatif, dalam situasi seperti ini perunutan data sementara (tentative) dilakukan terhadap satu atau lebih lokasi probe kemudian membuat keputusan untuk mengkomitmen data ke penyangga prinsipal di lokasi probe yang lain. Hasilnya, data hasil perunutan hanya berisi keluaran dari kejadian yang menjadi perhatian, tidak diperlukan ***-pemrosesan dan beban-kerja DTrace menjadi kecil.

Fungsi-fungsi Spekulatif DTrace

  • speculation: memberikan nilai-balik berupa identitas untuk penyangga spekulatif baru
  • speculate: mengindikasikan bahwa klausa berikutnya akan dirunut ke penyangga spekulatif dengan identitas ID
  • commit: mengkomitmen penyangga spekulatif terkait dengan ID
  • discard: membuang penyangga spekulatif terkait dengan ID

Toolkit DTrace

Toolkit DTrace adalah sekumpulan skrip-skrip DTrace, dokumentasi, dan perintah-perintah baris yang dapat digunakan dengan segera untuk memanfaatkan DTrace tanpa perlu menuliskan skripnya dari awal. Version 0.96 dari toolkit ini terdiri dari lebih 100 scripts, dan dapat diunduh dari: http://www.opensolaris.org/os/community/dtrace/dtracetoolkit

Komponen-komponen utama toolkit DTrace adalah:

  • Skrip-skrip – Terdapat beberapa skrip utama di direktori teratas. Skrip-skrip lain dikumpulkan di dalam sub-direktori seperti  Disk dan FS. Direktori bin berisi link-link simbolik ke semua skrip yang ada.
  • Halaman-halaman manual di direktori Man
  • File-file contoh di direktori Docs/Examples
  • Kumpulan perintah-perintah baris di file Docs/oneliners.txt

sumber : http://miimlc.metrodata.co.id/forum/blogs/furqan

No responses yet




Trackback URI | Comments RSS

Leave a Reply

You must be logged in to post a comment.