Guía de seguimiento dinámico de Solaris

Sondeos profile-n

Los sondeos profile-n se activan después de un intervalo de tiempo fijo, en todas las CPU a un alto nivel de interrupción. El intervalo de activación del sondeo está indicado por el valor de n: la fuente de interrupción se activará n veces por segundo. n podría tener también un sufijo de tiempo opcional, en cuyo caso se interpreta que n se encuentra en las unidades que vienen indicadas con el sufijo. Puede consultar la lista de sufijos válidos y las unidades que denotan en la Tabla 19–1.

Tabla 19–1 Sufijos de tiempo válidos

Sufijo 

Unidades de tiempo 

nsec o ns

nanosegundos 

usec o us

microsegundos 

msec o ms

milisegundos 

sec o s

segundos 

min o m

minutos 

hour o h

horas 

day o d

días 

hz

hercios (frecuencia por segundo) 

El siguiente ejemplo crea un sondeo que se activa a los 97 hercios para obtener muestras del proceso que se encuentra en ejecución:

#pragma D option quiet

profile-97
/pid != 0/
{
	@proc[pid, execname] = count();
}

END
{
	printf("%-8s %-40s %s\n", "PID", "CMD", "COUNT");
	printa("%-8d %-40s %@d\n", @proc);
}

La ejecución del ejemplo anterior durante un breve periodo de tiempo devuelve una salida similar a la del siguiente ejemplo:


# dtrace -s ./prof.d
^C
PID      CMD                                      COUNT
223887   sh                                       1
100360   httpd                                    1
100409   mibiisa                                  1
223887   uname                                    1
218848   sh                                       2
218984   adeptedit                                2
100224   nscd                                     3
3        fsflush                                  4
2        pageout                                  6
100372   java                                     7
115279   xterm                                    7
100460   Xsun                                     7
100475   perfbar                                  9
223888   prstat                                   15

Es posible también utilizar el proveedor profile-n para obtener información de ejemplo acerca de los procesos en ejecución. La siguiente secuencia de comandos de ejemplo D utiliza un sondeo de perfil de 1.001 hercios para obtener ejemplos de la prioridad actual de un proceso especificado:

profile-1001
/pid == $1/
{
	@proc[execname] = lquantize(curlwpsinfo->pr_pri, 0, 100, 10);
}

Para ver esta secuencia de comandos de ejemplo en acción, escriba los siguientes comandos en una ventana:


$ echo $$
12345
$ while true ; do let i=0 ; done

En otra ventana, ejecute la secuencia de comandos D durante un breve periodo de tiempo, y sustituya 12345 con el PID que haya devuelto el comando echo:


# dtrace -s ./profpri.d 12345
 dtrace: script './profpri.d' matched 1 probe
^C
ksh                                               
           value  ------------- Distribution ------------- count    
             < 0 |                                         0        
               0 |@@@@@@@@@@@@@@@@@@@@@                    7443     
              10 |@@@@@@                                   2235     
              20 |@@@@                                     1679     
              30 |@@@                                      1119     
              40 |@                                        560      
              50 |@                                        554      
              60 |                                         0 

Esta salida muestra el margen de error de la clase de planificación de utilización compartida de tiempo. Debido a que el proceso shell está girando en la CPU, el sistema reduce constantemente su prioridad. Si el proceso shell se ejecutara con menor frecuencia, su prioridad sería más alta. Para ver este resultado, pulse Control-C en la shell que se encuentra en ciclo y vuelva a ejecutar la secuencia de comandos:


# dtrace -s ./profpri.d 494621
 dtrace: script './profpri.d' matched 1 probe

Escriba algunos caracteres en la shell. Cuando finalice la secuencia de comandos DTrace, aparecerá una salida similar a la del siguiente ejemplo:


ksh                                               
           value  ------------- Distribution ------------- count    
              40 |                                         0        
              50 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 14       
              60 |                                         0

Dado que el proceso shell se encontraba inactivo esperando una acción por parte del usuario en lugar de estar girando en la CPU, cuando se ejecutó, lo hizo a una prioridad mucho más alta.