17.1.23

Вытеснение памяти - классификация

По материалам статьи Slava Oks: Memory Pressure - Classified


До этой статьи автор затрагивал те темы, которые довольно широко обсуждались. Теперь он хотел бы поговорить об экзотической теме, это "вытеснение памяти". С виду эта тема выглядит простой, но в действительности дело обстоит совсем не так.

Есть два типа вытеснения памяти, процесс может подвергнуться вытеснению извне и изнутри. Чтобы повысить свою производительность и надежность, процесс может отреагировать и на оба этих типа. Внешнее вытеснение памяти может произойти, если начинается листание (paging - сброс страниц из памяти на диск, в файл подкачки) процессом и в целом системой. Вытеснение внутренней памяти может быть вызвано недостатком памяти - "out of memory" (OOM) и возможным аварийным отказом процесса.
Внешнее вытеснение памяти управляется операционной системой Windows. Существует два типа внешнего вытеснения: вытеснение динамической физической памяти и вытеснение статической физической памяти. Последний тип случается, когда система выходит за границы файла подкачки. Этот тип вытеснения памяти может привести всю систему к состоянию OOM. Вы, возможно, видели всплывающее в правом - нижнем углу сообщение, указывающее на то, что системе недостаточно виртуальной памяти. Чтобы контролировать такой тип вытеснения достаточно следить за размером файла подкачки. Обычно приложения этого не делают.
Внешнее вытеснение динамической памяти возрастает, когда операционная система Windows работает с недостатком свободного места в ОЗУ и вынуждена начать подстраивать имеющееся рабочее множество, путём листания. Процесс может контролировать этот тип вытеснения, используя для этого специализированный интерфейс (API), который позволяет получать уведомления о состоянии ресурса памяти (CreateMemoryResourceNotification) и с которым можно более подробно ознакомиться в этой статье: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/memory/base/querymemoryresourcenotification.asp

Примечание переводчика: В отличие от Windows 2000, последние версии операционных систем, при работе в многопроцессорной конфигурации, умеют принимать решение, какие страницы удалять из рабочего множества, если системе необходимо высвободить дополнительные свободные страницы. В Windows 2000, только в однопроцессорной конфигурации, старение страниц в рабочем множестве основывалось на счётчике обращения к странице и когда система должна была урезать рабочее множество для высвобождения страниц, на диск сбрасывались те страницы, к которым долго не было обращений. Теперь этот механизм работает и на многопроцессорных системах.

Приложение может выделить специальный поток, который будет слушать уведомления о ресурсе памяти. Имейте в виду, что эти уведомления подобны глобальным переменным, то есть они доступны всеми процессами. Реализовано два типа уведомлений о ресурсе памяти, которые поток может ожидать: памяти много и памяти недостаточно. Прежде, чем Windows инициирует листание, она породит уведомление о недостатке ресурса памяти. Потоки приложений, которые ожидают подобные уведомления, проснутся и это может привести к тому, что использование памяти процессом будет сокращено до того, как операционная система начнёт листание. Такой механизм более выигрышный для высокопроизводительных приложений (таких, как SQL Server), которые лучше чем операционная система понимают то, как им использовать свою память и что из неё можно убрать. Как только память вернётся в нормальное состояние, Windows сбрасывает уведомление о недостатке ресурса памяти, и как не трудно догадаться, если Windows обнаруживает, что памяти с избытком, она породит другое уведомление, сообщающее процессам о том, что ресурс памяти имеет много свободного места. Если оба описанных выше уведомления о состоянии ресурса памяти системой не установлены, это означает, что система находится в устойчивом состоянии, и процессы не должны занимать или высвобождать память.
Существует также два типа вытеснения внутренней памяти, это вытеснение физической памяти и вытеснение Virtual Address Space (VAS). Процесс имеет несколько путей вытеснения внутренней физической памяти, и это определяется его менеджером памяти. Например, заставить процесс уменьшит использование ресурса памяти, могло бы внешнее вытеснение, которое вызовет высвобождение памяти процессом, которое в свою очередь вызовет вытеснение внутренней памяти. Другой причиной возникновения этого типа вытеснения является то, что администратор может задать предельный размер памяти для процесса. Достигнув максимального значения, процесс инициирует вытеснение внутренней памяти. Обычно, приложения реагируя на этот тип вытеснения, сокращают внутренние кэши и пулы, возвращая их своему менеджеру памяти. Если внешнего вытеснения нет, то нет и повода для возврата свободной памяти операционной системе.
Вытеснение VAS сложнее обнаружить и принять соответствующие меры. Это вытеснение происходит по двум причинам. Первая причина, это фрагментация VAS, когда процессу доступны несколько участков VAS, но ни один из них не достигает нужного размера. В настоящее время не существует простых способов обнаружения наибольшего свободного участка VAS. Как вариант, можно попробовать распределить участок VAS заданного размера, что покажет, находится ли VAS в состоянии вытеснения. Будьте с этим осторожны, т.к. частые попытки распределения больших участков VAS, скажем по 4 МБ, могут стать причиной фрагментации виртуального адресного пространства. Это произойдёт, если какой-нибудь компонент процесса будет продолжать распределение и кэширование участков VAS меньшего размера, например, такой эффект могут вызывать потоки.

Примечание переводчика: Windows Server 2003 и Window XP имеют механизмы снижения фрагментации динамической памяти (которую часто именуют, как "хип"). Эти механизмы позволяют сократить фрагментацию за счёт распределяя блоков разных размеров, диапазон изменения размера которых имеет 128 предопределенных значений. Когда приложению нужно распределить память в хипе, выбирается такой размер блока, который позволит наиболее оптимально распределять память и избегать её фрагментации.

Второй причиной вытеснения VAS может быть её полная утилизация. Это может стать причиной сбоев при распределении в VAS. Высокопроизводительные серверы должны умет корректно работать с подобным вытеснением, особенно на 32-битных платформах, т.к. если не удастся восстановить состояние после вытеснения VAS, это может вызвать замедление работы первичного процесса, а затем и его завершение. Когда приложение обнаруживает вытеснение VAS, оно может реагировать на это так же, как и при вытеснении внутренней физической памяти, сокращая кэши и пулы. Кроме того, процесс может сократить пулы потоков, начать удалять распределённые другим процессам участки памяти, выгружать библиотеки (dll) и т.д.
Чтобы правильно обрабатывались все описанные типы вытеснения, должна быть сформирована специальная, очень не простая инфраструктура. Для демонстрации этого стоит только рассмотреть, в каких же состояниях может пребывать процесс в одно и то же время. Например, Windows может уведомлять о том, что доступно много внешней памяти, провоцируя увеличение занимаемой процессом памяти, но в то же время этот процесс может быть подвержен вытеснению внутренней физической памяти или VAS.
При реализации такой инфраструктуры, разработчики должны учитывать несколько важных моментов. Если использование процесса снизится (в достаточной мере), этот процесс станет подвержен внешнему вытеснению (если сложатся условия, порождающие вытеснение), и тогда Windows может начать сбрасывать страницы процесса на диск. При этом, будет создано уведомление о недостаточности ресурсов памяти. Как только памяти опять станет много, буде создано соответствующее уведомлении. В этом случае процесс, узнав о наличии свободной памяти, может начать её распределение, хотя в тот же момент этот процесс может сбрасывать страницы на диск. В такой ситуации процесс будет порождать паразитные листания. Может показаться, что при принятии решения об увеличении занимаемой памяти достаточно проанализировать рабочее множество страниц, но тут нужно помнить, что AWE страницы и большие страницы не являются частью рабочего множества, так что разработчикам тут тоже нужно быть весьма осторожными. Другой важный момент, это то, что даже испытывая недостаток памяти и используя файл подкачки, Windows не выдаст уведомление о недостаточности ресурсов памяти, даже когда она собирается возвратить OOM в ответ на следующий запрос памяти. Кроме того, нужно иметь в виду, что даже хорошо написанное приложение может быть подвергнуто воздействию другого приложения, которое написано не правильно и совершенно не заботится о текущем состоянии памяти.
Понимание механизмов вытеснения памяти должно помочь Вам разобраться с тем, как работает менеджер памяти SQL Server. Кроме того, это поможет управлять SQL Server и другими приложениями, совместно использующими ресурсы памяти.

Комментариев нет:

Отправить комментарий