web-dev-qa-db-fra.com

Dois-je craindre que le swap soit utilisé sur un hôte avec près de 40 Go de mémoire libre?

J'ai un hôte de production ci-dessous:

htop

Le système utilise 1 Go de swap, tout en conservant près de 40 Go d'espace mémoire libre et inutilisé. Dois-je m'inquiéter à ce sujet, ou est-ce généralement normal?

40
MrDuk

Ce n'est pas un problème et c'est probablement normal. Beaucoup de code (et éventuellement de données) est utilisé très rarement, le système le remplacera donc pour libérer de la mémoire.

L'échange n'est généralement un problème que si la mémoire est permutée vers l'intérieur et vers l'extérieur de façon continue. C'est ce genre d'activité qui tue les performances et suggère un problème ailleurs sur le système.

Si vous souhaitez surveiller votre activité de swap, vous pouvez le faire avec plusieurs utilitaires mais vmstat est généralement très utile, par exemple.

$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 348256  73540 274600    0    0     1     9    9    6  2  0 98  0  0
 0  0      0 348240  73544 274620    0    0     0    16   28   26  0  0 100  0  0
 0  0      0 348240  73544 274620    0    0     0     0   29   33  0  0 100  0  0
 0  0      0 348240  73544 274620    0    0     0     0   21   23  0  0 100  0  0
 0  0      0 348240  73544 274620    0    0     0     0   24   26  0  0 100  0  0
 0  0      0 348240  73544 274620    0    0     0     0   23   23  0  0 100  0  0

Ignorez la première ligne car c'est une activité depuis le démarrage du système. Notez les colonnes si et so sous ---swap--; ils devraient généralement être des chiffres assez petits sinon 0 pour la majorité du temps.

Il convient également de mentionner que cet échange préemptif peut être contrôlé avec un paramètre du noyau. Le fichier à /proc/sys/vm/swappiness contient un nombre compris entre 0 et 100 qui indique au noyau comment agressivement échanger de la mémoire. Cat le fichier pour voir ce que cela est défini. Par défaut, la plupart des distributions Linux par défaut à 60, mais si vous ne voulez voir aucun échange avant que la mémoire ne soit épuisée, faites écho un 0 dans le fichier comme ceci:

echo 0 >/proc/sys/vm/swappiness

Cela peut être rendu permanent en ajoutant

vm.swappiness = 0

à /etc/sysctl.conf.

68
user9517

Linux écrira préventivement les pages sur le disque s'il n'a rien de mieux à faire. Cela ne signifie pas pas qu'il expulsera ces pages de la mémoire, cependant. C'est juste que dans le cas où doit expulser ces pages dans le futur, il n'est pas nécessaire d'attendre qu'elles soient écrites sur le disque, car elles sont déjà là.

Après tout, la raison pour laquelle vous manquez de mémoire est probablement parce que votre machine travaille déjà dur, vous ne voulez pas le surcharger en échange. Mieux vaut faire l'échange lorsque la machine ne fait rien.

Pour une raison similaire, votre mémoire doit toujours être pleine. Pages mémoire, cache du système de fichiers, tmpfs, il y a tellement de choses qui peuvent être conservées en mémoire. Vraiment, vous devriez vous inquiéter si votre mémoire est vide; après tout, vous avez payé beaucoup d'argent pour cela (au moins par rapport à la même quantité d'espace disque), alors il vaut mieux l'utiliser!

25
Jörg W Mittag

Le swap utilisé n'est pas mauvais, mais beaucoup d'activités de swap sont

  vmstat 1
  procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
  6  0 521040 114564   6688 377308    8   13   639   173    0 1100  5  4 90  0
  1  0 521040 114964   6688 377448    0    0   256     0    0 1826  3  4 94  0
  0  0 521040 115956   6688 377448    0    0     0     0    0 1182  7  3 90  0
  0  0 521036 115992   6688 377448    4    0    16     0    0 1154 10  2 88  0
  3  0 521036 114628   6696 377640    0    0   928   224    0 1503 15 17 67  1

La colonne swapd ne pose aucun problème. Les valeurs non nulles dans les colonnes si et so sont mortelles pour les performances du serveur. Surtout ceux avec beaucoup de RAM.

Il est préférable de désactiver le swapinness sur les machines avec plusieurs Go de RAM:

sysctl -w vm.swappiness=0

Cela ne désactivera pas le swap. Il ne demandera à Linux d'utiliser le swap qu'en dernier recours. Cela gaspillera quelques Mo de programmes qui n'ont pas besoin d'être dans la RAM ... Mais il est préférable d'échanger les ballons gonflés de vos files d'attente d'accès au disque.

Edit 1: pourquoi la valeur par défaut de swappiness n'est pas optimale

Nous nous sommes souvenus il y a deux décennies, un grand 486 n'avait que 32 Mo de RAM. Les algorithmes de swap ont été développés lorsque l'ensemble RAM pouvait être déplacé vers le disque en une petite fraction de seconde. Même avec les disques les plus lents de cette époque. C'est pourquoi les stratégies de swap par défaut sont si agressives. = RAM était le goulot d'étranglement ces jours-ci. Depuis lors, RAM la taille a augmenté de plus de 10 000 fois et les vitesses de disque moins de 10 fois. Cela a fait passer le goulot d'étranglement à la bande passante du disque).

Edit 2: pourquoi si si l'activité est mortelle pour les serveurs?

Si et so activité sur des machines avec des tonnes de RAM est mortel car cela signifie que le système se bat avec lui-même pour la RAM. Ce qui se passe est que les disques, même les gros stockages sont trop lents par rapport aux RAM. Le swap agressif favorise le cache du disque du noyau sur les données d'application et est la source la plus courante de lutte pour la RAM. Puisque le système d'exploitation devra libérer le cache du disque tous les si, le temps de vie du cache supplémentaire fourni par l'échange est trop court pour être utile de toute façon. Le résultat est que vous utilisez la bande passante du disque pour stocker le cache qui ne sera probablement pas utilisé et interrompez vos programmes en attendant le - si pages, ce qui signifie qu'il consomme beaucoup de ressources critiques avec peu ou pas d'avantages pour les applications.

Notez le titre de la réponse "beaucoup d'activité de swap sur des serveurs avec beaucoup de RAM". Cela ne s'applique pas aux machines avec une activité si et si occasionnelle. Cela pourrait ne pas s'appliquer à l'avenir si des algorithmes de swap plus intelligents sont développés dans les systèmes d'exploitation.

Edit 3: pages "froides"

Les gens romancent l'algorithme d'échange. Certains disent "cela prend moins de pages utilisées de la RAM", mais ce n'est pas du tout ce que fait le noyau. La chose est difficile à comprendre à propos du swap, c'est que le noyau ne sait pas ce qu'est une "page froide". Le noyau n'a pas une bonne métrique pour déterminer si la page est utilisée ou susceptible d'être utilisée dans un avenir proche. Pour contourner le fait que le noyau place les pages dans le swap de manière plus ou moins aléatoire et que les pages qui ne sont pas nécessaires y restent. Le problème de cet algorithme est que les pages doivent aller au swap pour savoir si les applications en ont besoin. Et cela signifie que beaucoup de pages "chaudes" iront au swap. Le problème, c'est que les disques sont trop lents par rapport à la RAM. La conséquence de cela est que lorsque le swap démarre, toutes les applications obtiennent des pauses aléatoires en attente des disques, ce qui entrave la latence et le débit.

J'ai construit ma propre référence qui est un scénario réaliste très commun à de nombreuses applications avec un volume décent. De mes tests, je n'ai vu aucun avantage sur le débit ou la latence lorsque les swaps sont en cours d'utilisation. Loin de là. Lorsque le swap démarre, il ralentit le débit et la latence d'au moins un ordre de grandeur.

Je vais un peu plus loin: je comprends que le swap n'est pas destiné au traitement. Les échanges sont uniquement destinés aux urgences. Ces moments où trop d'applications s'exécutent en même temps et vous obtenez un pic de mémoire. Sans échange, cela entraînerait des erreurs de mémoire insuffisante. Je considère l'utilisation du swap comme un échec des équipes de développement et de production. C'est juste une opinion qui va bien au-delà de ce dont nous avons discuté ici, mais c'est ce que je pense. Bien sûr, mes applications ont une excellente gestion de la mémoire par elles-mêmes.

11
Lucas

Ce n'est pas une réponse à votre question; mais plutôt des informations supplémentaires pour vous aider à prendre une décision éclairée.

Si vous souhaitez savoir quels processus utilisent spécifiquement la quantité de swap, voici un petit script Shell:

#!/bin/bash

set -o posix
set -u

OVERALL=0
for DIR in `find /proc/ -maxdepth 1 -type d -regex "^/proc/[0-9]+"` ; do
  PID=`echo $DIR | cut -d / -f 3`
  PROGNAME=`ps -p $PID -o comm --no-headers`

  SUM=0
  for SWAP in `grep Swap $DIR/smaps 2>/dev/null| awk '{ print $2 }'` ; do
    let SUM=$SUM+$SWAP
  done
  echo "PID=$PID - Swap used: $SUM - ($PROGNAME )"

  let OVERALL=$OVERALL+$SUM
done
echo "Overall swap used: $OVERALL"

Je dois également ajouter que tmpfs sera également remplacé. Ceci est plus courant sur les systèmes Linux modernes utilisant systemd qui créent des superpositions d'espace utilisateur/tmp à l'aide de tmpfs.

8
Aaron

J'ai remarqué que la réplication de MySQL Cluster ralentit ou échoue lorsque les agents changent fortement. Peut-être que certaines applications ne dérangent pas ou même bénéficient d'un échange, mais les bases de données semblent vraiment en souffrir. Cependant, de nombreuses discussions que j'ai vues sur les forums discutent de l'échange décontextualisé de la discussion sur la charge de travail spécifique.

Dans le monde DBA, le consensus semble être que "Il est de bon sens que lorsque vous exécutez MySQL (ou vraiment tout autre SGBD), vous ne voulez pas voir d'E/S dans votre espace de swap. innodb_buffer_pool_size dans le cas de MySQL) est une pratique standard pour s'assurer qu'il y a suffisamment de mémoire libre pour que l'échange ne soit pas nécessaire.

Mais que se passe-t-il si vous faites une erreur ou une erreur de calcul et qu'un échange se produit? Quel impact cela a-t-il vraiment sur les performances? C'est exactement ce que j'ai décidé d'enquêter. "

J'espère que les lecteurs trouveront les liens suivants à propos.

https://www.percona.com/blog/2017/01/13/impact-of-swapping-on-mysql-performance/

https://www.percona.com/blog/2010/01/18/why-swapping-is-bad-for-mysql-performance/

0
Ross Nesbitt