第21章 其他文件系统
附录 D. OpenPGP 密钥
25.4.使用 DTrace
DTrace 脚本由一个或多个 探测器 或者 测量点 组成,每一个探测器关联一个动作。当探测器的条件被满足时,与之相关联的动作就会被执行。例如,当打开一个文件,启动一个进程或者运行一行代码时可能执行一个动作。这个动作可能是记录某些信息,或者变更上下文变量。对上下文变量的读取和写入使得探测器之间能够共享信息,并且对不同事件协同分析其相关性。
要查看所有探测器,管理员可以执行以下命令:
1
# dtrace -l | more
Copied!
每个探测器都有一个 ID,一个 PROVIDER(dtrace 或 fbt),一个 MODULE 和一个 FUNCTION NAME。关于这个命令的更多信息请见 dtrace(1)
这节中的例子大致演示了如何使用 DTrace Toolkit 中两个得到完整支持的脚本:hotkernelprocsystime
hotkernel 用来识别占用内核时间最多的函数。它会生成类似的输出:
1
# cd /usr/local/share/dtrace-toolkit
2
# ./hotkernel
3
Sampling... Hit Ctrl-C to end.
Copied!
如提示,用快捷键 Ctrl + C 结束进程。结束时,脚本会显示内核函数和用时信息列表,按用时升序排列:
1
kernel`_thread_lock_flags 2 0.0%
2
0xc1097063 2 0.0%
3
kernel`sched_userret 2 0.0%
4
kernel`kern_select 2 0.0%
5
kernel`generic_copyin 3 0.0%
6
kernel`_mtx_assert 3 0.0%
7
kernel`vm_fault 3 0.0%
8
kernel`sopoll_generic 3 0.0%
9
kernel`fixup_filename 4 0.0%
10
kernel`_isitmyx 4 0.0%
11
kernel`find_instance 4 0.0%
12
kernel`_mtx_unlock_flags 5 0.0%
13
kernel`syscall 5 0.0%
14
kernel`DELAY 5 0.0%
15
0xc108a253 6 0.0%
16
kernel`witness_lock 7 0.0%
17
kernel`read_aux_data_no_wait 7 0.0%
18
kernel`Xint0x80_syscall 7 0.0%
19
kernel`witness_checkorder 7 0.0%
20
kernel`sse2_pagezero 8 0.0%
21
kernel`strncmp 9 0.0%
22
kernel`spinlock_exit 10 0.0%
23
kernel`_mtx_lock_flags 11 0.0%
24
kernel`witness_unlock 15 0.0%
25
kernel`sched_idletd 137 0.3%
26
0xc10981a5 42139 99.3%
Copied!
这个脚本也同样适用于内核模块。要使用此功能,请用 -m 执行这个脚本:
1
# ./hotkernel -m
2
Sampling... Hit Ctrl-C to end.
3
^C
4
MODULE COUNT PCNT
5
0xc107882e 1 0.0%
6
0xc10e6aa4 1 0.0%
7
0xc1076983 1 0.0%
8
0xc109708a 1 0.0%
9
0xc1075a5d 1 0.0%
10
0xc1077325 1 0.0%
11
0xc108a245 1 0.0%
12
0xc107730d 1 0.0%
13
0xc1097063 2 0.0%
14
0xc108a253 73 0.0%
15
kernel 874 0.4%
16
0xc10981a5 213781 99.6%
Copied!
procsystime 脚本记录并输出给定 ID(PID) 或名称的进程的系统调用时间。在如下示例中,将会生成一个新的 /bin/csh 实例,然后 procsystime 将会执行并等待。这时,在另一个 csh 中输入几个命令。这是该测试的结果:
1
# ./procsystime -n csh
2
Tracing... Hit Ctrl-C to end...
3
^C
4
5
Elapsed Times for processes csh,
6
7
SYSCALL TIME (ns)
8
getpid 6131
9
sigreturn 8121
10
close 19127
11
fcntl 19959
12
dup 26955
13
setpgid 28070
14
stat 31899
15
setitimer 40938
16
wait4 62717
17
sigaction 67372
18
sigprocmask 119091
19
gettimeofday 183710
20
write 263242
21
execve 492547
22
ioctl 770073
23
vfork 3258923
24
sigsuspend 6985124
25
read 3988049784
Copied!
如结果显示的那样,read() 系统请求占用了最长的时间(以纳秒显示),而 getpid() 占用时间最少。
Copy link
Edit on GitHub