Memoria de SQL Server
Se trata de la memoria de SQL Server. Cuando el servidor se está quedando sin memoria, recomendamos agregar memoria adicional al hardware para superar los problemas de utilización de la CPU.
Pero antes de continuar con la actualización de la memoria, como parte de la resolución de problemas, ¿cómo verificamos / calculamos la memoria SQL que se consume actualmente en la instancia?
Por ejemplo:
NOMBRE DEL SERVIDOR: XXXXXXXXXXXXX
Memoria física instalada (RAM): 64,0 GB
Memoria de SQL Server asignada actualmente: 58982 MB -> 58,982 GB
En este caso, solo tenemos una instancia (MSSQLSERVER) en el servidor y se ha asignado un 80% de memoria a la instancia según el estándar. Y el 20% se asigna a Aplicaciones y SO.
Cuando verifiquemos el Monitor de recursos, se mostrará con un 80% de llenado, ya que hemos configurado la memoria del servidor SQL para eso.
Pero no significa que el 80% de SQL se utilice por completo, ya que SQL mantendrá algo de espacio en el búfer en el backend. Cuando navegué, obtuve la siguiente fórmula para calcular la memoria SQL consumida en la instancia, pero estos parámetros se eliminaron en la herramienta de monitoreo de rendimiento hace mucho tiempo.
¿Hay alguna manera de verificar, actualmente, cuánto SQL utiliza del 80% (O) en qué métricas podemos proceder con la actualización de la memoria?
FÓRMULA PARA CALCULAR LA MEMORIA SQL: (Los siguientes parámetros se han eliminado del Monitor de rendimiento)
*Database Usage(GB) = (Totalpages-Freepages-Stolenpages)8/1024=MB/1024=GB
Respuestas
¿Cómo verificamos / calculamos la memoria SQL que se consume actualmente en la instancia?
Eso es muy sencillo de hacer. Tiene DMV sys.dm_os_process_memory que le dará la información. Te dará physical memory usedytotal memory used (RAM+Page file)
select (physical_memory_in_use_kb/1024) as Phy_Mem_used_MB, (virtual_address_space_committed_kb/1024) as Total_mem_Used_MB
from sys.dm_os_process_memory
Pero no significa que el 80% de SQL se utilice por completo, ya que SQL mantendrá algo de espacio en el búfer en el backend
Una vez que SQL Server alcanza el valor máximo de memoria del servidor, conservará esa memoria a menos que la notificación de memoria baja le pida que libere memoria. Entonces sí, puede que no lo esté usando todo, pero aún así lo mantendrá. Esto se denomina almacenamiento en caché, ya que ayuda a evitar errores de página.
¿Hay alguna manera de verificar, actualmente, cuánto SQL utiliza del 80% (O) en qué métricas podemos proceder con la actualización de la memoria?
Como dije, una vez utilizado, mostrará toda la memoria utilizada incluso cuando no necesite esas páginas en el procesamiento de consultas. Cuando llegue una nueva solicitud, estas páginas se moverán para crear espacio para nuevas páginas.
¿Cómo se define "utilizado"? Una página que se leyó en caché hace un segundo, ¿se contabilizaría como utilizada? ¿Hace un minuto? ¿Una hora? ¿Una semana?
El caso es que no existen cosas como "utilizado". El servidor SQL mantiene las páginas (y otras cosas) en la memoria. Cuando hay presión de memoria (interna o externa), se utiliza un mecanismo tradicional de envejecimiento de la caché (básicamente) para eliminar las cosas que se han utilizado menos recientemente. Hay muchos más detalles sobre el manejo de la memoria (caché), por supuesto, pero en principio se maneja como cualquier mecanismo de almacenamiento en caché.
Por tanto, conceptos como "utilizado" o configuración óptima simplemente no existen. Puede ver si hay un montón de memoria que no está siendo utilizada por el servidor SQL, por supuesto. Pero cuando el servidor SQL asigna memoria, se aferrará a ella a menos que haya presión de memoria. Quién sabe, tal vez alguien necesite esa página en el próximo segundo.
Puede reducir la memoria máxima del servidor y ver cuándo su rendimiento comienza a afectar, por ejemplo.
Utilice el MemoryManagerInfoprocedimiento almacenado, que se puede encontrar aquí:
https://github.com/aleksey-vitsko/Database-Administrator-Tools
Proporciona un buen desglose de cómo SQL Server usa actualmente la memoria:
vea el ejemplo en esta imagen a continuación: esto es lo que mi servidor consume actualmente:
Aproximadamente, Total Server Memory= Database Cache Memory+ Free Memory+ Stolen Server Memory(la memoria del servidor robada incluye la caché del plan, los bloqueos, etc.)