¿Cómo consigo que SQL Server libere su memoria?

19

Sé que a SQL le gusta la RAM, pero la libera cuando Windows pregunta. Sé que así es como se supone que funciona SQL. Pero tengo un administrador de Windows que no está convencido de que SQL realmente devolverá la RAM, y en este servidor (virtual) en particular, SQL no necesita mucho una vez que Analysis Services haya terminado, pero no hay nada más en este servidor que le moleste pedirle mucho a SQL.

Así que estoy tratando de asegurarles a los administradores de Windows que los problemas con el entorno virtual no son "porque SQL está usando demasiada RAM", pero parece que no puedo persuadir a SQL para que lo libere sin reiniciar el servicio.

Cuando se procesan cubos, el servicio SQL toma felizmente 8GB de RAM, pero debido a que no hay presión sobre él, no libera mucho de esto durante un día normal. Los chicos de Windows gritan, y sería mucho mejor que SQL lanzara esto.

No quiero usar la configuración de memoria máxima, porque realmente quiero que SQL use tanta RAM al procesar. Solo quiero que vuelva a bajar después.

Es potencialmente un duplicado de SQL Server que no libera memoria y reclama memoria de SQL Server , pero me pregunto si hay una respuesta diferente. Esperar a que Windows lo reclame no va a persuadir a los chicos de Windows aquí. Reiniciar el servicio es una opción, pero realmente no soy fanático de esa idea.

Quiero saber cómo hacer que Windows lo solicite de nuevo ...

Rob Farley
fuente
2
¿Qué ... un administrador de sistemas se queja de que se está utilizando la RAM? Me cago cuando no se usa RAM, porque si no se usa, simplemente se desperdiciará ...
Mark Henderson
Yo tampoco lo entiendo, si la máquina no necesita la memoria, ¿dónde está el problema? Así es como normalmente funcionan el sistema operativo y sus aplicaciones ... dada la carga de trabajo que tiene el servicio SQL inactivo, conserva la mayor parte de la memoria cuando no se necesita nada más, ¿podría aumentar el tiempo de respuesta y / o el rendimiento para el próximo trabajo SQL de todos modos?
Oskar Duveborn
El administrador de Windows siente que SQL está estresando a la máquina porque el proceso tiene mucha RAM. Sé que el cuadro no está bajo presión por parte de SQL, y puedo demostrarlo reiniciando el servicio SQL, lo que demuestra que solo consume mucha RAM al obtener los datos para el procesamiento SSAS. Entonces, quiero que SQL libere la memoria para mostrar la cantidad de RAM que SQL está usando el resto del día. No se trata de hacer que proporcionen más RAM, solo de que dejen de culpar a SQL por cosas.
Rob Farley
2
De acuerdo con Farseeker, sysadmin debería estar feliz de que se esté utilizando RAM. Si no se reclama, el servidor no lo necesita. ¿Quizás pedirle al administrador del sistema que mire las fallas de la página para mostrar que el sistema no está estresado?
Nick Kavadias
2
Si su administrador de sistemas no comprende qué representan los fallos de página y por qué no se consume memoria pero no se producen fallas de página reales, no sé cómo ayudarlo. No se puede arreglar estúpido. Sin embargo, una cosa que puede hacer es usar sp_configure para configurar la memoria máxima inactiva cuando no está utilizando el sistema, y ​​configurarlo nuevamente cuando lo necesite. Sin embargo, esto parece bastante tonto. sp_configuregeneralmente es algo que debe configurar una vez y dejar solo.
Bacon Bits

Respuestas:

12

Creo que su única opción es reiniciar el Servicio SQL o ejecutar una aplicación que consuma mucha memoria para obligar a SQL a liberarlo.

Me gusta la sugerencia de @Nick Kavadias: supervisar el contador de rendimiento Memoria: Fallos de página / Sec para mostrar que SQL no ha puesto la memoria del sistema operativo bajo presión.

Trigo Mitch
fuente
2
Gracias Mitch ... Déjame encontrar ese archivo de texto de 10GB para el Bloc de notas.
Rob Farley
lol !, en realidad no es una mala idea!
Mitch Wheat
tal vez use un archivo de 2GB ...
Mitch Wheat
5

Una forma de mostrarles que lo hará es hacer que SQL Server absorba toda la memoria. Luego copie un archivo enorme a través de la red (los archivos de copia de seguridad SQL grandes funcionan muy bien para esto). Esto hará que el caché del sistema se llene, y Windows comenzará a pedirle a SQL que le devuelva la memoria. SQL comenzará a devolver la memoria al sistema operativo hasta que alcance la configuración de memoria mínima.

(Lo siento, no recibí toda la pregunta a través de Twitter, aparentemente se necesitaban más de 140 caracteres).

mrdenny
fuente
1
Espero algún proceso que pueda usar que le pida a SQL que le devuelva la memoria (después de que se hayan limpiado y eliminado los búferes), pero sin tener que paralizar la caja para hacerlo.
Rob Farley
No creo que haya una manera de obligar al administrador de memoria de Windows a solicitar la recuperación de la memoria, sin forzar el problema a través de otros medios. Probablemente podría escribir algo que golpee la API de win32 directamente para hacerlo, pero que yo sepa, la única forma de activar Windows para solicitar la memoria es hacer que necesite más memoria para otro proceso. Consulte con Bob o Paul, pueden tener más información.
mrdenny 01 de
3
El controlador de globo de VMware hace exactamente esto: le pide a Windows más y más memoria para que SQL Server (o cualquier otra aplicación) renuncie a su memoria.
Brent Ozar
Sí, esperaba no tener que hacer algo así.
Rob Farley
@BrentOzar, el controlador de impulso de VMware solo recupera la memoria del caché del sistema , no la memoria de proceso real; está diseñado como una forma de decirle al sistema operativo "no use toda su memoria disponible para cosas triviales", no para que se caiga.
Massimo
2

Menciona "cubos", por lo que no está claro si habla del motor AS o del motor relacional. El motor relacional puede liberar memoria bajo demanda:

DBCC FREESYSTEMCACHE('<cache name>');

Donde 'nombre de caché' se toma de sys.dm_os_memory_clerks . La especificación de DBCC FREESYSTEMCACHE solo menciona grupos de gobernadores, pero en realidad se pueden expulsar muchos más cachés.

Pero si toda la memoria es utilizada por el grupo de búferes, desalojar todo el grupo de búferes dará como resultado una enorme degradación del rendimiento y una gran carga de E / S. Mejor deje que SQL maneje esto por sí mismo.

Remus Rusanu
fuente
1
Hola Remus, la memoria caché del búfer relacional es grande después del procesamiento de un cubo. Después de eso, realmente quiero que las cachés se limpien, se caigan y la memoria vuelva a Windows. DBCC DROPCLEANBUFFERS y FREESYSTEMCACHE vacían la memoria caché pero no devuelven la memoria a Windows, por lo que no es completamente lo que quiero.
Rob Farley
2
En teoría, podría fingir la presión de la memoria (por ejemplo, podría trampolín QueryMemoryResourceNotification msdn.microsoft.com/en-us/library/aa366799%28VS.85%29.aspx ) pero realmente realmente no iría allí. Si SQL no libera memoria comprometida es porque el sistema operativo no lo necesita. El sistema operativo no necesita la memoria porque SQL es la única aplicación en el host ( stackoverflow.com/questions/1401834/… ), ¿verdad? Si ejecuta alguna otra aplicación a lo largo de SQL, la tendrá próximamente.
Remus Rusanu
2

Con los motores AS y DS, puede poner un límite a la memoria para que permanezcan por debajo de un umbral seguro; Esto se recomienda en máquinas de 64 bits con mucha RAM y / o múltiples instancias de SQL. Al menos para el motor de la base de datos, si cambia el límite de memoria por debajo del uso actual, reducirá la cantidad de memoria sobre la marcha sin tener que reiniciar el servicio, aunque no estoy seguro sobre SSAS.

Jason Cumberland
fuente
Tener la tapa está bien, pero creo que voy a querer extraer la memoria máxima después del procesamiento y luego volver a sacarla, cuando prefiera limpiar los búferes, soltarlos y pedirle a Windows un poco de presión de memoria.
Rob Farley
1

Lo más fácil que he encontrado es ir a las propiedades de memoria del servidor, ingresar un valor menor, aplicar, esperar unos minutos y volver a ajustar la configuración.

También hemos encontrado que el uso de memoria de los servidores sql de estrangulamiento en realidad puede mejorar el rendimiento del servidor, ya que le da a Windows más ram para el almacenamiento en caché, etc.

Nick van Esch
fuente