Siempre he tenido la impresión de que mientras tenga memoria libre, ya sea al 100% o al 10%, la velocidad de sus procesos no debería verse afectada.
Sin embargo, recientemente me encontré con una situación en la que parece que mis procesos se vuelven mucho más lentos cuando consume un mayor porcentaje de la memoria disponible.
Podría ser un problema con el código en sí, pero espero obtener una verificación rápida de que no he estado viviendo una mentira antes de profundizar en el código en sí.
Realmente todo depende de cómo esté codificada la aplicación y de lo que esté haciendo. Para algunas aplicaciones, no hará ninguna diferencia si la memoria libre es del 10 % o del 100 %, siempre que haya suficiente para que haga su trabajo.
Para otras aplicaciones, pueden encontrar fragmentación de la memoria, pueden provocar el intercambio de disco, incluso pueden ajustar su propio comportamiento debido a la menor cantidad de memoria disponible (utilizando búferes más pequeños, forzando datos en el disco, etc.). En un sistema de recolección de basura (como nodejs), una condición de memoria más baja también puede causar una recolección de basura más frecuente.
El mayor impacto individual en el rendimiento por ejecutarse con menos memoria será si la aplicación hace que el sistema operativo pagine la memoria en el disco. Aquí es donde la memoria virtual que se usa excede la memoria física real y el sistema operativo tiene que sustituir algo de espacio en disco por la memoria asignada. El sistema operativo intenta cambiar la memoria a un disco al que no se ha accedido recientemente con la esperanza de que no se vuelva a necesitar pronto, pero a veces eso simplemente no funciona de manera muy eficiente y el disco duro se ve afectado constantemente, leyendo constantemente. /escribir memoria a/desde disco. Dado que los discos son miles de veces más lentos que la memoria física, esto puede ralentizar enormemente las cosas.
También hay casos de diseño de aplicaciones en los que algunas operaciones en una aplicación como Photoshop simplemente se ejecutarán más rápido con más memoria disponible para usar porque los algoritmos se adaptarán para usar la mayor cantidad de memoria para que la operación se ejecute más rápido cuando se trabaja en objetos grandes. Una aplicación o biblioteca de nodejs podría estar haciendo lo mismo. Por ejemplo, se puede diseñar un algoritmo de procesamiento de imágenes para trabajar en imágenes más grandes de las que caben en la memoria, por lo que debe decidir cuánta memoria es "segura" para asignar y luego trabajar en la imagen en fragmentos. Con una menor cantidad de memoria disponible, el trabajo se realiza de manera menos eficiente en fragmentos más pequeños.
Una razón más común por la que las cosas se vuelven más lentas con el tiempo es debido a algún tipo de fragmentación interna o fugas que hacen que las tareas domésticas regulares (como la asignación de memoria) sean menos eficientes. Esto puede ocurrir en el nivel del montón o en el nivel de la aplicación. Esta es la razón por la que algunos administradores programan procesos de ejecución prolongada (como servidores) para que se reinicien automáticamente de vez en cuando, para eliminar esta fragmentación o pequeñas fugas y comenzar de nuevo regularmente.
Si es un problema importante, una depuración exhaustiva puede explicar de dónde provienen los impactos importantes, pero esta no es una depuración trivial, ya que implica muchas mediciones, recopilación de datos, ajuste de lo que está viendo en función de lo que encuentra, etc... todo mientras trata de no influir en lo que está tratando de encontrar/medir.