Pourquoi Windows 2008 utilise-t-il l'échange avant que la mémoire ne soit pleine?

9

J'administre un serveur Windows 2008 (enfin, sur Amazon EC2) exécutant IIS et une application Web .NET4. J'ai reçu une alerte mémoire l'autre jour et je suis allé voir, et bien sûr, la mémoire du processus avait augmenté au fil du temps via une sorte de fuite lente. Il n'a pas augmenté de beaucoup, tout comme 60M à 200M, mais il se passait suffisamment d'autres choses avec la boîte pour dépasser notre seuil assez bas (75%) pour déclencher le moniteur.

J'ai recyclé le pool de l'application et la mémoire libérée, et j'ai remarqué en examinant les statistiques que l'espace d'échange était utilisé de manière significative et que plus de 1 Go était libéré avec ce recyclage.

C'est peut-être une question de base, mais je suis un gars UNIX et j'ai l'habitude d'échanger de ne pas m'habituer jusqu'à ce que vous soyez à court de mémoire. Cette boîte n'a jamais dépassé 75% d'utilisation de la mémoire. Est-ce une chose Windows ou une chose .NET ou une chose Amazon? Je soupçonne qu'il y a une fuite de mémoire beaucoup plus importante dans cette application que soupçonnée - elle ne fuit pas de 60M à 200M, elle fuit de 60M à 1,2GB, mais une grande partie de cela devient en quelque sorte "froide" et est poussée à échanger?

J'ai le recyclage de la mémoire défini sur le pool d'applications, mais cela déclenche la mémoire pleine de la boîte, donc cette application pourrait devenir vraiment très grosse avant de se recycler automatiquement.

Je pourrais mettre en place un recyclage "programmé" régulier, mais c'est une solution de contournement, je vais demander au développeur de réparer l'application, mais je dois comprendre ce qui se passe ici avec l'utilisation du swap pour m'assurer que je comprends bien.

Modifier avec plus d'informations: mémoire d'instance: 1,7 Go de swap: 4,5 Go

Je vois le processus w3wp.exe dans taskmgr montrant que la mémoire: 211 000k. Mais quand je l'ai redémarré (c'est dans son propre pool d'applications, et c'est la seule application sur la boîte), son utilisation de la mémoire est descendue à son point de départ normal de 60 Mo et comme 1 Go + de swap également libéré. Dans taskmgr, je venais d'avoir la mémoire habituelle (Private Working Set), mais j'ai vu le changement de swap via mon autre surveillance (Cloudkick). En y retournant et en regardant aujourd'hui, la mémoire est de retour à 195 M sur le processus (1,2 Go au total) et le swap est passé de 1,0 Go à 1,1 Go, il n'a pas été entièrement sauvegardé là où il était (graphique au fil du temps, c'est un fluage lent).

Je suis moins préoccupé par cette application spécifique et plus préoccupé par la simple compréhension du moment où Windows échange et comment il l'utilise, et de quoi s'inquiéter de la mémoire Windows et de l'utilisation des échanges en général.

Ernest Mueller
la source
4
BTW, au moins Linux va échanger des pages si elles ont opportuniste pas accédé depuis longtemps, même si le système est non rogné à proximité d'utiliser toute la mémoire disponible. Il le fait pour libérer de la mémoire pour le cache disque, les tampons, etc.
EEAA
De combien de mémoire cette instance dispose-t-elle? Êtes-vous en train de dire que le processus w3wp.exe atteint 1 Go? Est-ce le seul site fonctionnant dans ce pool d'applications?
Kev
@ KevΩ Ajouté plus d'informations dans le Q à votre demande.
Ernest Mueller
@ErikA, bon à savoir, je suppose que j'ai écouté les gars qui disent "si vous échangez, vous avez déjà des performances nulles, désactivez simplement le swap et ne manquez pas de RAM" donc je ne ' t regarder échanger autant.
Ernest Mueller
Si votre disque déborde sur le disque, c'est vrai. Si cela change, cela fait de la place pour les tampons et autres.
Bart Silverstrim

Réponses:

17

Windows et Linux ont deux stratégies de page / swap différentes.

Linux

Linux veut éviter d'utiliser du tout l'espace de swap et attend jusqu'au dernier moment possible. Si vous voyez une grande quantité de swap sous Linux, votre système est probablement ou était en difficulté. Cette stratégie est bonne pour minimiser les E / S globales du disque, qui est la partie la plus lente de votre système, mais plus faible pour les systèmes avec des périodes alternées de charge légère et lourde (et honnêtement, c'est la plupart d'entre nous). Les moments où votre charge est déjà lourde seront désormais alourdis par les E / S de disque "supplémentaires", ou, en d'autres termes, vous devez concevoir vos versions de serveur avec un œil pour avoir suffisamment de RAM que vous n'échangez pas même pendant le temps de chargement prévus les plus élevés.

les fenêtres

Windows souhaite traiter la mémoire comme un simple cache du fichier d'échange. Votre vraie mémoire est toujours sur le disque, mais elle lira / écrit dans le "cache" d'abord si elle le peut. Cette stratégie est bonne pour sortir votre charge au fil du temps; lorsque le système est occupé et doit échanger des pages, la page actuelle est déjà sur le disque et la moitié du travail est déjà terminée. Cette approche était très logique à l'époque où Windows était jeune, 32 Mo (oubliez le Go) était encore beaucoup de RAM, et le besoin fréquent d'utiliser l'espace de swap était évident. Même aujourd'hui, cela est bon pour les charges de travail qui alternent entre les charges légères et les charges occupées, car cela permet de répartir les E / S de disque plus uniformément dans le temps.

Les versions modernes de Windows ont des optimisations supplémentaires - telles que SuperFetch - pour précharger et préparer les pages de mémoire sur le disque et dans la RAM lorsque la charge est par ailleurs légère, pour éviter d'avoir à écrire des disques supplémentaires lors du premier chargement d'un programme. Tout cela signifie que vous pouvez concevoir votre système pour n'avoir besoin que de suffisamment de RAM pour quelque chose de moins que la charge attendue la plus élevée, de sorte que vous pouvez toujours avoir des performances au moins acceptables tout le temps, avec des coûts réduits.

Convergence

Ce concept de mesure ou de prévision de la charge dans un environnement de test d'abord, puis d'affectation des ressources de production lorsque la charge est connue est un développement relativement récent dans la construction de systèmes, rendu possible, ou du moins pratique, en partie avec l'avènement des serveurs virtuels puis cloud. . En fonction de votre charge, vous pouvez même concevoir le système de sorte qu'il n'a jamais besoin de changer du tout. Dans ces cas, Windows vous permet de désactiver la pagination et de se comporter davantage comme un système Linux. Cependant, vous devez être prudent; si la conception de votre système nécessite plus de mémoire que prévu, vous pouvez vous retrouver ainsi dans le pétrin.

D'un autre côté, les noyaux Linux modernes sont plus disposés à passer au disque de manière opportuniste qu'ils ne l'étaient autrefois. Ainsi, la différence dans les stratégies de gestion de la mémoire entre les deux systèmes est toujours présente, mais maintenant moins distincte qu'auparavant. Les deux systèmes ont leurs mérites, et chacun surveille l'autre pour voir quelles avancées ils peuvent copier.

Joel Coel
la source
Très spécifique sur la stratégie de fin de Windows, merci! Également validé par cette base de connaissances Microsoft, j'ai trouvé ... support.microsoft.com/kb/2267427
Ernest Mueller
1
Linux n'attend pas nécessairement le dernier moment possible, sauf si vous définissez explicitement vm.swappiness = 0. À la valeur par défaut 60, il permutera les pages qui n'ont pas été touchées depuis un certain temps.
Kjetil Joergensen
@KjetilJoergensen assurez-vous de lire la dernière section sur la convergence.
Joel Coel
1
@JoelCoel Je retire sans réserve mes critiques :)
Kjetil Joergensen
7

Windows (et Linux et autres systèmes d'exploitation similaires à Unix) déplacera les pages qui n'ont pas été utilisées depuis un certain temps sur le disque pour faire de la place aux tampons et au cache pour accélérer l'activité d'E / S active. De plus, les applications allouent souvent plus de mémoire qu'elles n'en utiliseront immédiatement - cela peut encourager le noyau à paginer certaines choses qui n'ont pas été récemment touchées en arrière-plan, de sorte que lesdites applications ne voient pas le délai de pagination lorsqu'elles démarrent soudainement. en utilisant cette allocation.

Sous Linux, vous pouvez modifier (ou bloquer) ce comportement en modifiant les valeurs de "permutation" pertinentes dans le /procsystème de fichiers - sans aucun doute, il existe des valeurs de registre que vous pouvez modifier pour modifier le comportement de Windows à cet égard également.

Une autre chose à savoir est que lorsque quelque chose a été paginé et relu plus tard, le noyau ne le supprimera pas du fichier de page tant que le fichier n'est pas plein ou que la page de la RAM n'est pas modifiée. De cette façon, s'il doit à nouveau paginer cette partie, il peut le faire sans avoir à écrire les pages sur le disque: le contenu est déjà là. Cela peut améliorer considérablement les performances dans les situations où la sur-validation de la mémoire est devenue si mauvaise qu'elle peut provoquer le débordement des fichiers de page (un nombre important de pages sont constamment mappées en entrée et en sortie). Vous constaterez probablement que certaines données ont été expulsées par cette fuite de mémoire et ont depuis été relues mais pas effacées du disque au cas où ces pages devraient être mappées ou de la RAM pour faire de la place plus tard. Sous Linux, la valeur "SwapCached" dans/proc/meminfoindique la quantité de données présentes dans les pages qui ont des copies identiques en RAM et sur disque. Windows utilise sans aucun doute la même optimisation (ou quelque chose de similaire), mais je ne suis pas exactement où chercher pour voir à quel point cela se produit (sans aucun doute, il existe des compteurs de moniteur de performances pertinents que vous pouvez interroger).

tl; dr: C'est normal. Un noyau de système d'exploitation moderne essaiera d'être intelligent et maximisera la quantité de RAM qu'il peut utiliser comme cache pour enregistrer les opérations d'E / S, et aura parfois des données copiées sur le disque et en RAM pour enregistrer les E / S s'il a besoin de paginer ces bits. de RAM plus tard. Il est fort contre-intuitif que cela puisse être, que cette utilisation des fichiers d'échange de ces deux manières, même si vous n'êtes pas actuellement faible en RAM, améliore vos performances globales plutôt que de les diminuer.

David Spillett
la source