Определите, кто / что зарезервировало 5,5 ГБ виртуальной памяти в w3wp.exe

StackOverflow https://stackoverflow.com/questions/355934

Вопрос

На моем компьютере (XP, 64) ASP.net рабочий процесс (w3wp.exe) всегда запускается с зарезервированным 5,5 ГБ виртуальной памяти.Это происходит независимо от веб-приложения, которое оно размещает (это может быть что угодно, даже пустая веб-страница в aspx).

Этот большой кусок виртуальной памяти зарезервирован в момент запуска процесса, так что это не какая-то постепенная "утечка" памяти.

Некоторое изучение windbg показывает, что память, о которой идет речь, является частной, зарезервированной и RegionUsageIsVAD, что указывает на то, что это может быть работа кого-то, вызывающего VirtualAlloc.Это также показывает, что рассматриваемая память выделена / зарезервирована в виде 4 больших блоков по 1 ГБ каждый и нескольких меньших (1/4 ГБ каждый).

Так что, я думаю, мне нужно выяснить, кто вызывает VirtualAlloc и резервирует всю эту память.Как мне это сделать?

Подключить отладчик к процессу до выделения памяти сложно, потому что w3wp.exe является ли процесс, запущенный svchost.exe (то есть IIS / ASP.Net filter) и если я попытаюсь запустить его сам, чтобы отладить, он просто закроется без всего этого обильного резервирования памяти.Кроме того, параметры командной строки недействительны, если я использую их повторно (что имеет смысл, поскольку это канал, созданный вызывающим процессом).

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

Это было полезно?

Решение

Дэвид Ванг отвечает на этот аналогичный вопрос:

[...] ASP.Net разработчик производительности говорит мне, что:

  • О зарезервированной виртуальной памяти беспокоиться не о чем.Вы можете просмотреть это как обязательное условие производительности / кэширования среды CLR.И тестирование с высокой нагрузкой показывает, что беспокоиться не о чем .
  • Система.Windows.Формы - Это не загружается пустым hello world ASPX Страница.Вы можете использовать Microsoft Debugging Tools и "sx e ld system.windows.forms", чтобы определить, что на самом деле запускает это во время выполнения.Или вы можете использовать ildasm, чтобы найти зависимость.
  • mscorlib - убедитесь, что это GAC'd и NGEN'd правильно.

Другие советы

Виртуальная память - это просто адресное пространство, выделенное процессу.Это не имеет ничего общего с использованием памяти.

Видишь:

  1. Виртуальная память
  2. Раздвигая границы возможностей Windows:Виртуальная память
  3. http://support.microsoft.com/kb/555223

Зарезервировано память сильно отличается от выделенный память.Резервирование памяти просто выделяет адресное пространство.Он не фиксирует никаких физических страниц.

Это адресное пространство, вероятно, выделено IIS для своей кучи.Он будет фиксировать страницы только тогда, когда это необходимо.

Если вы действительно хотите запустить w3wp.exe из windbg, вам, вероятно, нужно запустить его с допустимыми аргументами командной строки.Вы можете использовать Обозреватель процессов чтобы определить, что такое командная строка для текущего w3wp.exe процесса.Например, на моем сервере мой был:

c:\windows\system32\inetsrv\w3wp.exe -a \.\pipe\iisipmeca56ca2-3a28-452a-9ad3-9e3da7b7c765 -t 20 -ap "DefaultAppPool"

Я не уверен, что указывает UID там, но похоже, что он, вероятно, генерируется "на лету" службой W3SVC (которая и была запущена w3wp.exe) для присвоения имени указанному там каналу.Поэтому вам обязательно следует заглянуть в свою командную строку перед запуском w3wp из windbg.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top