Al agregar datos a lo largo de un periodo de tiempo amplio, es posible que desee normalizar los datos en relación a algún factor constante. Esta técnica permite comparar los datos separados de forma más sencilla. Por ejemplo, al agregar llamadas del sistema, es posible que desee obtener como resultado las llamadas del sistema con una tasa por segundo en lugar de un valor absoluto que englobe todo el periodo completo. La acción normalize() de DTrace permite normalizar los datos de esta manera. Los parámetros de normalize() incluyen una adición y un factor de normalización. El resultado de la adición muestra cada valor dividido por el factor de normalización.
En el siguiente ejemplo, se muestra cómo agregar datos por llamada del sistema:
#pragma D option quiet BEGIN { /* * Get the start time, in nanoseconds. */ start = timestamp; } syscall:::entry { @func[execname] = count(); } END { /* * Normalize the aggregation based on the number of seconds we have * been running. (There are 1,000,000,000 nanoseconds in one second.) */ normalize(@func, (timestamp - start) / 1000000000); }
Al ejecutar la secuencia de comandos anterior durante un breve periodo de tiempo, se obtiene como resultado la siguiente salida en el equipo de escritorio:
# dtrace -s ./normalize.d ^C syslogd 0 rpc.rusersd 0 utmpd 0 xbiff 0 in.routed 1 sendmail 2 echo 2 FvwmAuto 2 stty 2 cut 2 init 2 pt_chmod 3 picld 3 utmp_update 3 httpd 4 xclock 5 basename 6 tput 6 sh 7 tr 7 arch 9 expr 10 uname 11 mibiisa 15 dirname 18 dtrace 40 ksh 48 java 58 xterm 100 nscd 120 fvwm2 154 prstat 180 perfbar 188 Xsun 1309 .netscape.bin 3005 |
normalize() establece el factor de normalización para la adición especificada, pero esta acción no modifica los datos subyacentes. La acción denormalize() sólo utiliza una adición. Al agregar la acción de anulación de la normalización al ejemplo anterior, se devuelven los recuentos de llamadas del sistema sin procesar y las tasas por segundo:
#pragma D option quiet BEGIN { start = timestamp; } syscall:::entry { @func[execname] = count(); } END { this->seconds = (timestamp - start) / 1000000000; printf("Ran for %d seconds.\n", this->seconds); printf("Per-second rate:\n"); normalize(@func, this->seconds); printa(@func); printf("\nRaw counts:\n"); denormalize(@func); printa(@func); }
Al ejecutar la secuencia de comandos anterior durante un breve periodo de tiempo, se obtiene un resultado similar al siguiente ejemplo:
# dtrace -s ./denorm.d ^C Ran for 14 seconds. Per-second rate: syslogd 0 in.routed 0 xbiff 1 sendmail 2 elm 2 picld 3 httpd 4 xclock 6 FvwmAuto 7 mibiisa 22 dtrace 42 java 55 xterm 75 adeptedit 118 nscd 127 prstat 179 perfbar 184 fvwm2 296 Xsun 829 Raw counts: syslogd 1 in.routed 4 xbiff 21 sendmail 30 elm 36 picld 43 httpd 56 xclock 91 FvwmAuto 104 mibiisa 314 dtrace 592 java 774 xterm 1062 adeptedit 1665 nscd 1781 prstat 2506 perfbar 2581 fvwm2 4156 Xsun 11616 |
Las adiciones también pueden volver a normalizarse. Si se llama a normalize() más de una vez para una misma adición, se utilizará el factor de adición especificado en la llamada más reciente. En el siguiente ejemplo, se imprimen las tasas por segundo durante un periodo de tiempo:
#pragma D option quiet BEGIN { start = timestamp; } syscall:::entry { @func[execname] = count(); } tick-10sec { normalize(@func, (timestamp - start) / 1000000000); printa(@func); }