Como eliminar el cache del sistema de archivos

Daniel Serpell daniel.serpell en gmail.com
Lun Ene 31 16:26:07 CLST 2005


Hola!

El Mon, Jan 31, 2005 at 02:14:42AM -0300, "Felipe Cristián Barriga Richards (Listas)" escribio:
> Hola lista, siempre he tenido una gran duda: Como hacer para que los 
> archivos que estan cacheados en la ram, liberen esa ram ?.
> En Windows existen varios programas que lo que supongo que hacen es 
> comer toda la ram y cuando ya no hay nada que comer, se cierran y asi 
> elimina todo el cache de disco (ya que el sistema operativo va 
> eliminando el cache de archivos a medida de que alguien necesita ram).
> Queria consultarles si alguien sabe como limpiar ese cache o modificar 
> su tamaño. Por el momento se me ocurrio crear un programita en C que 
> pide de 1MB en 1MB hasta que se pone medio extraño el pc y ahi lo mato. 
> Por lo general quedo con un cache de archivos de 700KB o algo similar 
> pero no me parece un metodo muy civilizado de hacerlo. Tambien si 
> alguien sabe como hacerlo en FreeBSD me ayudaria.

Primero, una pregunta: ¿para qué quieres eso?

El núcleo se encarga de reducir el tamaño del cache y los buffers
dinámicamente cuando algún programa requiere esa memoria.

Si lo que deseas es cambiar la agresividad de la política de liberación
de memorie y uso de la memoria de intercambio, puedes probar modificar
/proc/sys/vm/swappiness (indica cuanto se favorece usar SWAP en vez de
achicar el cache), /proc/sys/vm/min_free_kbytes (minima cantidad de
memoria libre antes de comenazar a liberar memoria),
/proc/sys/vm/laptop-mode (si está en 1 indica que escriba los buffers al
disco lo antes posible), etc.

Y si realmente quieres liberar memoria a lo chancho, puedes usar este
programa (usar como "./mem 120M", para liberar 120 MBytes).

        Daniel.

#####################################################################
#ifdef _BASH_ /*
gcc -O2 -Wall -o /tmp/mem $0 && /tmp/mem
exit
*/
#endif

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char **argv)
{
   int i,j,sz,*buf;

   for(i=1024*1024*1024; !(buf=malloc(i)); i=i>>2);
   free(buf);
   if(i<1024)
       return -1;
   i /= 256;
   for(sz=512*i;!(buf=malloc(sz));sz=sz-i);
   printf("Pudo pedir: %d.%02dMb de memoria\n",sz>>20,(sz&0xfffff)/(1024*1024/100));
   if( argc > 1 )
   {
       int n;
       char *b;
       n = strtol(argv[1],&b,0);
       if( *b != 0)
       {
           if( b[1] == 0 && (*b == 'k' || *b == 'K') )
               n = n * 1024;
           else if( b[1] == 0 && (*b == 'm' || *b == 'M') )
               n = n * 1024 * 1024;
           else if( b[1] == 0 && (*b == 'g' || *b == 'G') )
               n = n * 1024 * 1024 * 1024;
           else
           {
               fprintf(stderr,"Error en argumento '%s' (%s)\n",argv[1],b);
               return -1;
           }
       }
       if( sz > n && n > 65536 )
           sz = n;
       printf("Probando %d.%02dMb de memoria\n",sz>>20,(sz&0xfffff)/(1024*1024/100));
   }
   sz = sz / sizeof(int) / 1024;

   printf("Primera pasada - rápida\n");
   for(i=0;i<sz;i+=64)
   {
      if( !((i * sizeof(int)) & 16383) )
         printf("\nTest: %4dMB  ",i*sizeof(int)/1024);
      printf(".");
      fflush(stdout);
      for(j=i*1024;j<i*1024+65535;j++)
         buf[j] = i + j;
   }

   printf("\nSegunda pasada - expansiva\n");
   for(i=0;i<sz;i+=64)
   {
      if( !((i * sizeof(int)) & 2047) )
         printf("\nTest: %4dMB  ",i*sizeof(int)/1024);
      printf(".");
      fflush(stdout);
      for(j=0;j<i;j++)
         buf[1024*j] += buf[1024*i] + i + j;
   }

   return 0;
}



Más información sobre la lista de distribución Linux