Pergunta

Na minha máquina (XP, 64) o processo de trabalho ASP.net (w3wp.exe) sempre lançamentos com 5.5GB de memória virtual reservados. Isso acontece independentemente da aplicação web está hospedando (pode ser qualquer coisa, até mesmo uma página web vazio no aspx).

Este grande pedaço velho de memória virtual é reservado no momento o processo começa, e isso não é uma memória gradual "vazamento" de algum tipo.

Alguns bisbilhotando com shows WINDBG que a memória está questão é privado, reservado e RegionUsageIsVAD, o que indica que poderia ser obra de alguém chamar VirtualAlloc. Ele também mostra que a memória em questão é alocado / reservados em 4 grandes pedaços de 1GB cada e um vários pequenos (1/4 GB cada).

Então eu acho que precisa descobrir quem está chamando VirtualAlloc e reservando toda essa memória. Como posso fazer isso?

Anexar um depurador ao processo antes da alocação de memória é complicado, porque w3wp.exe é um processo lançado pelo svchost.exe (isto é, filtro IIS / ASP.Net) e se eu tentar lançá-lo eu mesmo, a fim depurá-lo apenas fecha sem todas as reservas esta memória profusa. Além disso, os parâmetros de linha de comando são inválidas se eu resuse-los (o que faz sentido porque é um tubo criada pelo processo de chamada).

Eu posso anexar windbg-lo para o processo após o fato (que é como eu encontrei as regiões de memória em questão), mas eu não tenho certeza que é possível neste ponto para determinar quem alocado o.

Foi útil?

Solução

David Wang responde a esta a uma pergunta semelhante:

[...] o desenvolvedor desempenho ASP.Net me diz que:

  • A memória virtual reservada é nada para se preocupar. Você pode ver -lo como performance / cache pré-requisito do CLR. E testes de carga pesada mostra que é nada para se preocupar sobre.
  • System.Windows.Forms - Não é puxado por Olá mundo vazio ASPX página. Você pode usar o Microsoft Debugging Ferramentas e "sx e ld System.Windows.Forms" para identificar o que está realmente puxando-a em tempo de execução. Ou você pode ildasm para encontrar o dependência.
  • mscorlib -. Certifique-se que é GAC'd e NGen'd corretamente

Outras dicas

A memória virtual é apenas o espaço de endereço atribuído ao processo. Não tem nada a ver com o uso de memória.

Veja:

  1. memória virtual
  2. Empurrando os limites do Windows: Memória Virtual
  3. http://support.microsoft.com/kb/555223

reservados de memória é muito diferente do alocada memória. Reservando memória apenas aloca espaço de endereço. Ele não cometer quaisquer páginas físicas.

Este espaço de endereço é provável atribuído pelo IIS para o seu acervo. Ele só vai cometer páginas quando necessário.

Se você realmente quer w3wp.exe lançamento de windbg, você provavelmente precisa iniciá-lo com argumentos de linha de comando válidas. Você pode usar Process Explorer para determinar o que a linha de comando para a corrente w3WP.exe processo é. Por exemplo, no meu servidor, o meu era:

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

Eu não tenho certeza o que o UID em lá especifica, mas parece que provavelmente gerada em tempo real pelo serviço W3SVC (que é o que lançou w3wp.exe) para nomear o pipe especificado lá. Então você deve definitivamente olhar para a sua linha de comando antes de lançar w3wp de windbg.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top