Память SQL Server
Это по поводу памяти SQL Server. Когда серверу не хватает памяти, мы рекомендуем добавить дополнительную память к оборудованию, чтобы решить проблемы с загрузкой ЦП.
Но прежде чем приступить к обновлению памяти в рамках устранения неполадок, как мы проверяем / вычисляем объем памяти SQL, который в данный момент потребляется экземпляром.
Например:
ИМЯ СЕРВЕРА: XXXXXXXXXXXXX
Установленная физическая память (RAM): 64,0 ГБ
В настоящее время выделенная память SQL Server: 58982 МБ -> 58,982 ГБ
В этом случае у нас есть только один экземпляр (MSSQLSERVER) на сервере, и 80% памяти было выделено экземпляру в соответствии со стандартом. И 20% отведено приложению и ОС.
Когда мы проверяем монитор ресурсов, он покажет, что он заполнен на 80%, поскольку мы установили для этого значение памяти SQL Server.
Но это не означает, что 80% SQL используется полностью, поскольку SQL будет сохранять некоторое пространство в буфере на сервере. Когда я занимался серфингом, я получил следующую формулу для расчета объема памяти SQL, потребляемой экземпляром, но эти параметры были удалены в инструменте мониторинга производительности давно.
Есть ли способ проверить, насколько в настоящее время используется SQL из 80% (ИЛИ), по каким показателям мы можем продолжить обновление памяти.
ФОРМУЛА ДЛЯ РАСЧЕТА ПАМЯТИ SQL: (параметры, указанные ниже, были удалены из монитора производительности)
*Database Usage(GB) = (Totalpages-Freepages-Stolenpages)8/1024=MB/1024=GB
Ответы
как мы проверяем / вычисляем объем памяти SQL, который в данный момент используется экземпляром.
Сделать это довольно просто. У вас есть DMV sys.dm_os_process_memory , который предоставит вам информацию. Это даст вам physical memory usedиtotal 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
Но это не означает, что 80% SQL используется полностью, так как SQL будет сохранять некоторое пространство в буфере на сервере.
Как только SQL Server достигает максимального значения памяти сервера, он будет удерживать эту память, если уведомление о нехватке памяти не попросит его освободить память. Так что да, он может не использовать все это, но все же будет удерживать его. Это называется кэшированием, так как это помогает избежать серьезных ошибок страницы.
Есть ли способ проверить, насколько в настоящее время используется SQL из 80% (ИЛИ), по каким показателям мы можем продолжить обновление памяти.
Как я уже сказал, когда-то используется, он будет показывать всю память как использованную, даже если ему не нужны эти страницы при обработке запросов. При поступлении нового запроса эти страницы будут перемещены, чтобы освободить место для новых страниц.
Как вы определяете «использованный»? Будет ли считаться использованная страница, считанная в кэш секунду назад? Минуту назад? Час? Неделя?
Дело в том, что нет такого понятия, как «утилизировано». SQL-сервер хранит страницы (и прочее) в памяти. Когда есть нехватка памяти (внутренняя или внешняя), традиционный механизм устаревания кеша (в основном) используется для удаления того, что используется меньше всего. Конечно, есть гораздо больше деталей об обработке памяти (кеша), но в основном она обрабатывается как любой механизм кэширования.
Итак, таких понятий, как «используемая» или оптимальная конфигурация, просто не существует. Конечно, вы можете увидеть, есть ли куча памяти, которая вообще не используется SQL-сервером. Но когда SQL-сервер выделил память, он будет зависеть от нее, если не будет недостатка памяти. Кто знает, может, эта страница кому-нибудь понадобится в следующую секунду?
Например, вы можете уменьшить максимальный объем памяти сервера и посмотреть, когда ваша производительность начнет снижаться.
Используйте MemoryManagerInfoхранимую процедуру, которую можно найти здесь:
https://github.com/aleksey-vitsko/Database-Administrator-Tools
Он дает хорошее представление о том, как SQL Server в настоящее время использует память:
см. Пример на этом рисунке ниже - это то, что мой сервер в настоящее время потребляет:
Грубо говоря, Total Server Memory= Database Cache Memory+ Free Memory+ Stolen Server Memory(Украденная память сервера включает кэш планов, блокировки и т. Д.)