На моей машине (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), и если я попытаюсь запустить его сам, чтобы отладить его он просто закрывается без всего этого обильного резервирования памяти. Кроме того, параметры командной строки недействительны, если я использую их повторно (что имеет смысл, потому что это канал, созданный вызывающим процессом).
Я могу прикрепить его к процессу постфактум (именно так я нашел нужные области памяти), но я не уверен, что в этот момент возможно определить, кто что выделил.
Это первое подходящее использование нового тега <GeorgeTakei>, которое я видел (конечно, за пределами страниц Heroes на NBC.com)!
Я наблюдаю такое же поведение на сервере 2008, IIS7





Виртуальная память - это просто адресное пространство, выделенное процессу. Это не имеет ничего общего с использованием памяти.
Видеть:
Объем зарезервированной виртуальной памяти влияет на «виртуальный размер» процесса, что делает повторное использование процесса в asp.net на основе ограничений виртуальной памяти бесполезным.
И что это должно означать? ВМ может увеличиваться за счет увеличения адресных потребностей. Я не уверен, станет ли это когда-нибудь слишком большим. Я действительно не могу протестировать, здесь только 32-битная Vista. Вы получите максимум 3 ГБ виртуальной памяти AFAIK, но только около 2 ГБ реальной памяти на процесс.
Дэвид Ван отвечает на аналогичный вопрос:
[...] the ASP.Net performance developer tells me that:
- The Reserved virtual memory is nothing to worry about. You can view it as performance/caching prerequisite of the CLR. And heavy load testing shows that it is nothing to worry about.
- System.Windows.Forms - It's not pulled in by empty hello world ASPX page. You can use Microsoft Debugging Tools and "sx e ld system.windows.forms" to identify what is actually pulling it in at runtime. Or you can ildasm to find the dependency.
- mscorlib - make sure it is GAC'd and NGen'd properly.
Память Зарезервированный сильно отличается от памяти выделенный. Резервирование памяти просто выделяет адресное пространство. Он не фиксирует никаких физических страниц.
Это адресное пространство, вероятно, выделено 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.
Эти аргументы командной строки являются одноразовыми и не могут быть использованы повторно, как я пытался.
Я просто хотел бы сказать <GeorgeTakei> «Боже мой!» </GeorgeTakei>!