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

На моей машине (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), и если я пытаюсь запустить его самостоятельно, чтобы отладить его это просто закрывается без всего этого обильного резервирования памяти. Кроме того, параметры командной строки недопустимы, если я их повторно использую (что имеет смысл, потому что это канал, созданный вызывающим процессом).

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

10.12.2008 12:50:05
Я просто хотел бы сказать <GeorgeTakei> «Боже мой» </ GeorgeTakei>!
StingyJack 10.12.2008 13:09:38
Это первое релевантное использование нового тега <GeorgeTakei>, который я видел (конечно, за пределами страниц Heroes на NBC.com)!
P Daddy 10.12.2008 13:21:34
Я наблюдаю такое же поведение на Server 2008, IIS7
Robert Claypool 21.12.2009 19:35:31
3 ОТВЕТА
РЕШЕНИЕ

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

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

  • Зарезервированной виртуальной памяти не о чем беспокоиться. Вы можете рассматривать это как условие производительности / кэширования CLR. А тяжелые нагрузочные испытания показывают, что беспокоиться не о чем.
  • System.Windows.Forms - это не затягивается пустой страницей ASPX hello world. Вы можете использовать Microsoft Debugging Tools и «sx e ld system.windows.forms», чтобы определить, что на самом деле тянет его во время выполнения. Или вы можете ildasm, чтобы найти зависимость.
  • mscorlib - убедитесь, что это GAC'd и NGen'd правильно.
7
10.12.2008 13:26:39

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

Видеть:

  1. Виртуальная память
  2. Расширяя границы Windows: виртуальная память
  3. http://support.microsoft.com/kb/555223
3
15.07.2014 05:13:51
Объем зарезервированной виртуальной памяти влияет на «виртуальный размер» процесса, что делает бесполезным повторное использование процесса в asp.net на основе ограничений виртуальной памяти.
Assaf Lavie 10.12.2008 13:03:14
И что это значит? ВМ может увеличиться из-за возросших потребностей в адресации. Я не уверен, станет ли это когда-нибудь слишком большим. Я не могу действительно проверить, только 32-битная Vista здесь. Вы получите максимум 3 ГБ VM AFAIK, но только около 2 ГБ максимальной оперативной памяти на процесс.
leppie 10.12.2008 13:12:17

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

Это адресное пространство, вероятно, выделено 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.

0
10.12.2008 13:18:34
Эти аргументы командной строки являются одноразовыми и не могут быть повторно использованы, я пытался.
Assaf Lavie 10.12.2008 13:31:00