DTrace即動態跟蹤Dynamic Tracing,是Solaris 10的一個新功能,透過此一新功能,用戶能夠動態檢測操作系統內核和用戶進程,以更精確地掌握系統的資源使用狀況,提高系統性能,減少支持成本,并進行有效的調節。1997年,供職于Sun而現已是Solaris內核開發部高級工程師的Bryan Cantrill 與他的工作組在緊張地研究一個性能問題,它出現在剛剛提及的Sun E10000服務器。該服務器在運行基準測試時,速度突然在一段時間內奇怪地降低。工作組經過六天夜以繼日的工作后,終于發現了問題的根本原因。某個“愚蠢之極”的配置錯誤將服務器配置成了路由器。
“我很受震驚,”Cantrill 說到, “這是任何一個客戶都可能遇到的問題,但是他們可不敢奢望讓內核開發人員為之夜以繼日地工作,編寫自定義代碼以弄清楚問題。我們得找出一個更好的方法。”
經過兩年半的緊張開發,Cantrill和他的工作組終于研究出了這個更好的方法: Dtrace
DTrace是過去十年中在操作系統方面最具意義的革新之一:
Probe,Solaris中分散著30,000多的位置指針,也叫探測器probes,DTrace可激活成千上萬的探測器,記錄所關注的位置指定的數據,如命中,即可從該地址顯示用戶進程或系統內核的數據,從而了解系統,包括:
1。任何函數的參數
2。內核的任何全局變量
3。函數調用的時間(NS,十億分之一秒,無任何其它PC/Unix在ns一級精度)
4。跟蹤堆棧,包括指明函數調用的代碼
5。函數調用時運行的進程
6。產生函數調用的線程
Probe于自定義D語言程序相關聯,probe表示的格式為:
provider:module:function:name
1。顯示當前動態系統中的動態Dtrace探針probe:
# dtrace -l |more
ID PROVIDER MODULE FUNCTION NAME
1 dtrace BEGIN
2 dtrace END
3 dtrace ERROR
4 vminfo fasttrap fasttrap_uwrite softlock
5 vminfo fasttrap fasttrap_uread softlock
6 fbt pool pool_open entry
7 fbt pool pool_open return
8 fbt pool pool_close entry
9 fbt pool pool_close return
10 fbt pool pool_ioctl entry
11 fbt pool pool_ioctl return
12 fbt pool pool_info entry
13 fbt pool pool_info return
。。。
43545 fbt zmod z_strerror return
43546 fbt zmod z_uncompress entry
43547 fbt zmod z_uncompress return
即當前本人V210上有43547個probe。
2。體驗 dtrace 與 Unix ps 命令:
如用ps看mozilla進程:
# ps -e |grep mozilla
2386 pts/11 0:00 mozilla
2436 pts/11 10:12 mozilla-
也可使用dtrace 通過probe探針看:
# dtrace -n 'syscall::exece:return { trace(execname);}'
dtrace: description 'syscall::exece:return ' matched 1 probe
CPU ID FUNCTION:NAME
0 11082 exece:return uname
0 11082 exece:return uname
0 11082 exece:return basename
。。。
0 11082 exece:return sed
0 11082 exece:return mozilla-bin
1 11082 exece:return csh
1 11082 exece:return mozilla
。。。
2。實際dtrace看的更細,
如用date顯示系統時間,很快就結束了,無法跟蹤,體驗dtrace跟蹤效果:
% date
2005年05月24日 星期二 20時39分03秒 CST
# dtrace -n 'syscall::exece: {trace(timestamp)}'
ddtrace: description 'syscall::exece: ' matched 2 probes
CPU ID FUNCTION:NAME
0 11081 exece:entry 102890531281542
0 11082 exece:return 102890532181875
即可跟蹤其在第102890531281542納秒開始讀取,第102890532181875返回結果。
3。體驗Dtrace 對系統調用更多的觀察:
如看機器忙閑狀態,常用vmstat:
# vmstat 1
kthr memory page disk faults cpu
r b w swap free re mf pi po fr de sr s0 s3 s1 s1 in sy cs us sy id
0 0 0 5523680 1378352 14 48 84 1 0 0 1 0 1 0 0 341 2058 883 3 1 96
0 0 0 5368296 1218688 0 23 15 0 0 0 0 0 0 0 0 336 2605 722 10 1 89
得知產生2605多系統調用,但無和簡單查找哪個進程的問題呢,試用dtrace看:
# dtrace -n 'syscall::read:entry
{@NUM[execname] = count();}'
ddtrace: description 'syscall::read:entry ' matched 1 probe
^C
dtfile 5
sdtperfmeter 12
soffice.bin 23
dic 23
dtterm 53
mozilla-bin 394
Xsun 545
顯然發現CDE和Mozilla是產生大量系統調用的程序,看I/O分布也可:
如還是Mozilla:
# dtrace -n 'syscall::write:entry
{@NUM[execname] = quantize(arg2);}'
...
mozilla-bin
value ------------- Distribution ------------- count
0 | 0
1 |@@@@@@@@@@@@@@@@@@@@@ 470
2 | 0
4 | 7
8 | 0
16 | 0
32 | 0
64 | 0
128 | 10
256 |@@@@@@@@ 184
512 |@@@@@@ 146
1024 |@@@ 78
2048 | 8
4096 | 1
8192 | 0
...
可觀察到大量Mozilla產生的I/O在256-512字節間。
4。 想再仔細看程序內部情況?
truss不錯:
# truss /usr/sfw/bin/mozilla
execve("/usr/bin/ksh", 0xFFBFF564, 0xFFBFF574) argc = 3
resolvepath("/usr/bin/ksh", "/usr/bin/ksh", 1023) = 12
resolvepath("/usr/lib/ld.so.1", "/lib/ld.so.1", 1023) = 12
stat("/usr/bin/ksh", 0xFFBFF340) = 0
open("/var/ld/ld.config", O_RDONLY) Err#2 ENOENT
stat("/lib/libc.so.1", 0xFFBFEE70) = 0
resolvepath("/lib/libc.so.1", "/lib/libc.so.1", 1023) = 14
open("/lib/libc.so.1", O_RDONLY) = 3
mmap(0x00010000, 8192, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_ALIGN, 3, 。。。
試下dtrace:
# dtrace -n 'syscall::read:return /execname =="mozilla" /{ ustack();}'
dtrace: description 'syscall::read:return ' matched 1 probe
CPU ID FUNCTION:NAME
0 10984 read:return
libc.so.1`_read+0x8
ksh`io_readbuff+0x264
ksh`0x245e4
ksh`io_readc+0x2c
ksh`0x29c54
ksh`main+0xa30
ksh`_start+0x108
0 10984 read:return
libc.so.1`_read+0x8
ksh`io_readbuff+0x264
ksh`0x245e4
ksh`io_readc+0x2c
ksh`0x28938
ksh`0x28654
...
看到n多調用,開始和返回,夠開發人員分析的。
總結,Dtrace功能強大,精度高,輕量,truss有時降低系統30%CPU利用率。但復雜,需對系統內核和應用熟悉,否則看不懂跟蹤到的數據,估計以后CU該開Dtrace編程板塊了。
---------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------ ----------------- ---------