w3wp.exe забирает память

8

При установке Small Business Server 2011 целый ряд процессов w3wp.exe, по-видимому, использует непропорционально большой объем памяти. Готовая установка SBS включает в себя 7 сайтов и 20 пулов приложений ASP.NET (Sharepoint, Exchange, WSUS и SBS, например, Remote Web Workplace).

Результирующая дюжина процессов w3wp.exe имеет тенденцию занимать более 4 ГБ памяти сервера с течением времени, при этом пиковый пул приложений принадлежит тому, который принадлежит WSUS с около 800 МБ в рабочем наборе. Ручная переработка пулов приложений через IIS MMC помогает временно сократить использование памяти (процессы w3wp.exe сокращаются до 10 МБ, некоторые из них быстро вырастают), но, очевидно, это не то, что администратор хочет делать весь день. Мне не удалось найти какие-либо рекомендации по автоматической утилизации пулов приложений с предустановленной SBS, поэтому я несколько неохотно "просто делаю это" в производственных системах.

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

  • во-первых, SBS - это многоцелевой сервер, одной из ролей (главная из которых) является сетевое хранилище CIFS, которое извлекает огромную выгоду из кэширования файловой системы, которое опять-таки полагается на то, что память «свободна», как и «не используется другими процессами в любом путь »- пулы приложений ASP.NET, которые почти не видят пользователей и потребляют память, контрпродуктивны
  • Другое дело, что мне все еще приходится видеть существенное снижение потребления памяти экземплярами w3wp при нехватке памяти - я вижу небольшое уменьшение, значительно меньшее, чем на 100 мегабайт, и чрезмерное переключение вместо этого - опять же снижается производительность

Я почти никогда не администрирую приложения IIS или ASP.NET, поэтому любые идеи о том, как эффективно сократить требования к памяти для пулов приложений, приветствуются.

заместитель Wabbit
источник
Что делает это приложение ASP.NET? Я видел, что w3wp.exe использует много памяти, когда приложение не может закрыть соединения с Linq-To-SQL или Entity Framework.
Nate
Есть несколько. Многие из них связаны с Exchange, такими как службы OWA / OMA и Sync, один исключительно большой - WSUS, некоторые используются для Sharepoint или специализированных сайтов SBS (CompanyWeb, Remote Web Workplace)
the-wabbit

Ответы:

7

Добро пожаловать в чудесный мир SBS. Рекомендуемые требования к оперативной памяти = 10 ГБ ... и ТРЕБУЕТ минимум 8 ГБ. ( согласно Microsoft .) по уважительной причине. Это не отлаженная хорошо смазанная машина ... она очень неряшливая, раздутая, и все под солнцем связано. Чем больше оперативной памяти вы можете выбросить в эту коробку ... тем лучше. К сожалению, вы ограничены до 32 ГБ макс. Который имхо ... глупо.

TheCompWiz
источник
Думаю, мне следует немного уточнить свой ответ. Если вас беспокоит объем ОЗУ, который он потребляет, вы бы сэкономили много времени / головной боли, выполнив одно из следующих действий: A) Не используйте SBS ... используйте стандартный сервер и установите роли, которые вам НУЖНЫ индивидуально. или B) Добавьте больше оперативной памяти в систему ... так как оперативная память довольно дешевая. SBS предназначен для очень маленьких офисов ... (10-20 рабочих станций ...) и не очень хорошо масштабируется.
TheCompWiz
Спасибо за Ваш ответ. Система, в которой я наблюдал такое поведение, имела 16 ГБ ОЗУ, что является физическим пределом. Доступная память быстро заполнилась хранилищем Exchange.exe и многочисленными экземплярами SQL Server и w3wp.exe, которые не просто «не очень хорошо настроены», но и являются «мозговой смертью». Я знаю, как справляться с проблемами чрезмерного потребления памяти двух других, поскольку мне часто приходится управлять системами Exchange и SQL Server, но с w3wp я несколько растерялся. Сама сеть насчитывает всего 11 пользователей.
the-wabbit
Exchange, SQL Server и IIS имеют механизмы, которые будут пытаться использовать 100% оперативной памяти для «кэшированных» данных. Если что-то еще требует больше оперативной памяти ... все 3 должны быть сокращены, чтобы позволить другим службам работать без замены. (в теории) На практике, однако, я обнаружил, что вам просто нужно кататься с ударами по некоторым вещам ... Вы можете попробовать и настроить все вручную и установить жесткие ограничения ... но вы всегда будете преследовать свой хвост этот. Я посмотрю, смогу ли я найти статью, которую я прочитал несколько лет назад об ограничении пулов приложений в IIS для вас ...
TheCompWiz
7

Это то, что я в итоге сделал:

установив низкое значение кэша серверных приложений для .NET AppPools (5 МБ), установив параметр privateBytesLimit в web.configat, %WINDIR%\Microsoft.NET\Framework\<version>\Configкак предлагается в этом ответе :

    <configuration>
      <system.web>
         <caching>
           <cache privateBytesLimit="5242880" privateBytesPollTime="00:01:00" />
         </caching>
      </system.web>
    </configuration>

Это помогло уменьшить использование памяти до более чем 1 ГБ с настройками рециркуляции пула по умолчанию.

По-видимому, использование «серверного» типа сборщика мусора ( <gcServer = "true">) также может привести к значительному потреблению памяти , но, по-видимому, <gcServer>по умолчанию имеет значение false.

заместитель Wabbit
источник
К вашему сведению - некоторое время назад мы начали устанавливать для gcserver значение false после прочтения этих статей: forums.asp.net/t/1654596.aspx/1 и msdn.microsoft.com/en-us/library/ff647787.aspx
Грег Аскью
@ the-wabbit Является ли совет по установке gcServer = false все еще актуальным сейчас, когда сборка мусора на сервере происходит одновременно?
Майкл Стил
6

Если вы подозреваете, что получающееся в результате потребление памяти является проблемой из-за дефекта программного обеспечения, вы можете использовать Microsoft DebugDiag 1.2 для создания полного дампа памяти и анализа дампа на наличие общих проблем. Если вы считаете, что может быть проблема с памятью, вам нужно включить отслеживание утечек, выбрав опцию «Отслеживать утечки» и подождать некоторое время, прежде чем создавать / анализировать дамп.

Скачать DebugDiag 1.2
https://www.microsoft.com/download/en/details.aspx?id=26798

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

Грег Аскью
источник
Спасибо за ссылку, я собираюсь попробовать. Установочный пакет MSI, по-видимому, имеет проблемы при запуске в локализованных (не US-Englisch) версиях Windows, я должен посмотреть, есть ли обходной путь для этого.
the-wabbit
2

Вам не нужен отдельный пул приложений для каждого приложения, только те, которые ненадежны или которым вы хотите отдать приоритет. Многие могут поделиться (держа разные версии .net отдельно). Затем вы можете более реалистично ограничить объем памяти, который будет использовать пул приложений. Не должно быть необходимости повторно использовать пулы чаще, чем раз в день.

Кроме того, таким способом можно освободить только столько памяти. Хотя некоторые из них будут кэшироваться, каждому приложению требуется определенный объем рабочей памяти, который сильно зависит от конкретного веб-приложения. Попытка ограничить это слишком сильно приведет к полной остановке.

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

Но, если честно, всего 11 пользователей, куда уходит остальная память? Exchange и SQL для легкого использования, конечно, не требуют больше, чем 12 ГБ!

JamesRyan
источник
Ах, вы никогда не испытывали красоту SBS, не так ли? Хранилище информации Exchange увеличивается до 8 ГБ, если не ограничивать, несколько экземпляров SQL-сервера с радостью займут еще 3 ГБ. В большинстве пулов приложений работают всего 1-2 приложения с одинаковой версией .NET и в одном контексте безопасности. Тем не менее, я не могу перегруппировать их из-за проблем с поддержкой. Также вряд ли это решит проблемы с памятью - если у меня просто 4 процесса по 1 ГБ вместо 12 меньших, выиграть не так уж и много.
the-wabbit
Разница с меньшим количеством пулов приложений состоит в том, что различные кэши будут заполнены тем, что регулярно используется, выталкивая то, что не используется. С большим количеством пулов приложений будет больше потрачено впустую. Сколько контекстов безопасности вам действительно нужно с 11 пользователями? Да, Exchange с радостью использует столько памяти, сколько он может получить в свои руки, но он также с радостью будет работать только на 2 ГБ для тех немногих пользователей, если вы ограничите ее. С SBS вы должны признать, что вы не можете использовать лучшие практики повсюду или использовать любой из вариантов оптимально, вы должны быть немного прагматичными, а не чрезмерными инженерами.
JamesRyan
Хорошо, если вы пытаетесь запустить 20 экземпляров на сервере, неудивительно, что вы пытаетесь втиснуть все это в память. Вы действительно должны были упомянуть об этом в вопросе, потому что это ставит вещи в совершенно ином свете.
JamesRyan
На самом деле я этого не делаю - как я уже говорил, проблема возникает с физической системой, где редко используемые пулы приложений крадут память из гораздо более ценного кэша файловой системы. Я подозревал, что это происходит из-за некоторого кеширования объектов в пулах приложений, и искал какие-либо способы уменьшить / отключить кеш.
the-wabbit