У меня есть машина с Windows Server 2008 x64 объемом 16 ГБ, в основном работающая с SQL Server 2008. Свободная память, как видно в диспетчере задач, очень мала (128 МБ на данный момент), то есть используется около 15,7 ГБ. Все идет нормально.
Теперь, когда я пытаюсь сузить процесс (-ы), используя большую часть памяти, я запутываюсь: ни у одного из процессов размер рабочего набора не превышает 200 МБ, как показано на вкладке «Процессы» диспетчера задач. Что ж, может быть, размер рабочего набора не является подходящим счетчиком?
Чтобы понять это, я использовал команду PowerShell [1], чтобы суммировать каждое отдельное свойство объекта процесса в виде грубой силы - конечно, одно из них должно составлять 15,7 ГБ, верно? Оказалось, что ни один из них этого не делает, ближайшими из которых являются VirtualMemorySize (около 12,7 ГБ) и PeakVirtualMemorySize (около 14,7 ГБ). Какого черта?
Другими словами: какая из многочисленных сведений о процессах, связанных с памятью, является «правильной», то есть учитывается в физической памяти сервера, как показано на вкладке «Производительность» диспетчера задач?
Спасибо вам всем!
[1] $ erroractionpreference = "молчаливо продолжать"; получить-процесс | gm | где-объект {$.membertype -eq "Свойство"} | foreach-object {$.название; (получить-процесс | мера-объект-сумма $ _. имя). сумма / 1 МБ}
При добавлении рабочих наборов также учитываются страницы с несколькими счетчиками, которые совместно используются процессами, например код из системных библиотек DLL и исполняемые файлы, запускаемые более одного раза.
Суммирование использования памяти всеми процессами обычно не дает значимых результатов. В результате останутся неучтенными два основных пользователя памяти, системный кеш и резервный список. Вы не можете учесть использование памяти, просто сложив список чисел. Система управления памятью слишком сложна для этого.
SQL-Server использует 64-битный AWE для блокировки страниц памяти, и их количество не учитывается в диспетчерах задач «Рабочий набор».