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

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

Я просто хотел бы сказать <GeorgeTakei> «Боже мой!» </GeorgeTakei>!

StingyJack 10.12.2008 16:09

Это первое подходящее использование нового тега <GeorgeTakei>, которое я видел (конечно, за пределами страниц Heroes на NBC.com)!

P Daddy 10.12.2008 16:21

Я наблюдаю такое же поведение на сервере 2008, IIS7

Robert Claypool 21.12.2009 22:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
3
4 278
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Видеть:

  1. Виртуальная память
  2. Выходя за рамки Windows: виртуальная память
  3. http://support.microsoft.com/kb/555223

Объем зарезервированной виртуальной памяти влияет на «виртуальный размер» процесса, что делает повторное использование процесса в asp.net на основе ограничений виртуальной памяти бесполезным.

Assaf Lavie 10.12.2008 16:03

И что это должно означать? ВМ может увеличиваться за счет увеличения адресных потребностей. Я не уверен, станет ли это когда-нибудь слишком большим. Я действительно не могу протестировать, здесь только 32-битная Vista. Вы получите максимум 3 ГБ виртуальной памяти AFAIK, но только около 2 ГБ реальной памяти на процесс.

leppie 10.12.2008 16:12
Ответ принят как подходящий

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

[...] 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.

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

Assaf Lavie 10.12.2008 16:31

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