Ejecutar una aplicación .NET en Windows Server 2008 x64 con 16 GB de RAM. Esta aplicación necesita buscar y analizar una gran cantidad de datos (aproximadamente 64 GB), y mantener todo en la memoria a la vez.Recolector de elementos no utilizados .NET y memoria virtual x64
Lo que espero ver: El tamaño del proceso se expande más allá de 16GB a 64GB. Windows usa memoria virtual para enviar los datos extra a/desde el disco según sea necesario. Este es el clásico caso de uso de la memoria virtual.
Lo que realmente veo: El tamaño del proceso está limitado a la cantidad de memoria física (16 GB). La aplicación pasa el 99.8% de su tiempo en el recolector de basura.
¿Por qué nuestra aplicación no puede utilizar la memoria virtual? ¿Es esto un problema en la configuración del recolector de basura .NET o en el administrador de memoria virtual x64 de Windows mismo? ¿Qué puedo hacer para que nuestra aplicación use memoria virtual en lugar de limitarse a la memoria física?
Gracias.
- Brian
Actualización: Me han escrito un programa muy pequeño que presenta el mismo comportamiento:
using System;
namespace GCTest
{
class Program
{
static void Main()
{
byte[][] arrays = new byte[100000000][];
for (int i = 0; i < arrays.Length; ++i)
{
arrays[i] = new byte[320];
if (i % 100000 == 0)
{
Console.WriteLine("{0} arrays allocated", i);
System.Threading.Thread.Sleep(100);
}
}
}
}
}
Si quieres probarlo, asegúrese de construir para x64. Puede que tenga que modificar las constantes un poco para estresar su sistema. El comportamiento que veo es que el proceso se atasca a medida que se acerca a un tamaño de 16 GB. No hay mensaje de error o excepción lanzada. El monitor de rendimiento informa que el% del tiempo de CPU en GC se aproxima al 100%.
¿No es esto inaceptable? ¿Dónde está el sistema de memoria virtual?
¿Qué está utilizando para determinar el tamaño del proceso? (Eliminemos las opciones fáciles primero :)) – Paolo
"Tamaño de confirmación" desde el Administrador de tareas de Windows. También se usa "# Total de bytes comprometidos" en el Monitor de rendimiento. Estoy bastante seguro de que estoy midiendo el tamaño de la memoria virtual del proceso en lugar de su conjunto de trabajo físico. – brianberns
¿Puedo preguntar lo obvio? ¿Realmente necesita cargar todo esto en la memoria a la vez? ¿Es posible tomar otro enfoque y hacer algún tipo de paginación manual por su cuenta? – CodingGorilla