У нас есть IIS, работающий на двух серверах (IIS8 и 10), и в последнее время мы сталкиваемся с очень высоким использованием памяти нашими приложениями ASP.NET WebForms, в основном доступ к которым осуществляется через страницы aspx.
Что происходит, так это то, что со временем наши пулы приложений потребляют все больше и больше памяти, пока физическая память на сервере (64 ГБ) почти не исчерпывается. Это определенно ненормально.
Мы пытались выяснить, почему это происходит, но у нас нет идей. Неясно, происходит ли это утечка памяти в нашем приложении или нормальное поведение, поэтому, возможно, кто-то сможет пролить свет на это.
Факты:
Со временем пулы приложений резервируют И используют все больше и больше памяти, которая не освобождается (диспетчер задач сообщает, что и рабочий набор, и размер фиксации очень велики, поэтому он фактически используется / удерживается, верно?)
Профилировщики памяти, такие как ANTS, .dotMemory, .NET MemoryProfiler, говорят, что потребление управляемой памяти довольно низкое, скажем, 20-200 МБ, и показывает много неуправляемой памяти, которая будет использоваться, но бесплатная.
они не дают никаких намеков на то, что может быть причиной неуправляемого использования, даже с помощью снимков и подробных методов профилирования.
если мы «забьем» стартовую страницу клавишей F5, не отпуская ее, мы сможем увеличить использование памяти до 2-5 гигабайт за одну минуту. Это немного безумие.
мы знаем, что пулы IIS / приложений, как правило, резервируют память оппортунистическим способом, чем больше памяти доступно, но это слишком много.
единственное, что мы видим, это то, что кажется, что первая страница хранится в памяти со своими элементами управления и объектами ComponentModel, но в профилировщиках памяти нет единой ссылки ни на один из наших объектов страницы или собственных классов пространства имен.
Год назад потребление памяти было нормальным и остановилось на уровне 2-3 гигабайт, но мы больше не можем воспроизвести его с помощью старой версии приложения.
это происходит и при новой локальной установке IIS под WIN10.
приложения построены в режиме выпуска, оптимизированы, скомпилированы в единую DLL на данный момент, также пробованы без, флаг трассировки включен, размер 5 МБ
Похоже, нам нужно разобрать приложение, разбить его на несколько модулей и посмотреть, как они себя ведут. Сборки / библиотеки, загруженные во время выполнения, могут, но не должны быть проблемой. На самом деле мы не так много ссылаемся (FreeTextBox, Microsoft ReportViewer, SharpCompress, Crystal Reports, AjaxControlToolKit 15), мы уже удалили все, кроме CrystalReports / AjaxControlToolKit, чтобы увидеть, что происходит, но не изменилось.
Мы также используем множество элементов управления WebForms, включая иногда таймеры и UpdatePanels.
Мы также не знаем, как найти виновника с помощью memoryprofilers, предполагая, что существует скрытая ссылка, из-за которой одна или несколько страниц aspx удерживаются в памяти, потому что экземпляры классов .NET никогда не показывают никаких ссылок на что-либо.
Мы были бы рады получить ЛЮБОЙ намек на то, что мы можем неправильно понять в отношении резервирования памяти или способов устранения этой проблемы с потреблением памяти.
Спасибо вам большое за ваше время!
РЕДАКТИРОВАТЬ (забыл упомянуть): - Мы добавили GC.Collect / WaitForPendingFinalizers / GC.Collect к нашей функции Page_Load стартовой страницы, чтобы увидеть, помогает ли это, и это действительно помогает на время или немного, пока не появится другое давление ситуация (с F5), когда использование памяти снова резко возрастает.
Когда GC.WaitForPendingFinalizers помогает, это может быть признаком памяти, используемой потоками. Если вы запустите новый отдельный поток на page_load, он может использовать много памяти. Начните диагностику проблемы, проверив количество потоков в диспетчере задач.