2010-08-10 7 views
3

Environment.WorkingSet renvoie le jeu de travail incorrect pour mon application asp.net qui est la seule application de son pool d'applications.Environnement.WorkingSet bug

Sur un serveur Windows 2003 SP2 avec 3 Go de RAM qui est une machine virtuelle VMWare , il signale le jeu de travail comme 2.047.468.061 octets (1952MBs) et la valeur Process.WorkingSet est 75.563.008 octets (72MBs).

• Mémoire des valeurs d'état renvoyées par GlobalMemoryStatusEx:

AvailExtendedVirtual : 0 
AvailPageFile: 4.674.134.016 
AvailPhys: 2.140.078.080 
AvailVirtual: 1.347.272.704 
TotalPageFile: 6.319.915.008 
TotalPhys: 3.245.568.000 
TotalVirtual: 2.147.352.576 

• GetProcessMemoryInfo()

Working Set : 55.140.352 
Peak Working Set: 75.571.200 
PageFile : 94.560.256 
QuotaPagedPoolUsage : 376.012 
QuotaNonPagedPoolUsage : 33.261 

• GetProcessWorkingSetSize() - min: 204,800 - max: 1.413.120

• GetPerformanceInfo()

CommitLimit : 1.542.948 pages 6.319.915.008 bytes 
CommitPeak : 484.677 pages 1.985.236.992 bytes 
CommitTotal : 417.514 pages 1.710.137.344 bytes 
HandleCount : 57.012 
KernelNonpaged : 8.671 pages 35.516.416 bytes 
KernelPaged : 27.302 pages 111.828.992 bytes 
KernelTotal : 35.973 pages 147.345.408 bytes 
PageSize : 4.096 bytes 
PhysicalAvailable : 508.083 pages 2.081.107.968 bytes 
PhysicalTotal : 792.375 pages 3.245.568.000 bytes 
ProcessCount : 43 
SystemCache : 263.734 pages 1.080.254.464 bytes 
ThreadCount : 1.038 

Après loding le nouveau patch, http://support.microsoft.com/kb/983583/en-us, version .NET change à 2.0.50727.3615 et Environment.WorkingSet retourne maintenant la valeur:. 2.047.468.141 (qui est de 80 octets plus grand que précédent)

Sur une machine Vista avec 3 Go de RAM, les valeurs Environment.WorkingSet et Process.WorkingSet sont similaires et se situent autour de 37 Mo. Par conséquent, pourquoi Environment.WorkingSet renvoie une valeur fixe?

Redémarrer le pool d'applications ne change rien, il renvoie toujours la même valeur magique, 2.047.468.061. J'ai également installé une application .NET 1.1.4322.2443, et étrangement WorkingSet est renvoyé un nombre à partir d'un ensemble aléatoire de nombres indépendants (193.654.824, 214.101.416, 57.207.080, 287.635.496) chaque fois La page est actualisée alors que GetProcessMemoryInfo() renvoie le nombre attendu.

J'ai également constaté que lorsque l'application exécutée en usurpant l'identité de "NT AUTHORITY \ NetworkService" ce problème ne se produit pas, Environment.WorkingSet renvoie le nombre attendu .NET v1.1 et v2.0.

J'ai vérifié CodeAccessPermissions comme EnvironmentPermission pour l'utilisateur windows et NetworkService mais je n'ai trouvé rien qui limite la lecture de la valeur WorkingSet.

Alors, qu'est-ce qui pourrait causer cela? Est-ce un bug, une configuration incorrecte ou un fichier corrompu, etc.?

+0

Pourquoi continuez-vous à poser les mêmes questions? http://stackoverflow.com/questions/3378874/environment-workingset-incorrectly-reports-memory-usage Et un autre, qui a probablement (et à juste titre) été fermé. – fletcher

+0

http://social.msdn.microsoft.com/Forums/fr/clr/thread/b8a50266-a34d-4a6d-8fc1-08c8fafbc78b – Will

+0

fletcher; pas exactement la même question, j'ai modifié avec de nouvelles conclusions. – lockedscope

Répondre

1

Environment.WorkingSet est une "estimation" par le CLR de l'espace mémoire nécessaire à votre application. Si votre application ne change pas (physiquement) alors elle devrait être la même valeur sur chaque chargement (je ne peux pas vérifier cela à 100%, mais cela devrait être assez correct pour continuer).

Il est toujours plus grand que ce qui est réellement nécessaire car il n'est pas sûr des branches de code requises, mais le système d'exploitation réduira la mémoire s'il voit qu'il n'est pas utilisé. Un bon exemple consiste à réduire l'application à la barre des tâches pour la réduire en taille.