Augmentation constante de la taille du swap sous Linux et de l'espace de swap non récupéré?

10

J'ai une boîte linux RAM de 8 Go sur laquelle 4 serveurs tomcat fonctionnent. L'un d'eux est défini sur une mémoire de 3000 Mo (jvm -Xms et -Xmx) et d'autres sur 1500 Mo. La partition de swap est également définie sur 8 Go. Lorsque je démarre ces serveurs, l'utilisation du fichier d'échange est faible. Mais sur une période de jours et pendant certaines périodes où l'un / tous les serveurs sont en activité maximale, l'utilisation du swap commence à augmenter. Voici une sortie sar -r typique.

kbmemfree kbmemused% memused kbbuffers kbcached kbswpfree kbswpused % swpused kbswpcad

48260 8125832 99,41 196440 2761852 7197688 1190912 14,20 316044

75504 8098588 99,08 198032 2399460 7197688 1190912 14,20 316032

Il montre un échange de 14,2% utilisé actuellement. Le plus drôle, c'est que% ne diminue JAMAIS . Il continue d'augmenter et atteint jusqu'à 30-40% . Nous redémarrons nos serveurs chaque semaine.

Je suppose que le % swpused augmente pendant les périodes d'activité maximale et diminue pendant les périodes de faible activité .. Ou au moins reste constant. Il semble que l'espace d'échange ne soit jamais récupéré par le système d'exploitation.

Sortie de free: free -m total des buffers partagés libres utilisés mis en cache Mem: 7982 7937 45 0 32 2088 - / + buffers / cache: 5816 2166 Swap: 8191 1163 7028

Il y a donc au moins 2g de Ram gratuit. La question est donc de savoir pourquoi l'espace de swap continue d'augmenter et n'est pas récupéré par le système d'exploitation? Ou comment déboguer cela pour comprendre ce qui se passe ..

Zenil
la source

Réponses:

12

Si les informations sont échangées sur le disque et lues ultérieurement en mémoire, elles sont souvent laissées allouées dans la zone de swap jusqu'à ce que l'espace de swap soit faible. Cela signifie que si les mêmes informations doivent être échangées à nouveau plus tard et n'ont pas changé, le système d'exploitation peut simplement supprimer les pages de la RAM allouée sans avoir à écrire quoi que ce soit sur le temps d'économie de disque.

Le swap alloué aux éléments lus en mémoire sera libéré soit

  1. lorsque les pages pertinentes ne sont plus du tout nécessaires (c'est-à-dire qu'elles sont libérées par l'application)
  2. lorsque les pages concernées sont modifiées (de sorte que la copie sur le disque n'est plus à jour)
  3. la machine manque d'espace de swap donc efface certaines choses qui sont déjà dans la RAM pour faire de la place

Recherchez /proc/meminfoune ligne appelée "SwapCached". Cette entrée compte les pages qui se trouvent à la fois dans la RAM et dans les partitions de swap. Par exemple, en choisissant une petite machine virtuelle au hasard, le /proc/meminfofichier virtuel de l'une de mes machines virtuelles affiche:

SwapTotal:        698816 kB
SwapFree:         624520 kB
SwapCached:        17232 kB

indiquant que 74268 Ko d'espace de swap sont alloués, mais que 17232 Ko de ces pages sont également actuellement mappés dans la RAM (donc pourraient être désalloués du swap à tout moment si l'espace est nécessaire par autre chose).

Il y aura également sans aucun doute des pages qui y ont été échangées il y a longtemps et qui n'ont jamais été réutilisées depuis. Le noyau ne rechargera pas les pages du swap simplement parce qu'il y a de la RAM libre pour le lire car cette RAM libre pourrait être mieux utilisée pour le cache ou les tampons - les pages écrites pour le swap ne sont généralement relues que lorsqu'elles sont nécessaires.

Si vous voulez effacer ce qui est en swap, tant que vous avez suffisamment de libre et / ou de freeable (c'est-à-dire free + cache + buffers (moins les parties des comptes c + b qui ne sont pas freeable RightThisInstant)), tournez-le simplement éteindre et rallumer avec swapoff -a && swapon -a.

Bien sûr, vous pouvez également avoir une fuite de mémoire quelque part, mais ce n'est pas la seule explication du comportement que vous voyez.

David Spillett
la source
Excellente réponse. Merci. Donc, mon système affiche actuellement SwapTotal: 8388600 kB SwapFree: 7197688 kB SwapCached: 595724 kB So Real Swap Free = 7197688 + 595724 = 7793412. Actul Swap Used = 8388600 - 7793412 = 595188 == 581MB. Je suppose que 581 Mo d'utilisation du fichier d'échange sont raisonnables pour un système de 8 Go avec 4 applications en cours d'exécution. Permettez-moi de surveiller cela pendant les deux prochains jours et de voir si le chiffre swapCached continue d'augmenter proportionnellement au% swapUsed.
Zenil
2

Fondamentalement, vous n'avez pas besoin de vous en soucier. Ce qui est important de savoir, c'est combien IO va au swap (jetez un œil à la commande 'vmstat'). Avoir plus de choses dans le swap ne coûte rien. Le seul coût est de mettre des trucs dans le swap (page en entrée) ou de les retirer (page en sortie). Il est donc parfaitement raisonnable que le système d'exploitation laisse le swap se développer.

Guillaume
la source
1
Il est important de savoir pourquoi le swap augmente et ne diminue jamais. Et si nous permettons à nos serveurs de continuer à fonctionner pendant des semaines? L'échange va-t-il dépasser la limite et entraîner des problèmes de mémoire? Le swapin / swapout semble "raisonnable" .. Pendant les périodes d'activité maximale, il y a un taux de swapin / swapout élevé (et aussi des augmentations de% swapused) .. Pendant les périodes normales, le swapin / swapout est minime mais le% swapused ne diminue pas
Zenil
0

tant que vous avez de l'espace de swap disponible, il n'est pas nécessaire que le système d'exploitation libère de l'espace de swap. Il sera libéré lorsqu'il n'y aura plus d'espace. Mais quand vous vous trouvez dans cette situation, vous avez définitivement un problème.

Christian
la source
0

Il n'y a aucun moyen de savoir si cela deviendra éventuellement un problème, sauf si vous exécutez un serveur suffisamment longtemps pour voir s'il devient un problème.

Fondamentalement, le système d'exploitation échangera des éléments qui ne sont pas utilisés pour garder de la mémoire libre à tout moment, au cas où un nouveau programme serait lancé. L'espace de swap ne sera pas libéré tant qu'il ne sera pas nécessaire, ce qui signifie que vous pouvez utiliser 100% d'espace de swap sans aucun problème de performances. La chose à se soucier est de savoir si cela est causé par une fuite de mémoire. Ce n'est pas nécessairement une fuite de mémoire, mais cela pourrait l'être.

Java n'est pas sujet aux fuites de mémoire, mais cela peut arriver avec des applications compliquées en particulier.

Joshua Nurczyk
la source