La falacia de que «la RAM está para ser usada»

Parece que se ha vuelto popularizado un error de concepto en algunos foros de usuarios. Tal vez recuerdes esta frase:

La RAM está para ser usada.

Esta frase es cierta dentro de un contexto en particular. Se usa para permitir que el sistema operativo acelere disco a RAM tanto como sea posible, pues la RAM es significativamente más rápida que los discos duros.

Sin embargo, dentro del contexto de una aplicación de usuario, en realidad es una falacia. Algunos usuarios (e incluso algunos desarrolladores) no saben mucho sobre el funcionamiento interno de su computadora y usan esta frase fuera de su contexto correcto. Lo peor es que algunas veces ni siquiera les importa el consumo de la RAM. No les importan los derrames de memoria o piensan que si ocurren sólo una vez, no pasa nada. O piensan que los lenguajes y plataformas con recolección de basura (garbage collectors) se encargarán mágicamente de todo. Sin darse cuenta, acaban usando la frase en cuestión como un equivalente de:

La RAM está para ser desperdiciada.

Hay algunas cuestiones que en realidad alimentan este modo de pensar, llevándolos a concluir que una aplicación realmente debería poner tanta información como sea posible en la RAM y que, tarde o temprano, el sistema operativo lo manejará eficientemente. Más aún, que no hacerlo es un sacrificio de rendimiento.

Consideremos lo siguiente (sobresimplificaré para efectos de facilidad de explicación, pero el modelo es bueno). Por una parte:

  • Cuando una aplicación solicita RAM y el sistema operativo la asigna, esa memoria queda reservada para el uso exclusivo de la aplicación hasta que ésta la libera. Una aplicación no puede saber (y no debería) si otra requiere o solicita RAM.
  • Si la RAM física se llena y hay espacio de paginación (swap o paging) disponible en el sistema, el OS descargará algunas de las páginas menos usadas de la RAM hacia el espacio de paginación, sea una partición o un archivo. Cuando la RAM paginada se necesita nuevamente, se intercambia con otras páginas de RAM de las menos usadas. Ambas operaciones requieren de actividad en el disco duro. Eso es lo que hace a la paginación inherentemente lenta.
  • El sistema operativo siempre dejará libre algo (digamos, 50 MB) de RAM física sin usar para que haya disponible cuando necesite reaccionar a una emergencia de inestabilidad de sistema.

Por otra parte:

  • El sistema operativo usa memoria física para acelerar lecturas y escrituras a disco por medio de caché, de modo que cuando un sector de disco es leído múltiples veces, las subsecuentes se obtienen de la RAM, que es mucho más rápida.
  • El OS sólo acelerará lecturas/escrituras a disco hacia RAM física, pues sería inútil «acelerar» de disco a disco.
  • Cuando una aplicación solicita RAM, el OS liberará RAM usada para caché antes de asignarla al a aplicación solicitante. Esta operación no requiere actividad de disco si se están liberando lecturas aceleradas o escrituras ya fijadas; sin embargo, sí requiere de escribir en disco si necesita fijar escrituras aceleradas pendientes. Usualmente, el sistema operativo realiza esta fijación cuando la PC está en ocio, de modo que uno no lo nota y, cuando llega el momento, ya no hay escrituras pendientes por fijar.

Por último:

  • Linux reporta el «tamaño residente en RAM» para un proceso como «consumo de RAM física». Si uno quiere medir el consumo de RAM por una aplicación, se debe hacer con la swap desactivada. Por favor indíquenme cómo Windows reporta la RAM consumida por un proceso.
  • Las escrituras a disco suelen ser más lentas que las lecturas.

La realidad sobre esta falacia es «cierto, el sistema operativo se encargará de eso, pero se muere el caché de disco y se provoca la paginación, alentando todo el sistema, incluyendo la propia aplicación«. Entonces: sí, el sistema se encarga, pero en realidad está recuperándose del error del programador a costa de una degradación global e innecesaria de sistema y la potencial inestabilida que conlleva.

Analicemos dos escenarios tomados de mi propia experiencia. Repito: estoy sobresimplificando. Úsese esto como modelo.

Caso 1: Un navegador acelera la red a disco en lugar de a RAM

Tienes un sistema con 2 GB de RAM, de los cuales tienes 1 GB libres (como en «tal vez usados por el caché de disco pero ciertamente disponible para las aplicaciones»). Tú ejecutas un navegador que acelera los recursos de red a disco porque es más rápido que el Internet (pues es más rápido que el Internet) y usa unos 300 MB de RAM.

1000 – 300 – 50 = 650

Acabas con unos 650 MB de RAM para aceleración de disco por memoria caché y 50 MB de RAM física real.

Cuando un navegador necesita un recurso de red, intenta cargarlo de disco (pues lo está acelerando). Sin embargo, el disco queda acelerado en la RAM por el sistema operativo y las lecturas subsecuentes se realizan en RAM. La penalidad en rendimiento apenas se nota.

Si el navegador quiere acelerar una página visitada por primera vez, la guardará en disco. El SO acelerará la lectura a RAM y la pospondrá hasta que el sistema esté en ocio (cuando estás leyendo el contenido del sitio). La penalidad en rendimiento apenas se nota.

Cuando cualquier otro proceso lee de disco, la probabilidad de pegarle al caché es alta porque hay 650 MB de RAM disponibles par esto. Incluso si se le falla al caché, lo que se lee de disco se acelera en RAM para los accesos subsecuentes. reading.

Entonces, ejecutas una máquina virtual que requiere de 450 MB de RAM. Ocurre lo siguiente:

  • El sistema operativo libera 450 MB de caché de disco. Parte de este requiere de escrituras, parte no. Esta operación es sólo tan lenta como la cantidad de escrituras requeridas para fijar las escrituras aceleradas, así que no es tan lento. Además, el usuario en cierto modo lo espera porque le pidió a la PC cargar la VM.
  • No hay paginación. No es necesario.
  • Finalmente se asignan los 450 MB a la VM.
  • La VM escribe a ese espacio físico de RAM asignado.

Aún quedan 200 MB disponibles para caché de disco, que el SO procurará usar eficientemente.

Ahora, el navegador quiere cargar algo de su «cache de disco». Hay una probabilidad, claro que mayor que 0, de pegarle al caché y que el SO sirva el dato directamente desde la RAM. Supongamos que no, que fue leída desde disco. El navegador aún está acelerando la navegación pues el disco local es más rápido que el Internet. Más aún, el SO acelerará este objeto en la RAM para sus accesos subsecuentes.

Claro: la VM continúa corriendo desde la RAM sin necesitar de ningún tipo de paginación (o hiperpaginación). El sistema responde perfectamente. El usuario sabe (o debería saber) que si quiere liberar memoria, debe cerrar la VM o el navegador.

Caso 2: Un navegador usa más RAM que la que requiere, para su aceleración

Tienes un sistema con 2 GB de RAM, de los cuales tienes 1 GB libres (como en «tal vez usados por el caché de disco pero ciertamente disponible para las aplicaciones»). Tú ejecutas un navegador que acelera los recursos de red a disco porque es más rápido que el Internet (pues es más rápido que el Internet) y usa unos 600 MB de RAM.

1000 – 600 – 50 = 350

Acabas con unos 350 MB de RAM para aceleración de disco y 50 MB de RAM física real.

Cuando el navegador necesita un recurso de red, trata de cargarlo desde su asignación de RAM, así que es muy rápido (aún así, tiene que leerlo primero de disco si no estaba previamente disponible en RAM).

Cuando cualquier otra aplicación lee de disco hay una baja probabilidad de pegarle al caché. En cualquier caso, la probabilidad general de que otra aplicación le pegue al caché es más baja, pues la memoria está exclusivamente asingada para el navegador. Esto incrementa significativamente la probabilidad de acceder a disco, lo que puede llevar a una alentar todo el sistema.

Minimizar el navegador no libera memoria para otras aplicaciones. la memoria aún está asignada para su uso exclusivo para éste.

Entonces, ejecutas una máquina virtual que requiere de 450 MB de RAM. Ocurre lo siguiente:

  • El sistema operativo libera 350 MB de caché de disco. Parte de este requiere de escrituras, parte no. Esta operación es sólo tan lenta como la cantidad de escrituras requeridas para fijar las escrituras aceleradas, así que no es tan lento.
  • Determina los 100 MB menos usados de RAM y las mueve al espacio de paginación. Esta operación es lenta pues implica varias escrituras inevitables a disco.
  • Finalmente se asignan los 450 MB a la VM
  • La VM escribe a ese espacio físico de RAM asignado.

El sistema ya no tiene caché de disco. Cuando otra aplicación necesita leer de disco, no le pegarán al inexistente caché y el SO tendrá que acceder físicamente al disco para servir esta petición. Esto es lento. Lo peor es que el acceso a disco no será acelerado para sus subsecuentes lecturas.

Ahora, el navegador quiere cargar algo desde su propia «caché de memoria» (que, por cierto, tal vez está paginada a disco). Puede pasar una de dos:

Si el recurso a extraer del caché de RAM de la aplicación está paginado en disco, el SO necesitará leerlo de vuelta. Puesto que los datos leídos ahora serán memoria «más reciente usada», el SO podría intercambiarlos de disco contra algo de la RAM de la VM o de otra aplicación menos usada. Esta operación es lenta pues implica varias escrituras inevitables a disco. O:

Si el recurso aún está en la propia «caché de memoria» de la aplicación, será extraída como de rayo de la RAM. Sin embargo, la VM aún necesita su propia RAM para continuar al igual que las demás aplicaciones. Esto fuerza al sistema operativo a usar paginación nuevamente. Además, no hay RAM disponible para caché de disco y otras solicitudes de disco estarán continuamente siendo servidas desde disco sin la posibilidad de acelerar las subsecuentes hacia RAM. Esto genera una actividad constante a disco, alentando todo el sistema incluyendo al navegador. El «caché de memoria» de la aplicación no sirvió para nada.

Claro que la máquina virtual continúa corriendo y su RAM se necesita constantemente, así que la escritura a disco por paginación se vuelve una constante. El sistema operativo se alenta por lo que se llama hiperpaginación. En casos extremos, el sistema deja de responder, impidiendo al usuario de siquiera cerrar una de las dos aplicaciones para recuperarlo.

Conclusiones

Sí, la RAM está ahí para ser usada cuando se necesita, no para desperdiciarse. La RAM es un recurso limitado. Hay maneras de usar la RAM eficientemente. Por ejemplo, cargar los índices de un buzón de correo en RAM (sin cargar el contenido completo del buzón) puede, si se hace correctamente, acelerar significativamente la búsqueda de mensajes.

Sin embargo, acelerar disco a RAM puede que no sea una buena idea. La aceleración ya se hace por el SO, así que sólo se desperdicia una función eficiente del sistema operativo. A veces puede ser una buena idea, pero lo más probable, especialmente en aplicaciones de escritorio, es que no.


Comentarios

La falacia de que «la RAM está para ser usada» — 3 comentarios

  1. Linux usa el 100% de la RAM de cualquier forma. Si no se usa para las aplicaciones, se usa para el cache. Mientras más memoria RAM usen las aplicaciones, más lenta será la máquina porque el kernel necesita ir de nuevo a disco, en vez de usar lo que ya está en cache.

  2. Estoy de acuerdo con el post, pero lo grandioso del sistema linux es la ventaja de ser adaptable, lo cierto es que va dependiendo de las necesidades de cada usuario.

    En mi caso yo tengo una portátil con 4gb de ram, y uso un disco SSD, los cuales tienen una vida menor que los Discos Duros Clásicos(para los que no lo sepan), que para evitar desperdiciar el uso de escritura en este caso de la cache tanto del navegador como del Sistema en sus temporales, todo esto lo desvió a la memoria, anteriormente checaba el uso del SSD con iotop o simplemente usando powertop, me alertaba anteriormente que el disco no entraba en descanso por que trabajaba en los temporales del sistema o el navegador.

    si uso ubuntu utilizo en que cargue el sistema tan solo 524MB de memoria, así que en mi caso creo que si me puedo dar ese lujo, simplemente y como se demostró, con un estudio, se ve si es viable o no hacer determinados Tweaks al sistema.

    por cierto, en la codificación de vídeo, me va mejor, aun que no he hecho benchmarks

  3. Para colmo tienes razon y para los que no entendieron el amigo quiso decir que para que una compu sea rapida no solo requiere de mucha ram sino de alta transferencia de disco duro y buena comunicacion de procesador asi que no por que una comutadora se pase de ram se tiene que hacer un programa que llegue al limite de ram ya que tambien se requiere para otros procesos.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *