Определите, кто / что зарезервировал 5,5 ГБ виртуальной памяти в w3wp.exe - PullRequest
7 голосов
/ 10 декабря 2008

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

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

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

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

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

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

Ответы [ 3 ]

7 голосов
/ 10 декабря 2008

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

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

  • Зарезервированная виртуальная память не о чем беспокоиться. Вы можете просмотреть это как предпосылка производительности / кэширования Клр. И тяжелое нагрузочное тестирование показывает, что беспокоиться не о чем около.
  • System.Windows.Forms - не затягивается пустым миром ASPX стр. Вы можете использовать Microsoft Debugging Инструменты и "SX E LD system.windows.forms ", чтобы определить, что на самом деле тянет его во время выполнения. Или вы можете ildasm найти зависимость.
  • mscorlib - убедитесь, что это GAC и NGen правильно.
3 голосов
/ 10 декабря 2008

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

См:

  1. Виртуальная память
  2. Расширение границ Windows: виртуальная память
  3. http://support.microsoft.com/kb/555223
0 голосов
/ 10 декабря 2008

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

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

Если вы действительно хотите запустить w3wp.exe из windbg, вам, вероятно, нужно запустить его с действительными аргументами командной строки. Вы можете использовать Process Explorer , чтобы определить командную строку для текущего процесса 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 вам обязательно нужно посмотреть на командную строку.

...