Solaris 动态跟踪指南

第 24 章 vminfo 提供器

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 时,anonfreeexecfreefsfree 之一也必然在随后触发。

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

从后备存储或交换设备调进页面时将触发的探测器。pgpginpgin 之间的唯一区别在于,pgpgin 包含按照 arg0 调进的页数,pgin 则在 arg0 中始终包含 1。

pgpgout

将页面调出到后备存储或交换设备时将触发的探测器。pgpgoutpgout 之间的唯一区别在于,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