Guía de seguimiento dinámico de Solaris

Proveedor syscall

El proveedor syscall le permite realizar un seguimiento de todas las entradas y las devoluciones de las llamadas de sistema. Las llamadas del sistema pueden ser un buen punto de partida para comprender el comportamiento de un proceso, especialmente si el proceso tarda mucho tiempo en las ejecuciones o queda bloqueado en el núcleo. Puede usar el comando prstat(1M) para ver dónde exactamente emplean el tiempo los procesos:


$ 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

Este ejemplo muestra que el proceso está gastando una cantidad grande del tiempo del sistema. Una posible explicación para este comportamiento es que el proceso está realizando una cantidad importante de llamadas del sistema. Puede usar un programa sencillo escrito en D especificado en la línea de comandos para ver qué llamadas del sistema se están produciendo con más frecuencia:


# 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

Este informe muestra qué llamadas del sistema se producen con más frecuencia; en este caso se trata de la llamada de sistema write(2). Puede usar el proveedor syscall para examinar en profundidad el origen de todas las llamadas del sistema 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        

La salida muestra que el proceso está ejecutando muchas llamadas del sistema write() con una cantidad de datos relativamente pequeña. Esta relación puede ser el origen de los problemas de rendimiento de este proceso concreto. En este ejemplo se muestra la metodología general para investigar el comportamiento de las llamadas del sistema.