Solución de problemas de rendimiento de la caché y el administrador de memoria

Antes de Windows Server 2012, dos posibles problemas principales provocaban que la caché de archivos del sistema creciera hasta que la memoria disponible prácticamente se agotaba con determinadas cargas de trabajo. Si esta situación da lugar a que el sistema sea lento, puede determinar si el servidor tiene uno de estos problemas.

Contadores que se deben supervisar

  • Memory\Long-Term Average Standby Cache Lifetime (s) < 1800 segundos

  • Memoria\Disponible (en Bytes, KBytes o MBytes)

  • Memoria\Bytes residentes de caché del sistema

Si el valor de Memoria\MB disponibles es bajo y al mismo tiempo Memoria\Bytes residentes de caché del sistema está consumiendo una parte significativa de la memoria física, puede usar RAMMAP para averiguar para qué se está usando la memoria caché.

La caché de archivos del sistema contiene estructuras de datos de metarchivos NTFS

Este problema se indica mediante un gran número de páginas de metarchivo activas en la salida RAMMAP, como se muestra en la ilustración siguiente. Es posible que este problema se haya observado en servidores ocupados con millones de archivos a los que se accede, lo que da lugar a que no se libere de la memoria caché el almacenamiento de los datos de los metarchivos NTFS.

rammap view

El problema se solía corregir con la herramienta DynCache. En Windows Server 2012 y versiones posteriores, la arquitectura se ha rediseñado y este problema ya no debería producirse.

La caché de archivos del sistema contiene archivos asignados a memoria

Este problema viene indicado por un gran número de páginas activas de archivos asignados en la salida de RAMMAP. Esto suele indicar que alguna aplicación en el servidor está abriendo numerosos archivos grandes mediante la API CreateFile con el conjunto de marcas FILE_FLAG_RANDOM_ACCESS.

Este problema se describe en detalle en el artículo de KB 2549369. La marca FILE_FLAG_RANDOM_ACCESS es una sugerencia para que el administrador de caché mantenga las vistas asignadas del archivo en memoria el mayor tiempo posible (hasta que el administrador de memoria no indique una condición de memoria baja). Al mismo tiempo, esta marca indica al administrador de caché que deshabilite la captura previa de datos de archivos.

Esta situación se ha mitigado en cierta medida mediante mejoras en el recorte de los espacios de trabajo de Windows Server 2012 y versiones posteriores, pero el proveedor de la aplicación debe ser el principal encargado de abordar el problema en sí sin usar FILE_FLAG_RANDOM_ACCESS. Una solución alternativa para el proveedor de la aplicación podría ser usar una prioridad de memoria baja al acceder a los archivos. Esto se puede lograr mediante la API SetThreadInformation. Las páginas a las que se accede con prioridad de memoria baja se eliminan del espacio de trabajo de forma más intensiva.

El administrador de caché a partir de Windows Server 2016 mitiga aún más esto al omitir FILE_FLAG_RANDOM_ACCESS al tomar decisiones de recorte, por lo que se trata igual que cualquier otro archivo abierto sin la marca FILE_FLAG_RANDOM_ACCESS (el administrador de caché sigue respetando esta marca a la hora de deshabilitar la captura previa de datos de archivos). Todavía puede causar un sobredimensionamiento de la caché del sistema si tiene un gran número de archivos abiertos con esta marca y a los que se accede de forma verdaderamente aleatoria. Es muy recomendable que las aplicaciones no usen FILE_FLAG_RANDOM_ACCESS.

Se supera de forma constante el umbral de páginas desfasadas de archivos remotos.

Este problema aparece si un sistema experimenta ralentizaciones ocasionales durante las escrituras de un cliente remoto. Este problema podría producirse cuando se escribe una gran cantidad de datos desde un cliente remoto rápido en un servidor de destino lento.

Antes de Windows Server 2016, en este escenario, si se alcanzaba el umbral de páginas desfasadas en la memoria caché, las escrituras adicionales se comportaban como si hubiera escrituras simultáneas. Esto puede provocar el vaciado de una gran cantidad de datos en el disco, lo que puede ocasionar grandes retrasos si el almacenamiento es lento, provocando tiempos de espera en la conexión remota.

En Window Server 2016 y versiones posteriores se ha puesto en marcha una mitigación para reducir la probabilidad de que se produzcan tiempos de espera. Se implementa un umbral de páginas desfasadas independiente para las escrituras remotas y se realiza un vaciado en línea en el disco cuando este umbral se supera. Esto puede dar lugar a ralentizaciones ocasionales durante una actividad de escritura intensiva, pero elimina el riesgo de un agotamiento del tiempo de espera en la mayoría de los casos. Este umbral de páginas desfasadas remoto es de 5 GB por archivo de forma predeterminada. Con algunas configuraciones y cargas de trabajo, un número diferente funciona mejor.

Si el tamaño predeterminado de 5 GB no funciona bien con su configuración, se recomienda intentar aumentar el límite en incrementos de 256 MB hasta que el rendimiento sea satisfactorio. Tenga en cuenta lo siguiente:

  • Debe reiniciarse el equipo para que los cambios en esta clave del Registro surtan efecto.

  • Las unidades de RemoteFileDirtyPageThreshold son el número de páginas (con el tamaño de página administrado por el administrador de caché). Esto significa que debe establecerse en el tamaño deseado en bytes, dividido por 4096.

  • Los valores recomendados son 128 MB <= N <= 50 % de memoria disponible.

  • Este umbral se puede deshabilitar completamente si lo establece en -1. Esto no es recomendable, ya que puede dar lugar a tiempos de espera de las conexiones remotas.

Por ejemplo, si quiere establecer el límite en 10 GiB que es 10 737 418 240 bytes/4096 = 2 621 440, que es un valor DWORD decimal de 2621440.

Este umbral se puede controlar mediante el siguiente valor del Registro.

  • Clave: HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management
    • Tipo: DWORD
    • Nombre de valor: RemoteFileDirtyPageThreshold
    • Datos de valor: decimal - número de páginas (tamaño de página administrado por el Administrador de caché).