Solaris10中新的Dtrace工具( 二 )


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多调用,开始和返回,够开发人员分析的 。
【Solaris10中新的Dtrace工具】总结,Dtrace功能强大,精度高,轻量,truss有时降低系统30%CPU利用率 。但复杂,需对系统内核和应用熟悉,否则看不懂跟踪到的数据,估计以后CU该开Dtrace编程板块了 。

推荐阅读