ASP.NET & consommation mémoire au démarrage du processus W3WP.exe

Une question revient régulièrement au support Microsoft au sujet de la consommation mémoire d'ASP.NET au démarrage d'un processus W3WP.exe.
En effet, ASP.NET va se réserver une certaine quantité de mémoire virtuelle dès que le processus démarre (Pour comprendre la différence entre mémoire virtuelle et mémoire privée je vous invite à lire l'article suivant : https://blogs.msdn.com/b/friis/archive/2008/10/13/m-moire-recyclage-sous-iis-6.aspx).

La taille de cette allocation mémoire varie en fonction de l'architecture x86/x64 et de la version du Framework ASP.NET.
La répartition est la suivante :

  • ASP.NET 2.0 x86 = 64 MB par processeur pour le "small object segment" et 32 MB par processeur pour le "large object segment", soit 96 MB par processeur.

  • ASP.NET 2.0 x64 = 512 MB par processeur pour le "small object segment" et 128 MB par processeur pour le "large object segment", soit 640 MB par processeur.

     

  • ASP.NET 4.0 x86 = 64 MB par processeur pour le "small object segment" et 32 MB par processeur pour le "large object segment", soit 96 MB par processeur.

  • ASP.NET 4.0 x64 = 1024 MB par processeur pour le "small object segment" et 256 MB par processeur pour le "large object segment", soit 1280 MB par processeur.

Les Frameworks 3.0 & 3.5 ne sont pas mentionnés car ils reposent entièrement sur le runtime (la CLR) du Framework 2.0. En ce sens on peut les considérer comme un Service Pack du Framework 2.0.

A titre d'exemple, si vous avez une architecture x86 avec 16 processeurs, vous démarrez directement à la limite de l'out-of-memory étant donné que 1536 MB de mémoire virtuelle seront directement réservés sur les 2 GB disponibles par processus. Il reste alors environ 500 MB pour le code natif, les fichiers systèmes… Il est donc préférable pour des machines avec de nombreux processeurs, dans le cadre d'un serveur IIS/ASP.NET, de passer sur une architecture x64 pour éviter cette problématique.

Sylvain Lecerf