w3wp / asp.net Alto uso de memória - Isso é problemático?

3

Temos um webpplication asp.net (.net 4.0) instalado em vários ambientes. Na maioria dos ambientes, o uso de memória está em torno de 1GB. No entanto, temos um ambiente em que o uso da memória atinge 5,5 GB. Esta é uma máquina do Server 2008 com 4 núcleos e 8GB de memória RAM sendo executada como um cliente VMWare esx.

Configurei contadores de desempenho com os seguintes resultados:

Memory
    Committed Bytes    10 145 739 948,0000
    Pages Output/sec                0,0000

Paging File                         _Total
    % Usage                         28,998

Process                             _Total                w3wp
    Working Set              7 480 003 280       5 604 421 056

Eu também fiz um dump de memória do processo w3wp (quando era +/- 2 GB, porque falhas maiores falharam). Correndo DebugDiag no despejo não me fez mais sábio. Parece que a própria .net está ocupando apenas 800MB e a maior parte da memória é ocupada por 'alguma outra coisa'.

.NET GC Heap Information
GC Heap Size          826,09 MBytes  
Total Commit Size       1217 MB 
Total Reserved Size    16190 MB 

Heap Analysis
Summary
Number of heaps   29 Heaps 
Total reserved memory   1,89 GBytes 
Total committed memory   1,79 GBytes 

...
(largest of the Heaps)
Reserved memory                     1,69 GBytes 
Committed memory                    1,67 GBytes(99,14% of reserved) 
Uncommitted memory                  14,86 MBytes(0,86% of reserved) 
Number of heap segments             113 segments 
Number of uncommitted ranges        113 range(s) 
Size of largest uncommitted range   0 Bytes 

O problema é que não tenho certeza se esse alto uso de memória é um problema. Então, o que estou procurando é alguma orientação de como proceder com esse problema:

  • Alguém me diz que é assim que o IIS7 funciona e eu não deveria me preocupar com a memória.
  • Ou alguém me aponta como eu posso analisar esse despejo ainda mais (especialmente como eu posso ver o que está nessa pilha de 1,6 GB.
  • Ou me explique por que existe uma diferença tão grande entre o que o .net está usando e o que o W3WP está usando.

EDITAR: Isso é o que vejo no ProcExp:

Como você pode ver, o total de bytes em todos os heaps é de 1,12 GB. Na época, o W3WP estava usando 6,4 GB. Por que existe uma diferença tão grande entre esses dois números? O que poderia estar tomando esse espaço? É essa a fragmentação do LOH que vejo?

    
por Lodewijk 15.08.2015 / 15:34

2 respostas

1

Para aqueles que acabam aqui com algo semelhante: no final, foi um código não gerenciado nas bibliotecas do Active Directory da estrutura .net que não foi descartado corretamente. É por isso que o heap não gerenciado era tão grande.

Como eu descobri qual foi o culpado? Acabei de ver endereços aleatórios de memória para descobrir qual era o conteúdo. E desde que encontrei um lote de dados relacionados ao Active Directory, eu sabia que estava vazando dados.

Algumas chamadas de Dispose() depois, o problema foi resolvido.

    
por 11.04.2016 / 22:10
3

Isso é mais uma questão de desenvolvedor e não está relacionado ao IIS.

A primeira coisa que você deve fazer é identificar em qual heap de geração a memória está (0, 1, 2 ou 3 (Large Object Heap))

O Process Explorer fornece uma maneira fácil de exibir essas informações.

Na maior parte, o .NET GC é autogerenciável. Existem alguns parâmetros .config para ajustar isso, mas esta é realmente uma área onde o desenvolvedor deve fornecer orientação.

Se você deseja inspecionar o heap, o WinDbg é provavelmente a ferramenta escolhida.

link

link

    
por 15.08.2015 / 16:09