Mejorando la Performance en Sistemas Linux/Unix | ||
---|---|---|
Anterior |
El siguiente programa permite ejercitar la memoria física (y el swap con los valores adecuados) con el fin de aprender a observar la paginación (con vmstat):
#include <stdio.h> #include <stdlib.h> int main(int argc,char **argv) { char *ptr; unsigned long z,k,r; unsigned long pag,off; unsigned char x; unsigned long r1,r2,r3,r4; if(argc!=3) { fprintf(stderr,"Use ram_stress <#KB> <#repeticiones>\n"); return 2; } k=atoi(argv[1]); r=atol(argv[2]); if(k<1 || r<1) { fprintf(stderr,"Se requiere valor positivo de KB y repeticiones\n"); return 1; } ptr=malloc(1024L*k); if(ptr==NULL) { fprintf(stderr,"malloc error: falta memoria?\n"); return 1; } for(z=0;z<r;z++) { r1=rand(); r2=rand(); r3=rand(); r4=rand(); pag=labs(r1*r2)%k; off=r3%1024; x=r4%256; ptr[1024*pag+off]=x; } free(ptr); return 0; }Por ejemplo, para un sistema de 512Mb, el siguiente comando obliga a utilizar aproximadamente 50Mb para pruebas (el segundo argumento es el número de "pruebas" y debe ajustarse gradualmente dependiendo de la duración deseada del test.)
$ time ./ram_stress 50000 1200000 real 0m0.842s user 0m0.670s sys 0m0.151sEn mi sistema (Athlon XP-2000) este comando tarda menos de un segundo en completarse. En cambio, si se reserva más memoria (aún manteniendo el número de pruebas, es decir, haciendo el mismo trabajo) el tiempo se eleva a más de 1 minuto debido a que se ingresa al régimen de carencia de memoria:
$ time ./ram_stress 500000 1200000 real 1m9.893s user 0m1.027s sys 0m1.896sUd. debería hacer estas pruebas con diferentes valores para el bloque de memoria. Observará cómo la paginación se hace cada vez más pronunciada conforme solicitamos un bloque que se acerca cada vez más a la memoria física instalada.