Nota: Conozco la pregunta Memory management in memory intensive application, sin embargo, esa pregunta parece ser sobre aplicaciones que hacen frecuentes asignaciones de memoria, mientras que mi pregunta es sobre aplicaciones intencionalmente diseñadas para consumir tanta memoria física como es seguro.Gestión de memoria para aplicaciones intensivas en memoria intencionalmente
Tengo una aplicación de servidor que usa grandes cantidades de memoria para realizar el almacenamiento en caché y otras optimizaciones (piense en SQL Server). La aplicación se ejecuta en una máquina dedicada, por lo que puede (y debe) consumir la cantidad de memoria que quiera/pueda para acelerar y aumentar el rendimiento y los tiempos de respuesta sin preocuparse de afectar a otras aplicaciones en el sistema.
El problema es que si se subestima el uso de la memoria, o si aumenta la carga, es posible que termine con fallas desagradables ya que las asignaciones de memoria fallan; en esta situación, obviamente lo mejor es liberar memoria para evitar falla a expensas del rendimiento.
Algunos supuestos:
- la aplicación se ejecuta en una máquina dedicada
- Los requisitos de memoria de la aplicación exceden la memoria física en la máquina (es decir, si estaba disponible para la aplicación que la memoria expandible siempre será capaz de usar esa memoria para de alguna manera mejorar los tiempos de respuesta o el rendimiento)
- La memoria se gestiona de forma efectiva de manera que la fragmentación de la memoria no sea un problema.
- La aplicación sabe qué memoria se puede liberar con seguridad, y qué memoria se debe liberar primero para el menor impacto de rendimiento.
- Las carreras de aplicaciones en una máquina Windows
Mi pregunta es - ¿Cómo debo manejar las asignaciones de memoria en una aplicación de este tipo? En particular:
- ¿Cómo puedo predecir si una asignación de memoria fallará o no?
- ¿Debo dejar cierta cantidad de memoria libre para garantizar que las operaciones del sistema operativo principal sigan siendo receptivas (y de esa manera no afecten adversamente el rendimiento de las aplicaciones) y cómo puedo saber cuánta memoria hay?
El objetivo central es evitar fallos como resultado del uso de demasiada memoria, mientras que al mismo tiempo utilizando la mayor cantidad de memoria posible.
Soy un desarrollador de C#, sin embargo, mi esperanza es que los conceptos básicos para cualquier aplicación de este tipo sean los mismos independientemente del idioma.
Btw - He sido intencionalmente vauge sobre el término "memoria" debido a las complejidades de la memoria virtual vs física. Por la misma razón, no he mencionado 32 bit vs 64 bit. – Justin