Почему Windows 2008 использует своп до заполнения памяти?

9

Я администрирую сервер Windows 2008 (ну, на Amazon EC2) под управлением IIS и веб-приложения .NET4. Я получил предупреждение памяти на днях и пошел и посмотрел, и, конечно же, память процесса выросла с течением времени из-за какой-то медленной утечки. Он вырос не так сильно, как 60М до 200М, но с коробкой продолжалось достаточно, чтобы он перешел наш довольно низкий порог (75%), чтобы отключить монитор.

Я переработал пул приложения и освободил память, и, просмотрев статистику, я заметил, что пространство подкачки использовалось значительно, и что более 1 ГБ его освободило при этой переработке.

Может быть, это основной вопрос, но я парень из UNIX и привык менять местами, не привыкая, пока у тебя не останется памяти. Эта коробка никогда не превышала 75% использования памяти. Это вещь для Windows, для .NET или для Amazon? Я подозреваю, что в этом приложении гораздо большая утечка памяти, чем предполагалось - она ​​не просачивается с 60М до 200М, она просачивается с 60М до 1.2ГБ, но большая часть этого почему-то «остывает» и вытесняется для замены?

В пуле приложений настроена рециркуляция памяти, но она запускает полную память, поэтому это приложение может стать действительно очень большим, прежде чем оно автоматически перезапустится.

Я мог бы настроить регулярную «временную» переработку, но это обходной путь, я заставлю разработчика исправить приложение, но мне нужно понять, что здесь происходит с использованием свопа, чтобы убедиться, что я правильно понимаю.

Изменить с дополнительной информацией: память экземпляра: 1,7 ГБ, подкачка: 4,5 ГБ

Я вижу процесс w3wp.exe в taskmgr, показывающий, что Memory: 211,000k. Но когда я перезапустил его (он находится в его собственном пуле приложений, и это единственное приложение на коробке), его использование памяти уменьшилось до его обычной начальной точки 60M и, как 1 ГБ + swap, также освободилось. В taskmgr у меня только что была обычная статистика Memory (Private Working Set), но я увидел изменение свопа через другой мой мониторинг (Cloudkick). Возвращаясь к сегодняшнему взгляду, память восстановилась до 195 МБ (всего 1,2 ГБ), а объем подкачки увеличился с 1,0 ГБ до 1,1 ГБ, но не до конца туда, где он был (график со временем это медленная ползучесть).

Я меньше беспокоюсь об этом конкретном приложении и больше беспокоюсь о том, чтобы просто понять, когда Windows меняет местами и как оно это использует, и что нужно беспокоиться об использовании памяти и подкачки Windows.

Эрнест Мюллер
источник
4
Кстати, по крайней мере, Linux будет обмениваться страницами оппортунистически, если к ним не обращались в течение длительного времени, даже если система не приближается к использованию всей доступной оперативной памяти. Это делается для освобождения памяти для дискового кэша, буферов и т. Д.
EEAA
Сколько памяти у этого экземпляра? Вы говорите, что процесс w3wp.exe поражает 1 ГБ? Это единственный сайт, работающий в этом пуле приложений?
Кев
@ KevΩ Добавил больше информации в Q по вашему запросу.
Эрнест Мюллер
@ErikA, приятно знать, наверное, я слушал парней, которые говорят: «Если вы меняете местами, у вас уже есть дерьмовое исполнение, просто отключите своп и не исчерпайте RAM», поэтому я не Смотрю так много.
Эрнест Мюллер
Если ваш диск перебивает на диск, это правда. Если он поменяется местами, он освободит место для буферов и тому подобного.
Барт Сильверстрим

Ответы:

17

В Windows и Linux есть две разные стратегии подкачки страниц.

Linux

Linux хочет вообще не использовать пространство подкачки и ждет до последнего момента. Если вы видите большой объем подкачки в Linux, ваша система, вероятно, находится или была в беде. Эта стратегия хороша для минимизации общего дискового ввода-вывода, который является самой медленной частью вашей системы, но слабее для систем с чередующимися периодами малой и большой нагрузки (и, честно говоря, это большинство из нас). Времена, когда ваша нагрузка уже велика, теперь будут отягощены «дополнительным» дисковым вводом-выводом, или, другими словами, вам нужно проектировать сборки вашего сервера с учетом наличия достаточного количества оперативной памяти, которую вы не поменяете местами даже во время максимальное ожидаемое время загрузки.

Windows

Windows хочет рассматривать память как простой кеш файла подкачки. Ваша реальная память всегда находится на диске, но сначала она будет читать / записывать из «кэша», если сможет. Эта стратегия хороша для выравнивания нагрузки с течением времени; когда система загружается и ей нужно поменять местами страницу, текущая страница уже находится на диске, и половина работы уже выполнена. Этот подход имел огромное значение еще тогда, когда Windows была молодой, 32 МБ (не считая ГБ) оставалось большим объемом ОЗУ, и частая необходимость использовать пространство подкачки была само собой разумеющейся. Даже сегодня это хорошо для рабочих нагрузок, которые чередуются между легкими и загруженными нагрузками, поскольку это помогает более равномерно распределять дисковый ввод-вывод во времени.

Современные версии Windows имеют дополнительные оптимизации, такие как SuperFetch, для предварительной загрузки и подготовки страниц памяти на диске и в ОЗУ, когда загрузка незначительна, чтобы избежать необходимости дополнительной записи на диск при первой загрузке программы. Все это означает, что вы можете спроектировать свою систему так, чтобы ей требовалось только достаточно оперативной памяти для чего-то меньшего, чем максимальная ожидаемая нагрузка, поэтому вы все равно можете иметь как минимум приемлемую производительность при сниженных затратах.

конвергенция

Эта концепция измерения или прогнозирования нагрузки в тестовой среде, а затем распределения производственных ресурсов, когда нагрузка известна, является относительно недавней разработкой в ​​построении системы, ставшей возможной или, по крайней мере, практической, отчасти с появлением виртуальных, а затем и облачных серверов. , В зависимости от вашей нагрузки вы можете даже спроектировать систему так, чтобы ей вообще не приходилось менять местами. В этих случаях Windows позволяет отключить подкачку и вести себя как система linux. Тем не менее, вы должны быть осторожны; если ваша система требует больше памяти, чем ожидалось, вы можете попасть в неприятности таким образом.

С другой стороны, современные ядра Linux более склонны к произвольной смене дисков, чем когда-то. Таким образом, различие в стратегиях управления памятью между двумя системами все еще присутствует, но теперь менее отчетливо, чем раньше. Обе системы имеют свои достоинства, и каждая наблюдает за другой, чтобы увидеть, какие достижения они могут скопировать.

Джоэл Коэль
источник
Очень конкретная стратегия конца Windows, спасибо! Также проверенный Microsoft KB я нашел ... support.microsoft.com/kb/2267427
Эрнест Мюллер
1
Linux не обязательно ждет последнего возможного момента, если вы явно не установите vm.swappiness = 0. При значении по умолчанию 60 он будет заменять страницы, которые не были затронуты в течение некоторого времени.
Кжетил Йоргенсен
@KjetilJoergensen обязательно прочитайте последний раздел о конвергенции.
Джоэл Коэль
1
@JoelCoel Я безоговорочно отказываюсь от своей критики :)
Kjetil Joergensen
7

Windows (и Linux и другие Unix-подобные ОС) будут перемещать страницы, которые не использовались в течение некоторого времени, на диск, чтобы освободить место для буферов и кеша, чтобы ускорить активную активность ввода-вывода. Кроме того, приложения часто выделяют больше памяти, чем они сразу собираются использовать - это может подтолкнуть Ядро к поиску страниц некоторых вещей, которые не были недавно затронуты в фоновом режиме, так что указанные приложения не видят задержку подкачки при внезапном запуске используя это распределение.

В Linux вы можете настроить (или заблокировать) это поведение, изменив соответствующие значения «перестановки» в /procфайловой системе - несомненно, есть значения реестра, которые вы можете изменить, чтобы изменить поведение Windows в этом отношении.

Еще одна вещь, о которой следует помнить, это то, что когда что-то выгружается, а затем снова считывается, ядро ​​не удаляет его из файла подкачки, пока файл не будет заполнен в противном случае или страница в ОЗУ не будет изменена. Таким образом, если ему нужно снова разложить страницу на части, он может сделать это без необходимости записывать страницы на диск: контент уже есть. Это может значительно повысить производительность в ситуациях, когда чрезмерная фиксация памяти становится настолько плохой, что вызывает перегрузку файлов подкачки (значительное количество страниц постоянно отображается и выводится). Вы, вероятно, обнаружите, что некоторые данные были вытеснены этой утечкой памяти и с тех пор были считаны обратно, но не стерты с диска на случай, если эти страницы необходимо отобразить или ОЗУ освободить место позже. Под Linux значение "SwapCached" в/proc/meminfoпоказывает, сколько данных присутствует на страницах с одинаковыми копиями в оперативной памяти и на диске. Без сомнения, Windows использует ту же оптимизацию (или что-то похожее), но я не совсем уверен, где посмотреть, сколько это происходит (без сомнения, есть соответствующие счетчики монитора производительности, которые вы можете запросить).

tl; dr: это нормально. Современное ядро ​​ОС постарается быть умным и максимально увеличить объем ОЗУ, которое он может использовать в качестве кэша для сохранения операций ввода-вывода, и иногда будет копировать данные на диск и в ОЗУ для сохранения операций ввода-вывода, если ему потребуется вывести эти биты из памяти. ОЗУ позже. Скорее всего, как ни странно, такое использование файлов подкачки этими двумя способами, даже если в настоящее время у вас недостаточно ОЗУ, улучшает общую производительность, а не снижает ее.

Дэвид Спиллетт
источник