- 论坛徽章:
- 0
|
18.2 使用DTrace工具
无论对于系统管理员还是程序开发人员来说,DTrace都能带来莫大的方便,它使我们直接观察系统的运行情况。本节将要举一些使用DTrace的实例,使读者直观地感受DTrace的魅力。
18.2.1 Solaris 10系统自带的常用DTrace举例
首先需要说明的是,DTrace只有在Solaris 10系统或更高版本的Solaris中才能应用。并且在这些系统中,也自带一些D语言的脚本程序,它们位于/usr/demo/DTrace目录中。初学者可以先看看这些例子,运行一下,对理解DTrace的使用和D语言的编写会有好处。
进入/usr/demo/DTrace目录后,发现此目录中有下列程序,我们可以直接使用它们,也可以稍加修改再使用。
# cd /usr/demo/dtrace
# ls
applicat.d intr.d qtime.d whatfor.d
badopen.d iocpu.d renormalize.d whatlock.d
begin.d iosnoop.d restest.d where.d
callout.d iothrough.d ring.d whererun.d
clause.d iotime.d rtime.d whoexec.d
clear.d iprb.d rwinfo.d whofor.d
countdown.d kstat.d rwtime.d whoio.d
counter.d ksyms.d sig.d whopreempt.d
dateprof.d libc.d soffice.d whoqueue.d
delay.d lquantize.d spec.d whosteal.d
denorm.d lwptime.d specopen.d whowrite.d
end.d normalize.d ssd.d writes.d
error.d nscd.d sunlogo.gif writesbycmd.d
errorpath.d pri.d syscall.d writeabycmdfd.d
find.d printa.d tick.d writetime.d
firebird.d pritime.d ticktime.d writetimeq.d
hello.d prof.d time.d xioctl.d
howlong.d profpri.d tracewrite.d xterm.d
index.html progtime.d trunc.d xwork.d
interp.d putnext.d trussrw.d
interval.d qlen.d userfunc.d
#
对于这些D语言程序,在使用时候应该选择-s的选项。
例18-6 检测系统命令的读写时间。
对于某个终端在运行系统命令时,可以用rwtime.d程序来监测读写时间。
首先要弄清楚用户的终端Shell进程号码。方法是打开一个新的终端控制台,在提示符下运行:
#echo $$
623
然后,我们来了解rwtime.d程序:
syscall::read:entry,
syscall::write:entry
/pid == $1/
{
ts[probefunc] = timestamp;
}
syscall::read:return,
syscall::write:return
/pid == $1 && ts[probefunc] != 0/
{
printf("%d nsecs", timestamp - ts[probefunc]);
}
可见启动了syscall探测器,并且需要输入$1变量值。
运行DTrace命令后,可以看到这个程序匹配四个探测器。在id为623的终端控制台上输入任何命令,rwtime.d就会反馈出这个命令运行了多少纳秒。
# dtrace –s rwtime.d 623
dtrace: script ’rwtime.d’ matched 4 probes
CPU ID FUNCTION:NAME
0 14 write:return 4089025 nsecs
0 12 read:return 23530445493 nsecs
0 14 write:return 155161 nsecs
0 14 write:return 78225 nsecs
0 12 read:return 523171473332 nsecs
例18-7 获得读写操作的统计。
# DTrace -q -s rwinfo.d ‘pgrep -n ksh‘
^C
pgrep -n ksh将输出ksh进程的ID,将此ID输入程序中,程序将反馈出此ksh中的读写统计。
过几分钟后,键入^C。得出下面的结果:
calls max bytes elapsed nsecs
------ ----- --------- -------------
read 36 1024 3588283144
write 35 59 14945541
#
以纳秒的形式显示了读和写操作的时间统计。
18.2.2 使用第三方编写的DTrace工具
如果你没有时间来写D程序或者没有时间来学习写这些程序,也不用担心,在下面链接的网站可以下载一个打包的DTrace工具包:
http://users.tpg.com.au/adsln4yb/DTrace.html#DTraceToolkit
http://www.openSolaris.org/os/community/DTrace/DTracetoolkit
http://www.brendangregg.com/DTrace.html#DTraceToolkit
目前的最新版本是DTraceToolkit-0.84.tar.gz。这个工具包大约有80个脚本程序。
下载后,首先需要使用gunzip和“tar xvf”命令解压缩包。然后,运行./install程序,将这些文件解压缩后放到可以执行的目录。
下面我们详细介绍DTraceToolkit工具包中的程序的用法。
例18-8 dexplorer程序。
dexplorer程序是一个对系统进行全面检测的工具。在默认情况下,这个程序每5秒钟对系统的某个方面采集一次数据。
下面就是数据的采集过程:
# dexplorer
Output dir will be the current dir (/export/home/root/DTrace/Dexplorer).
Hit enter for yes, or type path:
Starting dexplorer ver 0.70.
Sample interval is 5 seconds. Total run is > 100 seconds.
0% Interrupts by CPU...
5% Interrupt counts...
10% Dispatcher queue length by CPU...
15% Sdt counts...
20% Pages paged in by process name...
25% Files opened count...
30% Disk I/O size distribution by process name...
35% Minor faults by process name...
40% Vminfo data by process name...
45% Mib data by mib statistic...
50% TCP write bytes by process...
55% Sample process @ 1000 Hz...
60% Syscall count by process name...
65% Syscall count by syscall...
70% Read bytes by process name...
75% Write bytes by process name...
80% Sysinfo counts by process name...
85% New process counts with arguments...
90% Signal counts...
95% Syscall error counts...
100% Done.
File is de_duanf_200510271803.tar.gz
从开始的信息我们知道,这个运行的dexplorer版本现在是0.70。
在输出的最后,我们发现所采集的数据被存放到一个以tar.gz结尾的压缩文件中。
下面让我们来解开这个压缩文件:
# gunzip de_duanf_200510271803.tar.gz
# tar xf de_duanf_200510271803.tar
de_duanf_200510271803
de_duanf_200510271803/Cpu
de_duanf_200510271803/Cpu/interrupt_by_cpu
de_duanf_200510271803/Cpu/interrupt_time
de_duanf_200510271803/Cpu/dispqlen_by_cpu
de_duanf_200510271803/Cpu/sdt_count
de_duanf_200510271803/Disk
de_duanf_200510271803/Disk/pgpgin_by_processname
de_duanf_200510271803/Disk/fileopen_count
de_duanf_200510271803/Disk/sizedist_by_processname
de_duanf_200510271803/Mem
de_duanf_200510271803/Mem/minf_by_processname
de_duanf_200510271803/Mem/vminfo_by_processname
de_duanf_200510271803/Net
de_duanf_200510271803/Net/mib_data
de_duanf_200510271803/Net/tcpw_by_process
de_duanf_200510271803/Proc
de_duanf_200510271803/Proc/sample_process
de_duanf_200510271803/Proc/syscall_by_processname
de_duanf_200510271803/Proc/syscall_count
de_duanf_200510271803/Proc/readb_by_processname
de_duanf_200510271803/Proc/writeb_by_processname
de_duanf_200510271803/Proc/sysinfo_by_processname
de_duanf_200510271803/Proc/newprocess_count
de_duanf_200510271803/Proc/signal_count
de_duanf_200510271803/Proc/syscall_errors
de_duanf_200510271803/Info
de_duanf_200510271803/Info/uname-a
de_duanf_200510271803/Info/psrinfo-v
de_duanf_200510271803/Info/prtconf
de_duanf_200510271803/Info/df-k
de_duanf_200510271803/Info/ifconfig-a
de_duanf_200510271803/Info/ps-o
de_duanf_200510271803/Info/uptime
de_duanf_200510271803/log
这样,我们就会得到存储系统数据的文件。通过此文件可以好好分析系统的负载运行情况了。
如果不需要看采集数据的过程,可以将它们直接存放某个目录下,如/var/tmp:
# dexplorer -qy -d /var/tmp
#
其中,
-qy:是不在屏幕上显示。
-d:存放的路径。
dexplorer只是采集了系统概括信息,如果要仔细查看系统某一方面的信息,还可以用工具包中的其他程序。
例18-9 使用isnoop来检测系统I/O情况。
# iosnoop
UID PID D BLOCK SIZE COMM PATHNAME
100 15795 R 3808 8192 tar /usr/bin/eject
100 15795 R 35904 6144 tar /usr/bin/eject
100 15795 R 39828 6144 tar /usr/bin/env
100 15795 R 3872 8192 tar /usr/bin/expr
100 15795 R 21120 7168 tar /usr/bin/expr
100 15795 R 43680 6144 tar /usr/bin/false
100 15795 R 44176 6144 tar /usr/bin/fdetach
100 15795 R 3920 8192 tar /usr/bin/fdformat
100 15795 R 3936 8192 tar /usr/bin/fdformat
100 15795 R 4080 8192 tar /usr/bin/fdformat
100 15795 R 9680 3072 tar /usr/bin/fdformat
输出的内容可比iostat命令的输出要详细多了。
还可以使用tcpnoop来查看新建立的tcp连接情况。
例18-10 查看新建立的tcp连接情况。
# tcptop -C 10
Sampling... Please wait.
2005 Jul 5 04:55:25, load: 1.11, TCPin: 2 Kb, TCPout: 110 Kb
UID PID LADDR LPORT FADDR FPORT SIZE NAME
100 20876 192.168.1.5 36396 192.168.1.1 79 1160 finger
100 20875 192.168.1.5 36395 192.168.1.1 79 1160 finger
100 20878 192.168.1.5 36397 192.168.1.1 23 1303 telnet
100 20877 192.168.1.5 859 192.168.1.1 514 115712 rcp
2005 Jul 5 04:55:35, load: 1.10, TCPin: 0 Kb, TCPout: 0 Kb
UID PID LADDR LPORT FADDR FPORT SIZE NAME
0 242 192.168.1.5 79 192.168.1.1 54220 272 inetd
0 20879 192.168.1.5 79 192.168.1.1 54220 714 in.fingerd
[...]
上面的输出说明,系统每隔10秒种采集一次数据。如果不使用^C结束的话,屏幕将一直显示下去。从目前的输出可以看到,进程20877的输出流量最大为110KB。
如果只想简单地查看有哪些计算机连接到自己,使用connections程序就可以了。
例18-11 查看连接自己的计算机。
# connections
UID PID CMD TYPE PORT IP_SOURCE
0 242 inetd tcp 79 192.168.1.1
0 359 sshd tcp 22 192.168.1.1
100 1532 Xorg tcp 6000 192.168.1.1
^C
例18-12 使用prustat脚本显示进程的%CPU, %Mem, $Disk and %Net。
# prustat -t10 5
PID %CPU %Mem %Disk %Net COMM
22301 54.30 3.15 0.00 0.00 setiathome
440 2.24 45.36 0.00 0.00 Xsun
22272 30.26 0.31 0.00 0.00 perl
2618 0.26 14.34 0.00 0.00 mozilla-bin
582 1.27 2.16 0.00 0.00 gnome-terminal
576 0.02 2.80 0.00 0.00 nautilus
2299 0.21 1.99 0.00 0.00 acroread
578 0.35 1.46 0.00 0.00 gnome-panel
574 0.37 1.31 0.00 0.00 metacity
6504 0.00 1.23 0.00 0.00 nautilus-throbb
PID %CPU %Mem %Disk %Net COMM
22301 57.02 3.15 0.00 0.00 setiathome
440 2.35 45.36 0.00 0.00 Xsun
22272 26.99 0.31 0.00 0.00 perl
2618 0.26 14.34 0.00 0.00 mozilla-bin
22321 3.48 1.46 0.00 0.00 DTrace
582 1.29 2.16 0.00 0.00 gnome-terminal
576 0.02 2.80 0.00 0.00 nautilus
2299 0.21 1.99 0.00 0.00 acroread
578 0.36 1.46 0.00 0.00 gnome-panel
574 0.39 1.31 0.00 0.00 metacity
^C
从输出我们可以看出,系统有两个进程在争夺CPU资源,它们分别是setiathome和perl。由于输出数据的显示是分类的,Xsun在%Mem项比perl在%CPU项的数值大,所以Xsun被排到了第二位。“-t10”属性的意思是显示最大的10行,而“5”是每5秒钟来采集一次数据。
DTraceToolkit中有许多有用的工具,对于了解系统运行状况非常好用,有兴趣的读者不妨自己下载后运行一下,体验一下DTrace带来的方便和快捷。
对于某些读者来说,如果使用现成的脚本程序还不能满足自己的需求,那么,根据需要自己动手编写DTrace程序,写一个D程序也不是什么难事,事实上D语言也非常简单。由于介绍如何写D语言已经超出了本书的范围,所以推荐读者到Sun公司网站上看看,它有一个pdf文档可以帮助我们如何学习写D语言。在此只给出链接http://docs.sun.com/db/doc/817-6223,有需要的读者可以自行下载。 |
|