DTrace即動(dòng)態(tài)跟蹤Dynamic Tracing,是Solaris 10的一個(gè)新功能,透過(guò)此一新功能,用戶能夠動(dòng)態(tài)檢測(cè)操作系統(tǒng)內(nèi)核和用戶進(jìn)程,以更精確地掌握系統(tǒng)的資源使用狀況,提高系統(tǒng)性能,減少支持成本,并進(jìn)行有效的調(diào)節(jié)。1997年,供職于Sun而現(xiàn)已是Solaris內(nèi)核開(kāi)發(fā)部高級(jí)工程師的Bryan Cantrill 與他的工作組在緊張地研究一個(gè)性能問(wèn)題,它出現(xiàn)在剛剛提及的Sun E10000服務(wù)器。該服務(wù)器在運(yùn)行基準(zhǔn)測(cè)試時(shí),速度突然在一段時(shí)間內(nèi)奇怪地降低。工作組經(jīng)過(guò)六天夜以繼日的工作后,終于發(fā)現(xiàn)了問(wèn)題的根本原因。某個(gè)“愚蠢之極”的配置錯(cuò)誤將服務(wù)器配置成了路由器。
“我很受震驚,”Cantrill 說(shuō)到, “這是任何一個(gè)客戶都可能遇到的問(wèn)題,但是他們可不敢奢望讓內(nèi)核開(kāi)發(fā)人員為之夜以繼日地工作,編寫(xiě)自定義代碼以弄清楚問(wèn)題。我們得找出一個(gè)更好的方法。”
經(jīng)過(guò)兩年半的緊張開(kāi)發(fā),Cantrill和他的工作組終于研究出了這個(gè)更好的方法: Dtrace
DTrace是過(guò)去十年中在操作系統(tǒng)方面最具意義的革新之一:
Probe,Solaris中分散著30,000多的位置指針,也叫探測(cè)器probes,DTrace可激活成千上萬(wàn)的探測(cè)器,記錄所關(guān)注的位置指定的數(shù)據(jù),如命中,即可從該地址顯示用戶進(jìn)程或系統(tǒng)內(nèi)核的數(shù)據(jù),從而了解系統(tǒng),包括:
1。任何函數(shù)的參數(shù)
2。內(nèi)核的任何全局變量
3。函數(shù)調(diào)用的時(shí)間(NS,十億分之一秒,無(wú)任何其它PC/Unix在ns一級(jí)精度)
4。跟蹤堆棧,包括指明函數(shù)調(diào)用的代碼
5。函數(shù)調(diào)用時(shí)運(yùn)行的進(jìn)程
6。產(chǎn)生函數(shù)調(diào)用的線程
Probe于自定義D語(yǔ)言程序相關(guān)聯(lián),probe表示的格式為:
provider:module:function:name
1。顯示當(dāng)前動(dòng)態(tài)系統(tǒng)中的動(dòng)態(tài)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
即當(dāng)前本人V210上有43547個(gè)probe。
2。體驗(yàn) dtrace 與 Unix ps 命令:
如用ps看mozilla進(jìn)程:
# ps -e |grep mozilla
2386 pts/11 0:00 mozilla
2436 pts/11 10:12 mozilla-
也可使用dtrace 通過(guò)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。實(shí)際dtrace看的更細(xì),
如用date顯示系統(tǒng)時(shí)間,很快就結(jié)束了,無(wú)法跟蹤,體驗(yàn)dtrace跟蹤效果:
% date
2005年05月24日 星期二 20時(shí)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納秒開(kāi)始讀取,第102890532181875返回結(jié)果。
3。體驗(yàn)Dtrace 對(duì)系統(tǒng)調(diào)用更多的觀察:
如看機(jī)器忙閑狀態(tài),常用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
得知產(chǎn)生2605多系統(tǒng)調(diào)用,但無(wú)和簡(jiǎn)單查找哪個(gè)進(jìn)程的問(wèn)題呢,試用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
顯然發(fā)現(xiàn)CDE和Mozilla是產(chǎn)生大量系統(tǒng)調(diào)用的程序,看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產(chǎn)生的I/O在256-512字節(jié)間。
4。 想再仔細(xì)看程序內(nèi)部情況?
truss不錯(cuò):
# 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多調(diào)用,開(kāi)始和返回,夠開(kāi)發(fā)人員分析的。
總結(jié),Dtrace功能強(qiáng)大,精度高,輕量,truss有時(shí)降低系統(tǒng)30%CPU利用率。但復(fù)雜,需對(duì)系統(tǒng)內(nèi)核和應(yīng)用熟悉,否則看不懂跟蹤到的數(shù)據(jù),估計(jì)以后CU該開(kāi)Dtrace編程板塊了。
---------------------------------------------------------------------------------------------------------------------------------
說(shuō)人之短,乃護(hù)己之短。夸己之長(zhǎng),乃忌人之長(zhǎng)。皆由存心不厚,識(shí)量太狹耳。能去此弊,可以進(jìn)德,可以遠(yuǎn)怨。
------------------------------------------------------------------------------------------------------ ----------------- ---------