vminfo 提供器提供了与 vm 内核统计信息对应的探测器。因为这些统计信息为系统监视实用程序(如 vmstat(1M))提供输入,所以 vminfo 提供器可以快速调查观察到的异常行为。
vminfo 提供器提供了与 vm 命名的内核统计信息中的字段对应的探测器:vminfo 提供的探测器就在递增相应的 vm 值之前的瞬间触发。要显示 vm 命名的内核统计信息的名称和当前值,请使用 kstat(1M) 命令,如以下示例所示:
$ kstat -n vm module: cpu instance: 0 name: vm class: misc anonfree 13 anonpgin 2620 anonpgout 13 as_fault 12528831 cow_fault 2278711 crtime 202.10625712 dfree 1328740 execfree 0 execpgin 5541 ... |
表 24–1 中对 vminfo 探测器进行了说明。
表 24–1 vminfo 探测器
anonfree |
作为分页活动的一部分,释放未修改的匿名页时将触发的探测器。匿名页是指那些与文件不关联的页面。包含此类页面的内存包括堆内存、栈内存或通过显式映射 zero(7D) 获取的内存。 |
anonpgin |
从交换设备调进匿名页时将触发的探测器。 |
anonpgout |
将已修改的匿名页调出到交换设备时将触发的探测器。 |
as_fault |
在页面上捕获到故障,并且该故障既不是保护故障,也不是写复制故障时将触发的探测器。 |
cow_fault |
在页面上捕获到写复制故障时将触发的探测器。arg0 包含由于写复制而创建的页数。 |
dfree |
由于分页活动而释放页面时将触发的探测器。触发 dfree 时,anonfree、execfree 或 fsfree 之一也必然在随后触发。 |
execfree |
由于分页活动而释放未修改的可执行页时将触发的探测器。 |
execpgin |
从后备存储调进可执行页时将触发的探测器。 |
execpgout |
将已修改的可执行页调出到后备存储时将触发的探测器。可执行页的大多数分页都与 execfree 有关。只有在内存中修改了可执行页时,才能触发 execpgout,这种情况在多数系统中不常见。 |
fsfree |
作为分页活动的一部分,释放未修改的文件系统数据页时将触发的探测器。 |
fspgin |
从后备存储调进文件系统页时将触发的探测器。 |
fspgout |
将已修改的文件系统页调出到后备存储时将触发的探测器。 |
kernel_asflt |
内核在页面自身的地址空间中捕获到页面故障时将触发的探测器。在触发 kernel_asflt 之前的瞬间会触发 as_fault 探测器。 |
maj_fault |
捕获到导致从后备存储或交换设备执行 I/O 操作的页面故障时将触发的探测器。在触发 maj_fault 之前的瞬间会触发 pgin 探测器。 |
pgfrec |
从可用页列表回收页面时将触发的探测器。 |
pgin |
从后备存储或交换设备调进页面时将触发的探测器。此探测器与 maj_fault 不同,因为 maj_fault 仅在页面由于故障而调进时触发。而 pgin 则无论原因是什么,每次调进页面时都会触发。 |
pgout |
将页面调出到后备存储或交换设备时将触发的探测器。 |
pgpgin |
从后备存储或交换设备调进页面时将触发的探测器。pgpgin 和 pgin 之间的唯一区别在于,pgpgin 包含按照 arg0 调进的页数,pgin 则在 arg0 中始终包含 1。 |
pgpgout |
将页面调出到后备存储或交换设备时将触发的探测器。pgpgout 和 pgout 之间的唯一区别在于,pgpgout 包含按照 arg0 调出的页数。(pgout 则在 arg0 中始终包含 1。) |
pgrec |
回收页面时将触发的探测器。 |
pgrrun |
调度页面调度程序时将触发的探测器。 |
pgswapin |
从换出进程换入页面时将触发的探测器。换入的页数包含在 arg0 中。 |
pgswapout |
作为换出进程的一部分,换出页面时将触发的探测器。换出的页数包含在 arg0 中。 |
prot_fault |
由于保护违规而捕获到页面故障时将触发的探测器。 |
rev |
页面守护进程在所有页面中启动新循环时将触发的探测器。 |
scan |
页面守护进程检查页面时将触发的探测器。 |
softlock |
作为在页面上放置软件锁的一部分,页面出现故障时将触发的探测器。 |
swapin |
将换出进程换回时将触发的探测器。 |
swapout |
换出进程时将触发的探测器。 |
zfod |
根据需要创建用零填充的页面时将触发的探测器。 |
arg0 |
统计信息将递增的值。对于大多数探测器,此参数始终为 1,但对于一些探测器,此参数可以采用其他值;在表 24–1 中,对这些探测器进行了说明。 |
arg1 |
指向要递增的统计信息当前值的指针。此值是一个 64 位数,将按 arg0 中的值递增。取消引用此指针后,使用者可确定与探测器对应的统计信息的当前计数。 |
检查 vmstat(1M) 的以下输出:
kthr memory page disk faults cpu r b w swap free re mf pi po fr de sr cd s0 — — in sy cs us sy id 0 1 0 1341844 836720 26 311 1644 0 0 0 0 216 0 0 0 797 817 697 9 10 81 0 1 0 1341344 835300 238 934 1576 0 0 0 0 194 0 0 0 750 2795 791 7 14 79 0 1 0 1340764 833668 24 165 1149 0 0 0 0 133 0 0 0 637 813 547 5 4 91 0 1 0 1340420 833024 24 394 1002 0 0 0 0 130 0 0 0 621 2284 653 14 7 79 0 1 0 1340068 831520 14 202 380 0 0 0 0 59 0 0 0 482 5688 1434 25 7 68 |
在以上输出中,pi 列表示调进的页数。通过 vminfo 提供器,可以详细了解这些页调进的来源,如以下示例所示:
dtrace -n pgin'{@[execname] = count()}' dtrace: description 'pgin' matched 1 probe ^C xterm 1 ksh 1 ls 2 lpstat 7 sh 17 soffice 39 javaldx 103 soffice.bin 3065 |
以上输出表明,与 StarSuiteTM 软件关联的进程 soffice.bin 负责大多数调进页。为了更全面地了解 soffice.bin 在执行时的虚拟内存行为,可启用所有 vminfo 探测器。以下示例将在启动 StarSuite 软件时运行 dtrace(1M):
dtrace -P vminfo'/execname == "soffice.bin"/{@[probename] = count()}' dtrace: description 'vminfo' matched 42 probes ^C kernel_asflt 1 fspgin 10 pgout 16 execfree 16 execpgout 16 fsfree 16 fspgout 16 anonfree 16 anonpgout 16 pgpgout 16 dfree 16 execpgin 80 prot_fault 85 maj_fault 88 pgin 90 pgpgin 90 cow_fault 859 zfod 1619 pgfrec 8811 pgrec 8827 as_fault 9495 |
以下脚本示例提供了更多有关 StarSuite 软件在启动时的虚拟内存行为的信息:
vminfo:::maj_fault, vminfo:::zfod, vminfo:::as_fault /execname == "soffice.bin" && start == 0/ { /* * This is the first time that a vminfo probe has been hit; record * our initial timestamp. */ start = timestamp; } vminfo:::maj_fault, vminfo:::zfod, vminfo:::as_fault /execname == "soffice.bin"/ { /* * Aggregate on the probename, and lquantize() the number of seconds * since our initial timestamp. (There are 1,000,000,000 nanoseconds * in a second.) We assume that the script will be terminated before * 60 seconds elapses. */ @[probename] = lquantize((timestamp - start) / 1000000000, 0, 60); }
请在重新启动 StarSuite 软件时运行以上脚本。接下来,依次创建一个新的绘图、新的表示,然后关闭所有文件并退出应用程序。在运行该 D 脚本的 shell 中按 Ctrl-C 组合键。结果显示一段时间内某虚拟内存行为的情况:
# dtrace -s ./soffice.d dtrace: script './soffice.d' matched 10 probes ^C maj_fault value ------------- Distribution ------------- count 7 | 0 8 |@@@@@@@@@ 88 9 |@@@@@@@@@@@@@@@@@@@@ 194 10 |@ 18 11 | 0 12 | 0 13 | 2 14 | 0 15 | 1 16 |@@@@@@@@ 82 17 | 0 18 | 0 19 | 2 20 | 0 zfod value ------------- Distribution ------------- count < 0 | 0 0 |@@@@@@@ 525 1 |@@@@@@@@ 605 2 |@@ 208 3 |@@@ 280 4 | 4 5 | 0 6 | 0 7 | 0 8 | 44 9 |@@ 161 10 | 2 11 | 0 12 | 0 13 | 4 14 | 0 15 | 29 16 |@@@@@@@@@@@@@@ 1048 17 | 24 18 | 0 19 | 0 20 | 1 21 | 0 22 | 3 23 | 0 as_fault value ------------- Distribution ------------- count < 0 | 0 0 |@@@@@@@@@@@@@ 4139 1 |@@@@@@@ 2249 2 |@@@@@@@ 2402 3 |@ 594 4 | 56 5 | 0 6 | 0 7 | 0 8 | 189 9 |@@ 929 10 | 39 11 | 0 12 | 0 13 | 6 14 | 0 15 | 297 16 |@@@@ 1349 17 | 24 18 | 0 19 | 21 20 | 1 21 | 0 22 | 92 23 | 0 |
以上输出显示了与虚拟内存系统有关的某种 StarSuite 行为。例如,在启动新的应用程序实例之前,不会触发 maj_fault 探测器。如您所愿,StarSuite 的“热启动”并未引发新的重大故障。as_fault 输出显示了活动的初始突发传输、用户查找菜单以创建新绘图时的等待时间、另一段空闲时间,以及在用户单击新表示时,出现活动的最终突发传输。zfod 输出表明,创建新的表示对用零填充的页面产生了巨大压力,不过,该压力仅持续了一小段时间。
在此示例中,DTrace 调查的下一次重复取决于您要了解的具体方面。如果要了解用零填充的页面的请求来源,可在 zfod 启用项中聚集 ustack()。您可能希望为用零填充的页面设置阈值,并使用 stop() 破坏性操作,以便在阈值超出时停止违例进程。借助这种方法,您可以使用更多传统调试工具(如 truss(1) 或 mdb(1))。通过 vminfo 提供器,可将常规工具(如 vmstat(1M))的输出中显示的统计信息,与导致该系统行为的应用程序进行关联。
vminfo 提供器使用 DTrace 的稳定性机制描述其稳定性,如下表所示。有关稳定性机制的更多信息,请参见第 39 章。
元素 |
名称稳定性 |
数据稳定性 |
相关性类 |
---|---|---|---|
提供器 |
发展中 |
发展中 |
ISA |
模块 |
专用 |
专用 |
未知 |
功能 |
专用 |
专用 |
未知 |
名称 |
发展中 |
发展中 |
ISA |
参数 |
专用 |
专用 |
ISA |