Solaris 动态跟踪指南

syscall 提供器

通过 syscall 提供器,可以跟踪每个系统调用的进入和返回。系统调用是了解进程行为的良好开端,尤其是在执行进程可能会占用大量时间,或在内核阻塞了进程的情况下。您可以使用 prstat(1M) 命令查看进程在哪些地方消耗时间:


$ prstat -m -p 31337
   PID USERNAME USR SYS TRP TFL DFL LCK SLP LAT VCX ICX SCL SIG PROCESS/NLWP  
 13499 user1     53  44 0.0 0.0 0.0 0.0 2.5 0.0  4K  24  9K   0 mystery/6

此示例表明该进程占用了大量系统时间。对该行为的一种可能的解释是,进程正在执行大量系统调用。可以使用在命令行中指定的简单 D 程序,查看哪些系统调用出现的频率最高:


# dtrace -n syscall:::entry'/pid == 31337/{ @syscalls[probefunc] = count(); }'
dtrace: description 'syscall:::entry' matched 215 probes
^C

  open                                                              1
  lwp_park                                                          2
  times                                                             4
  fcntl                                                             5
  close                                                             6
  sigaction                                                         6
  read                                                             10
  ioctl                                                            14
  sigprocmask                                                     106
  write                                                          1092

该报告显示了调用频率最高的系统调用,在此示例中即 write(2) 系统调用。您可以使用 syscall 提供器,进一步检查所有 write() 系统调用的起因:


# dtrace -n syscall::write:entry'/pid == 31337/{ @writes[arg2] = quantize(arg2); }'
dtrace: description 'syscall::write:entry' matched 1 probe
^C

           value  ------------- Distribution ------------- count    
               0 |                                         0        
               1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@   1037
               2 |@                                        3        
               4 |                                         0        
               8 |                                         0        
              16 |                                         0        
              32 |@                                        3        
              64 |                                         0        
             128 |                                         0        
             256 |                                         0        
             512 |                                         0        
            1024 |@                                        5        
            2048 |                                         0        

以上输出表明,该进程正在执行多个数据量相对较少的 write() 系统调用。该比例可能是造成此特定进程性能问题的起因。本示例介绍了一种用于调查系统调用行为的常规方法。