web-dev-qa-db-fra.com

Pourquoi l'échange est utilisé lorsque beaucoup de mémoire libre est laissée?

J'ai un très bon serveur Web (dédié) avec de bonnes ressources de mémoire:

System information
Server load     2.19 (8 CPUs)   
Memory Used     29.53% (4,804,144 of 16,267,652)    
Swap Used   10.52% (220,612 of 2,097,136)   

Comme vous pouvez le constater, mon serveur utilise Swap lorsqu'il y a beaucoup de mémoire libre disponible.

est-ce normal ou y a-t-il quelque chose qui ne va pas avec la configuration ou le codage?

N.b.
[.____] Mon processus MySQL utilise plus de 160% de la puissance de la CPU pour une raison quelconque; Je ne sais pas pourquoi, mais je n'ai pas plus de 70 utilisateurs simultanés ...

36
user1179459

C'est parfaitement normal.

Au démarrage du système, un certain nombre de services commencent. Ces services initialisent eux-mêmes, lisez dans les fichiers de configuration, créent des structures de données, etc. Ils utilisent une certaine mémoire. Beaucoup de ces services ne seront plus jamais exécutés pendant toute la durée du système, car vous ne les utilisez pas. Certains d'entre eux peuvent courir en heures, jours ou semaines. Pourtant, toutes ces données sont en mémoire physique.

Bien sûr, le système ne peut pas jeter ces données. Il ne peut pas prouver que cela ne sera littéralement jamais accessible. L'un de ces services, par exemple, pourrait être celui qui vous fournit un accès à distance à la boîte. Vous ne l'auriez peut-être pas utilisé dans une semaine, mais si vous l'utilisez, cela ferait mieux de travailler.

Mais le système sait qu'il pourrait aimer utiliser cette mémoire physique pour des choses comme un cache de disque ou d'une autre manière qui améliorera les performances. Donc, il fait un échange opportuniste. Quand il n'a rien de mieux à faire, il écrit des données qui n'ont pas été utilisées très longtemps sur le disque, en utilisant l'espace d'échange. Cependant, il conserve toujours les pages en mémoire physique. Donc, ils peuvent toujours être accessibles sans avoir à les échanger.

Maintenant, si le système a besoin ultérieur de cette mémoire physique pour autre chose, cela peut simplement jeter ces pages, car elle les a déjà écrites pour échanger. Cela donne au système le meilleur des deux mondes. Les données sont toujours conservées en mémoire. Il est donc possible d'y accéder sans avoir à le lire à partir du disque. Mais si le système a besoin de cette mémoire à un autre but, il n'aura pas à l'écrire en premier. Grande victoire tout autour.

62
David Schwartz

Vous pouvez également modifier ce comportement par sysctl -w vm.swappiness=10, qui réduira grandement l'utilisation de l'échange jusqu'à ce qu'il soit effectivement nécessaire.

Quant à MySQL, avez-vous au moins effectué un test de configuration de base à l'aide du script TUNING-PRIMER.SH ?

3
Daemon of Chaos

Ceci est probablement, comme l'expliquait David, un comportement normal du noyau Linux, mais cela peut également être un problème MySQL "Swap Insanity" . Dans votre cas (8 CPU, 16 GB RAM Total, 5 Go utilisée), pour cela, votre ordinateur doit être un système NUMA avec 4 nœuds (sockets) et 4 Go de RAM par nœud et un bassin tampon MySQL InnoDB de 4 Go.

En bref (vous devriez lire le lien ci-dessus pour des détails complets), c'est ce qui se passe:

  1. Lorsque votre système démarre, les processus sont répartis sur tous les nœuds numa en utilisant une partie de leur mémoire.
  2. Lorsque MySQL démarre, il alloue 4 Go pour le pool tampon InnoDb, remplissant le RAM d'un nœud numa et en utilisant certains RAM sur d'autres nœuds.
  3. Ensuite, le noyau Linux, qui ne peut pas déplacer alloué RAM d'un nœud numa à un autre, pense qu'il est judicieux d'échanger des pages du nœud affamé (ou de swaper des pages d'échange car les pages doivent être échangées. dans).

Pour éviter cela, modifiez l'allocation de mémoire pour MySQL pour allouer RAM sur tous les noyaux (voir le lien ci-dessus pour plus de détails).

1
jfg956