Tengo un servidor que ejecuta Windows Server 2008 R2 x64 con 4 GB de RAM que aloja alrededor de 2-3 millones de archivos, la mayoría de los cuales son archivos de imagen.
En el transcurso de una semana, me di cuenta de que las aplicaciones en el servidor se ralentizaban debido a una paginación excesiva en el disco debido a la poca memoria, lo que tiene un efecto negativo en todos los servicios que se ejecutan actualmente en él, lo que causa un importante problema de rendimiento.
Tras la investigación en el Administrador de tareas, noté que casi todos los 4 GB estaban en uso, pero cuando mira en la pestaña Procesos, la suma de todo el uso de memoria no se acumula y, como máximo, se supone que solo 1.5 GB están en uso.
Al usar Google para encontrar una solución, parece que la mayor parte de la RAM se usó en el "Metarchivo", que es un caché de información NTFS para archivos en el sistema de archivos para que el sistema no tenga que consultar la MFT para obtener información nuevamente. Este caché nunca se borra o marca como "caché" en el Administrador de tareas o como "En espera" en el RamMap de Sysinternal.
Hubo una sugerencia para instalar la revisión KB979149, pero al intentar instalarla, dice "Esta actualización no es aplicable a su computadora".
Las únicas soluciones temporales que he encontrado hasta ahora son:
- Use RAMmap de Sysinternals para "Vaciar el sistema de trabajo del sistema" cada 1-3 días, lo que marca el caché como "en espera" y "caché" en el Administrador de tareas para que otras aplicaciones puedan utilizar la RAM.
- Reinicie la máquina, lo que no es deseable ya que este servidor está sirviendo a sitios web públicos.
En este momento tengo que realizar la 2. corrección cada pocos días para evitar que alcance niveles de cuello de botella.
Antes: (800 MB de RAM utilizada; otras aplicaciones no pueden usar esta RAM)
Después: (800 MB de RAM marcados como caché, disponible para otras aplicaciones)
Entonces mi pregunta para todos ustedes es: ¿Existe algún método para limitar el uso de RAM de este metarchivo?
Respuestas:
El mejor método para tratar este problema es usar la
SetSystemFileCacheSize
API como MS KB976618instruyepara instruir .No borre periódicamente el caché
Usar la
SetSystemFileCacheSize
función en lugar de borrar el caché periódicamente mejora el rendimiento y la estabilidad. Borrar el caché periódicamente dará como resultado que se eliminen demasiados metarchivos y otra información de la memoria, y Windows tendrá que volver a leer la información requerida nuevamente en la RAM desde el HDD. Esto crea una caída repentina y severa en el rendimiento durante varios segundos cada vez que borra el caché, seguido de un buen rendimiento que se degrada lentamente a medida que la memoria se llena de datos de metarchivos.El uso de la
SetSystemFileCacheSize
función establece un mínimo y un máximo que dará como resultado que Windows marque el exceso de datos de metarchivos antiguos como memoria en espera que las funciones de almacenamiento en caché normales pueden usar o descartar de acuerdo con las demandas de recursos actuales y las prioridades de caché normales. Esto también permite que más datos de metarchivos que el máximo de memoria activa que establezca estén en la memoria como datos en espera si Windows no está usando la memoria para otra cosa, mientras mantiene una gran cantidad de memoria disponible. Esta es la situación ideal para mantener las características de rendimiento del sistema en todo momento.Los programas de terceros no son compatibles con MS
Si eres como yo y no quieres ejecutar un binario de un tercero desconocido en tus servidores de producción, quieres una herramienta oficial de MS o algún código que puedas inspeccionar antes de ejecutar en esos servidores. La herramienta DynCache para 2008 R2 es prácticamente imposible de obtener de M $ sin pagar un caso de soporte y, francamente, según el código para 2008, parece demasiado hinchada para la tarea ya que Windows ya tiene la lógica integrada necesaria para dimensionar dinámicamente el caché, solo necesita saber un máximo apropiado para su sistema.
Solución a todo lo anterior.
Escribí un script de Powershell que funciona en máquinas de 64 bits. Debe ejecutarlo como administrador con privilegios elevados. Debería poder ejecutarlo, tal cual, en cualquier x64 Windows Vista / Server 2008 hasta 10 / Server 2012 R2 incluido con cualquier cantidad de RAM. No necesita instalar ningún software adicional y, como resultado, mantener su servidor / estación de trabajo totalmente compatible con MS.
Debe ejecutar este script en cada arranque con privilegios elevados para que la configuración sea permanente. El Programador de tareas de Windows puede hacer esto por usted. Si la instalación de Windows está dentro de una máquina virtual y usted cambia la cantidad de RAM asignada a esa VM, también debe ejecutarla después del cambio.
Puede ejecutar este script en cualquier momento en un sistema en ejecución, incluso mientras está en uso de producción sin tener que reiniciar el sistema o cerrar ningún servicio.
Hay una línea cerca de la parte superior que dice
$MaxPercent = 12.5
que establece el nuevo conjunto de trabajo máximo (memoria activa) en 12.5% de la RAM física total. Windows dimensionará dinámicamente la cantidad de datos de metarchivos en la memoria activa según las demandas del sistema, por lo que no necesita ajustar dinámicamente este máximo.Esto no solucionará ningún problema que tenga con el caché del archivo asignado que se vuelve demasiado grande.
También hice un
GetSystemFileCacheSize
script de Powershell y lo publiqué en StackOverflow .Editar: También debo señalar que no debe ejecutar ninguno de estos 2 scripts desde la misma instancia de Powershell más de una vez, o recibirá el error de que la
Add-Type
llamada ya se ha realizado.Editar:
SetSystemFileCacheSize
script actualizado a la versión 1.1 que calcula un valor de caché máximo apropiado para usted y tiene un diseño de salida de estado más agradable.Editar: ahora que actualicé mi computadora portátil con Windows 7, puedo decirle que el script se ejecuta con éxito en Windows 10, aunque no he probado si todavía es necesario. Pero mi sistema aún es estable incluso cuando muevo archivos HDD de máquinas virtuales.
fuente
No pretendo ser un experto en el funcionamiento interno de la memoria o el almacenamiento en caché de disco en un sistema operativo Windows, pero tengo dos observaciones:
Si el sistema operativo no almacena en caché los datos en la memoria, tendría que leerlos desde el disco, que es un medio de almacenamiento exponencialmente más lento que la memoria, por lo que el problema de rendimiento que está viendo ahora seguramente será peor.
Está tratando de resolver el problema tratando un síntoma del problema en lugar de la causa del problema. La causa del problema es casi seguro la falta de RAM física suficiente y mi sugerencia sería abordar eso.
Además, aunque el caché puede estar usando 1.5GB de RAM, me pregunto cuál es el uso de la memoria para otros procesos y servicios, y la solución podría ser investigar ese uso en busca de posibles problemas.
fuente
Para las personas que dieron la solución obvia pero ineficaz de simplemente agregar más RAM, claramente no han abordado este problema de primera mano.
Como se indicó en un póster anterior, no importa la cantidad de RAM que arroje al problema ... todo se llenará. Estoy ejecutando un conjunto de herramientas Atlassian en nuestro servidor de aplicaciones que se migró de 32 bits (2003) a 64 bits (2008). Inmediatamente se hizo evidente que había una pérdida de rendimiento.
Al mirar el administrador de tareas, casi toda la memoria se agotó; a pesar de que los procesos que se ejecutan no reflejan esto. Cuando aumentamos la memoria de 8 GB a 16 GB, el problema también consumió la memoria adicional.
La única forma de tratar el problema era reiniciar el servidor, lo que redujo el uso de memoria igual a los procesos (aproximadamente 3,5 GB). Esto comenzó a subir nuevamente dentro de un día más o menos.
Sabía que se trataba de una nueva función / error de Microsoft y me alegró encontrar este artículo. Me encanta cómo Microsoft deja este detalle tan importante para que los usuarios lo descubran. Descargué RamMap, que pensarías que sería una utilidad nativa, y ahora puedo ver el uso del Metarchivo. Configuraremos el caché para que se borre cada pocos días y esperamos que esto resuelva el problema.
Es interesante que solo haya visto este problema en uno de varios de nuestros servidores migrados, por lo que me pregunto si el metarchivo solo se alimenta de ciertos tipos de aplicaciones.
fuente
Este problema se puede solucionar de forma rápida y gratuita con la herramienta SysInternals CacheSet. Simplemente establezca el máximo de conjunto de trabajo en un valor adecuado menor que la cantidad de RAM del sistema, y aplique.
fuente
Lamento ser tan directo, pero ¿qué pasa si actualiza el servidor a una cantidad de RAM que es un poco más alta que la que tienen las estaciones de trabajo en estos días? 16gb memroy son muy baratos. Menos costoso que incluso medio día de su tiempo.
fuente
Aquí hay un enlace para descargar la herramienta Microsoft DynCache, sin necesidad de crear un boleto o pagar. http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=9258
(disculpas, solo notando ahora que esto no es para la versión R2)
El problema conocido para el crecimiento continuo de la memoria caché se describe aquí en el blog de Microsoft: http://blogs.msdn.com/b/ntdebugging/archive/2007/11/27/too-much-cache.aspx
[actualización] corrección de trabajo para Windows Server 2008 R2.
Encontré código de muestra C # en Codeplex, creé rápidamente un proyecto de consola C # con Visual Studio y lo compilé, funcionó.
Tenga en cuenta que deberá agregar una referencia a Microsoft.AnalysisServices.AdomdClient que se puede encontrar aquí:
y comente el método ClearAllCaches () con (en mi caso) referencias innecesarias a XMLaDiscover. Lanza esto en TaskScheduler.
fuente
Puede obtener la herramienta DynCache de MS que permitirá restringir el uso de RAM por metarchivo.
Haga clic aquí para obtener la herramienta de MS .
fuente