Combien de SWAP donneriez-vous à une installation CentOS sur un double Quad Core XEON avec 16 Go de RAM qui va exécuter un site Web php avec un backend mysql - charge moyenne / lourde?
Combien de SWAP donneriez-vous à une installation CentOS sur un double Quad Core XEON avec 16 Go de RAM qui va exécuter un site Web php avec un backend mysql - charge moyenne / lourde?
Réponses:
Pas plus d'un concert ou deux - vous voulez un peu de swap disponible, juste au cas où et parce que cela aide les choses à fonctionner un peu mieux, mais si jamais vous arrivez au point où vous échangez beaucoup, la machine va être inutile - et dans une situation vraiment catastrophique, vous êtes en fait mieux avec un espace de swap plus petit, car alors vous déclencherez le tueur OOM plus tôt que tard.
Je m'excuse pour la très longue réponse. Je voulais mettre ces trucs dans un endroit accessible depuis un moment!
TLDR; Théoriquement, la réponse serait "probablement pas moins que la quantité totale de mémoire résidente que toutes vos applications veulent utiliser"
Je vais essayer de t'expliquer si tu restes avec moi ..
Un peu sur la mémoire virtuelle
Je pense qu'il y a une idée fausse courante ces jours-ci sur la valeur du swap et son objectif. Il est souvent considéré que l'échange est conçu comme une «banque de réserve» pour la mémoire lorsque vous manquez de mémoire. Oui, c'est en partie vrai, mais le noyau ne veut pas utiliser votre swap comme banque de réserve . De plus, le noyau ne veut jamais invoquer le disque pour obtenir les données que vous recherchez!
Dans l'espace d'application, il y a un certain nombre de choses que le noyau gardera en mémoire.
À des fins de gestion de la mémoire, l'allocation de mémoire est sauvegardée sous une forme ou une autre par un périphérique de prise en charge.
La mémoire sauvegardée sur fichier est une mémoire qui provient d'un fichier et sur un système d'exploitation classique constitue la grande majorité de l'allocation de mémoire sur le système. Il comprend des fichiers tels que des bibliothèques partagées qui ont été chargées, des fichiers lus sur le disque et stockés dans le cache de pages et des fichiers mmappés à partir du disque (en fait, le noyau ne fait aucune distinction de pages entre les fichiers dans le cache de pages et les fichiers mmappés comme essentiellement la même chose).
La grande chose à propos de cette mémoire du point de vue des noyaux est son jetable, c'est-à-dire qu'il devrait être possible de vider ces pages si vous avez besoin de la mémoire pour autre chose et c'est exactement ce que fait le cache de pages si la mémoire est soudainement une exigence.
La mémoire sauvegardée de façon anonyme est une autre affaire. La mémoire de cette région est anonyme car, bien qu'il n'y ait aucun fichier sur le disque qui contienne réellement ces données. Ceci est normalement composé de la pile d'application, du tas, de tout ce qui se trouve dans tmpfs et des données mmappées qui sont privées et ont été modifiées (car il ne peut pas synchroniser ce contenu sur le disque). Comme il n'y a tout simplement pas de fichier valide sur le système de fichiers pour réécrire ces pages si elles changent, la mémoire sauvegardée de manière anonyme est sauvegardée par le support d'échange.
Maintenant, le noyau sait que lorsque la mémoire est rare, il est beaucoup moins cher de supprimer la mémoire sauvegardée par fichier que la mémoire mappée de manière anonyme, c'est parce que les données anonymes ont beaucoup plus de chances d'être "sales" que les données sauvegardées par fichier, en fait par défaut le noyau évalue la mémoire sauvegardée de manière anonyme comme étant 80 fois plus précieuse que la mémoire sauvegardée sur fichier et c'est en fait ce que fait le modificateur swappiness sur linux (voir ce post ici si vous voulez savoir exactement ce que le paramètre swappiness modifie).
Le pire des cas
Le pire des cas quand un serveur devient incontrôlable et OOMing est basé sur le fait qu'il passe beaucoup trop de temps à gérer les demandes d'E / S qu'à honorer les demandes d'allocation de mémoire. Deux conditions peuvent invoquer ce critère.
Le premier est le problème généralement pensé. Autrement dit, étant donné qu'une grande partie de la mémoire se trouve à l'intérieur du swap, il faut remplacer la mémoire anonyme de la RAM, la remettre dans le swap, puis prendre quelque chose du swap et la mettre dans la vraie RAM. Cette opération est très coûteuse, ralentissant la machine au point où elle peut devenir une situation irrécupérable (car plus de choses font la queue pour les demandes de pages que ce qui peut être servi à partir des E / S).
Le second est moins pris en compte mais tout aussi important. Si vous allouez presque toute votre mémoire à des données d'application réelles - vous ne durerez pas longtemps. Presque toutes les applications dépendent de la lecture des fichiers du système de fichiers pour fonctionner, cela peut être dû au fait que certaines instructions vivent dans une bibliothèque partagée ou parce que vous devez lire /etc/resolv.conf pour un appel à la bibliothèque ou à toute autre fin. Il est tout à fait plausible d'arrêter un système d'exploitation - tout en disposant de suffisamment de mémoire pour s'adapter à toutes vos applications, mais puisque votre file d'attente demande tellement d'E / S, rien n'a une chance de se terminer correctement.
Ce que le noyau veut faire avec votre échange
Le noyau veut utiliser votre swap pour se débarrasser des pages qui gaspillent de la mémoire afin de pouvoir utiliser cette mémoire pour autre chose.
Fondamentalement, en fonctionnement normal, le noyau aime remplir agressivement le cache des pages avec des données lues sur le disque, ce qui signifie qu'il ne lira pas le disque pour les mêmes données. C'est une bonne conception et peut réduire considérablement les E / S. Maintenant, il se peut que vous ayez une application en mémoire qui dort pendant 3 jours, se réveille, fait beaucoup de travail puis dort encore 3 jours.
Ce que le noyau aimerait faire avec ces données, c'est de les échanger pour faire de la place pour l'activité du système de fichiers, car vous avez beaucoup plus de chances d'utiliser ces pages plus souvent que les pages que vous utilisez pour votre application. L'échange, dans ce sens, pourrait être une transaction de 16 Ko sur votre support d'échange que vous ne devriez pas ressentir, mais en retour, vous avez libéré 16 Ko de mémoire qui pourraient être utilisés pour stocker quatre fichiers de données.
Pour quoi le noyau ne veut pas utiliser le swap
Le noyau ne veut certainement pas utiliser votre swap pour allouer plus de mémoire anonyme en échangeant une autre mémoire anonyme, c'est la situation qui inquiète le plus et à juste titre.
Cependant, je dois souligner que si vous avez alloué tellement de mémoire que le noyau n'a pas d'autre choix que de le faire, c'est un problème de configuration des administrateurs système, pas du noyau lui-même - il essaie simplement de faire de son mieux par les options que vous lui avez données!
Si vous avez une énorme quantité de swap, augmentez-vous les chances de l'utiliser?
Non! Si vous avez 1G de RAM et 4G de swap, il n'y a pas 80% de chances que vos données soient échangées! Le noyau veut utiliser l'échange uniquement lorsque les pages en mémoire peuvent être mieux servies en faisant autre chose!
Est-il avantageux de ne pas utiliser du tout de swap
Je ne ferais jamais ça. L'échange permet à l'O / S de se débarrasser de la mémoire dont vous avez besoin mais n'est jamais utilisée. Si vous n'avez pas d'échange, vous avalez simplement de la mémoire que vous ne récupérerez jamais, pour laquelle vous pourriez voir une amélioration significative des performances en permettant, par exemple, au cache de page de l'avoir à la place.
Quel est le meilleur échange à avoir
En théorie, découvrez la quantité de mémoire résidente + 20% pour les sécurités comme les appels de bibliothèque entrants qui doivent allouer de la mémoire à partir du tas - puis définissez votre swap à ce montant. Cela permettrait (théoriquement de toute façon) au système d'exploitation d'échanger toute la mémoire anonyme s'il devait faire place à quelque chose de plus utile.
Si j'ai la possibilité pour le noyau d'échanger tout ce qui est dangereux, non?
N'oubliez pas que le noyau ne veut pas permuter pour faire place à une allocation de mémoire plus anonyme ici, il ne fera que permuter les pages non utilisées pour favoriser autre chose qui fera un meilleur usage de l'espace à la place.
Si vous échangez de la mémoire anon uniquement pour l'allouer à partir d'une mémoire plus anonyme, vous faites quelque chose de mal et avez besoin de plus de RAM ou de réaccorder votre pile d'applications de toute façon.
De combien de RAM auriez-vous besoin
Bien sûr, vous devez autoriser suffisamment de RAM pour exécuter toutes vos applications, mais vous devez probablement prévoir 2 Go de RAM supplémentaires pour que le cache de page se remplisse - peut-être plus. Le cache de page rend votre ordinateur beaucoup plus rapide et vos disques durent plus longtemps. Si vous envisagez d'exécuter un serveur Web, en avoir encore plus pour pagecache est une bonne idée en raison de la quantité considérable de contenu statique que vous pouvez récupérer et réutiliser à partir de pagecache qui serait servi (si le débit de votre serveur Web est de 5 Mo / s, vous n'avez vraiment pas voulez récupérer le contenu de 5 Mo / s que vous générez depuis votre disque!).
Que faire si vous ne faites vraiment pas confiance à Linux pour échanger correctement
Si vous êtes vraiment inquiet, vous pouvez allouer plus de mémoire que vous n'en avez:
Quelle est la meilleure façon de régler ma mémoire pour mon application
Le vendeur recommande une configuration différente.
Écoutez cela à la place. Certaines applications sont écrites de telle manière qu'elles invoquent délibérément le noyau pour que leurs pages soient actives sur toutes les autres. Pour être honnête, c'est une astuce désagréable, mais elle brise la capacité des noyaux à gérer de manière transparente la mémoire lorsqu'elle se produit. Si votre fournisseur vous donne des détails, il tombe probablement dans cette catégorie et écoute ce qu'il dit à la place.
En résumé
Le noyau fait généralement un très bon travail de gestion correcte de la mémoire virtuelle. C'est presque toujours le cas que votre application alloue plus de mémoire que vous ne pourriez espérer travailler et c'est ce qui cause un MOO.
Le swap était utilisé comme «mémoire de secours», mais ce n'est plus son objectif principal, alors ne pensez pas à l'utiliser comme ça. Au lieu de cela, sachez que votre noyau sait probablement mieux à quoi il veut utiliser votre mémoire. Donnez-lui de l'espace pour prendre ces décisions et vous bénéficierez d'une amélioration globale des performances.
Extrait du document "Oracle 10g Server on Red Hat® Enterprise Linux® 5 Deployment Recommendations".
Oracle fournit des recommandations génériques concernant la taille du swap dans la note MetaLink 169706.1. Ces recommandations peuvent conduire à la création d'un très grand espace de swap sur les systèmes avec une grande quantité de mémoire. Le très grand échange peut entraîner une dégradation importante des performances du système et peut être résolu en réduisant l'espace d'échange. Red Hat ne recommande pas d'allouer plus de 4 Go pour l'échange sur Red Hat Enterprise Linux 5.
Donc, pour 16 Go, vous ne devriez pas avoir plus de 4 Go de swap.
PS. Il convient également de noter que l'appel oom
est presque toujours meilleur qu'un processus de remplacement inutilisable utilisant une bande passante d'E / S entière.
Les recommandations actuelles de CentOS Swap utilisent la formule:
M = Amount of RAM in GB, and S = Amount of swap in GB, then
If M < 2
S = M *2
Else
S = M + 2
Donc, pour 16G, la quantité de swap devrait être de 18G.
Voir http://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-swapspace.html
D'après ce que je me souviens de la documentation Linux: Si votre RAM est supérieur à 2 Go, vous échangez = (ramSize + 2). Si c'est moins, vous échangez = (ramSize * 2)
J'ai trouvé ce document pour vous, il devrait vous aider à prendre cette décision, le voici: Qu'est-ce que Swap Space? , mais aucune des réponses ci-dessus n'est correcte
dd if=/dev/zero of=swap.file bs=1024 count=1048576; mkswap swap.file; swapon swap.file