Alto consumo de memoria por Exchange 2007

Por Daniel Seveso

Este tema reaparece una y otra vez en casos de soporte, donde nuestros clientes no estan seguros si Exchange 2007 está usando la memoria que debería y a menudo piensan que algo no funciona correctamente.

Antecedentes

En versiones anteriores de Exchange, que funcionan sobre arquitecturas Windows de 32 bits, la memoria virtual (el espacio de memoria direccionable desde un proceso en "user mode") esta limitada a 4 GB. Este límite es independiente del número de bases de datos o grupos de almacenamiento que tenga el servidor, dado que solo una instancia del Information Store (proceso store.exe) puede correr en cualquier momento determinado.

Es válido poner énfasis en el cache de aquí en adelante, ya que en términos de tamaño, es el componente más representativo en la conformación de la memoria virtual. El cache  que implementa el Information Store (conocido técnicamente como "ESE buffer"), evita al sistema ir a disco por transacciones en páginas de la bases de datos que han sido accedidas recientemente.  Este cache está implementado en una porción de estos 4Gb, y su tamaño es uno de los valores determinantes en la performance de servidores fuertemente utilizados. Como forma de optimizar la performance, en especial cuando el rendimiento de los discos es bajo, es posible aumentar el tamaño del cache modificando el parametro msExchESEParamCacheSizeMax de acuerdo con el artículo KB815372.

Memoria virtual en Exchange 2007

Desde su diseño, uno de los principales objetivos para Exchange 2007 fue superar las barreras impuestas por la arquitectura 32 bits. En este sentido, y corriendo en arquitectura 64 bits, Exchange 2007 no está limitado en el uso de memoria virtual, incluído el cache. Exchange 2007 configura un mínimo de "ESE buffer" de 512Mb, y no configura un límite máximo. En este nuevo escenario, la memoria virtual de Exchange crecerá como consecuencia del aumento del cache, hasta un valor cercano a la cantidad de memoria RAM instalada en el servidor, siempre que no haya otra aplicación demandando memoria en el sistema, obteniendo así una mejora sustancial en performance, originada principalmente por la menor necesidad de acceso a disco. En la medida que otras aplicaciones u otros roles de Exchange instalados en el mismo servidor requieran recursos de memoria, el  mecanismo de asignación dinámica de memoria del ESE, liberará memoria del ESE buffer al sistema operativo.

El siguiente es un ejemplo medido en un servidor real, perfectamente saludable, corriendo Exchange 2007 SP1

  • Storage Groups: 18
  • Databases: 18
  • System Type: x64-based PC
  • Total Physical Memory: 32GB
  • Active Users: 2000
  • Boot.ini:
    multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows Server 2003 Enterprise x64 Edition" /noexecute=optout /fastdetect
  • Virtual Bytes: 29.7GB
  • Database Cache: 25.5Gb

image

A efectos comparativos, este es un servidor Exchange 2003 SP3 real con las siguientes características:

  • Storage Groups: 2
  • Databases: 8
  • System Type: X86-based PC
  • Total Physical Memory: 3.5GB
  • Active Users: 1100
  • Boot.ini:
    multi(0)disk(0)rdisk(0)partition(2)\WINNT="Microsoft Windows 2000 Advanced Server" /fastdetect /3GB
  • Virtual Bytes: 1.9GB
  • Database Cache: 858MB

image

Puedes consultar el tamaño del cache y el tamaño de la memoria virtual del Information Store en los siguientes contadores de performance:

  Virtual Bytes Database Cache
Exchange 2003 Object: Process Instance: Store Counter: Virtual Bytes Object: Database Instance: Information Store Counter: Database Cache Size
Exchange 2007 Object: Process Instance: Store Counter: Virtual Bytes Object: MSExchange Database Instance: -- Counter: Database Cache Size (MB)

Podemos limitar la memoria virtual que Exchange 2007 utiliza?

Tal como lo muestra el primer ejemplo, en un servidor que no tiene otras aplicaciones demandantes, es normal que el valor de memoria virtual consumida por el Store.exe crezca a aproximadamente 2GB menos que el total de memoria física.

Microsoft no recomienda limitar el cache, dado que inevitablemente terminaría afectando la performance de Exchange y deberías reducir la cantidad de Storage Groups corriendo en el servidor a los efectos de preservar la misma performance. La definición de no limitar el cache se tomó desde la versión RTM, sin necesidades técnicas ni de soporte hasta el momento de cambiarla.

Exchange 2007 sigue considerando la propiedad msExchESEParamCacheSizeMax del objeto "Information Store" en Active Directory al igual que las versiones anteriores de Exchange, por lo que en la práctica, es posible limitar la memoria virtual asignada al cache. El procedimiento está documentado bajo "Setting the Maximum Size of the Database Cache" en la documentación. De nuevo: no es recomendado, y sería mejor para tu servicio de mensajería, evitar correr lo que te esté causando la necesidad de modificar este parámetro en Exchange.

Referencias

Estas son algunas referencias utilizadas en este artículo donde puedes ver más detalles sobre el tema: