Combien de SWAP accorderiez-vous à une installation CentOS sur un XEON double Quad Core avec 16 Go de RAM qui va faire tourner un site web php avec un backend mysql - charge moyenne/lourde ?
Réponses
Trop de publicités?Pas plus d'un giga ou deux - vous voulez un peu d'espace de pagination disponible, juste au cas où et parce que cela aide les choses à fonctionner un peu mieux, mais si vous en arrivez au point où vous faites beaucoup de pagination, la machine va être inutile - et dans une situation vraiment catastrophique, vous êtes en fait mieux avec un espace de pagination plus petit, parce qu'alors vous déclencherez le tueur OOM plus tôt que plus tard.
Je m'excuse pour cette très longue réponse. Cela fait un moment que j'ai envie de mettre tout ça dans un endroit accessible !
TLDR ; En théorie, 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 de mémoire virtuelle
J'ai l'impression qu'il existe aujourd'hui un malentendu sur la valeur du swap et son utilité. On considère souvent que le swap est une "banque de réserve" pour la mémoire lorsque celle-ci est insuffisante. Oui, c'est en partie vrai, mais le kernel ne veut pas utiliser votre swap comme une banque de réserve . En outre, 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 va garder en mémoire.
- Données du fichier mappé.
- systèmes de fichiers tmpfs.
- Mémoire brute de l'application allouée au moment de l'exécution.
- Le code de l'application (comme ce qui se trouve dans le segment de données des formats ELF).
- Données de fichiers privés.
Dans le cadre de la gestion de la mémoire, l'allocation de la mémoire est soutenu par sous une forme ou une autre par un dispositif de soutien.
Fichier sauvegardé La mémoire est la mémoire qui provient d'un fichier et qui, sur un système d'exploitation typique, constitue la grande majorité de l'allocation de mémoire sur le système. Elle comprend des fichiers tels que les bibliothèques partagées qui ont été chargées, les fichiers lus depuis le disque et stockés dans le cache de page et les fichiers mis en mémoire depuis le disque (en fait, le noyau ne fait aucune distinction de pages entre les fichiers dans le cache de page et les fichiers mis en mémoire car il s'agit essentiellement de la même chose).
L'avantage de cette mémoire du point de vue du noyau est qu'elle est jetable, c'est-à-dire qu'il devrait être possible de se débarrasser de ces pages si vous avez besoin de la mémoire pour autre chose et c'est exactement ce que fait le cache des pages si la mémoire est soudainement requise.
Soutenu anonymement La mémoire est une autre affaire. La mémoire de cette région est anonyme parce que, eh bien, il n'y a pas de fichier sur le disque qui contient réellement ces données. Elle est normalement constituée de la pile de l'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 (puisqu'il est impossible de synchroniser ces données sur le disque). Comme il n'y a pas de fichier valide sur le système de fichiers pour réécrire ces pages si elles sont modifiées, la mémoire anonyme est soutenue par le média swap.
Maintenant, le noyau sait que lorsque la mémoire est rare, il est beaucoup moins cher de se débarrasser de la mémoire sauvegardée dans un fichier que de la mémoire mappée anonymement, parce que les données anonymes ont beaucoup plus de chances d'être "sales" que les données sauvegardées dans un fichier, en fait, par défaut, le noyau évalue la mémoire sauvegardée anonymement comme étant 80 fois plus précieuse que la mémoire sauvegardée dans un fichier et c'est en fait ce que fait le modificateur de swappiness sous Linux (voir ce post aquí si vous voulez savoir ce que le paramètre de permutation modifie exactement).
Le pire des scénarios
Le pire des scénarios lorsqu'il s'agit d'un serveur qui devient incontrôlable et d'un OOMing est basé sur le fait qu'il passe beaucoup trop de temps à traiter les demandes d'E/S qu'à honorer les demandes d'allocation de mémoire. Il y a deux conditions qui peuvent invoquer ce critère.
- L'échange permanent de mémoire anonyme pour aller chercher les pages demandées ou allouer plus de pages à une application.
- Vous passez trop de temps à aller chercher des données sur le disque parce qu'elles ne sont pas en mémoire pour exécuter les processus qui ont besoin de temps CPU.
Le premier est le problème auquel on pense généralement. En effet, comme une grande partie de la mémoire se trouve dans le swap, il faut échanger de la mémoire anonyme hors de la RAM, la remettre dans le swap, puis prendre quelque chose du swap et le mettre dans la vraie RAM. Cette opération est très coûteuse, ralentissant la machine jusqu'au point où elle peut devenir une situation irrécupérable (car plus de choses sont en attente de demandes de pages que ce qui peut être servi par les E/S).
La seconde est moins considérée mais tout aussi importante. Si vous allouez presque toute votre mémoire aux données réelles de l'application, vous ne ferez pas long feu. Presque toutes les applications ont besoin de lire des fichiers du système de fichiers pour fonctionner, que ce soit parce que certaines instructions se trouvent dans une bibliothèque partagée ou parce que vous avez besoin de lire /etc/resolv.conf pour un appel de bibliothèque, ou tout autre but. Il est tout à fait plausible d'arrêter un système d'exploitation - tout en ayant assez de mémoire pour toutes vos applications, mais puisque vous mettez en file d'attente tant de demandes d'E/S, rien n'a une chance de se terminer correctement.
Ce que le noyau veut faire avec votre swap
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.
En gros, en fonctionnement normal, le noyau aime remplir agressivement le cache des pages avec les 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 cela peut réduire massivement les E/S. Maintenant, il se peut que vous ayez une application en mémoire qui dort pendant 3 jours, se réveille, fait un tas de travail puis dort encore 3 jours.
Ce que le noyau aimerait faire avec ces données, c'est les échanger pour faire de la place pour l'activité du système de fichiers, puisque vous avez beaucoup plus de chances d'utiliser ces pages plus souvent que celles que vous utilisez pour votre application. L'échange, dans ce sens, pourrait être une transaction de 16kb vers votre média d'échange que vous devriez à peine ressentir, mais en retour vous avez libéré 16kb de mémoire que les utilisateurs de l'application peuvent utiliser. pourrait être utilisé pour stocker quatre fichiers de données.
Ce 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 swappant une autre mémoire anonyme, c'est la situation qui inquiète le plus les gens et à juste titre.
Cependant, je dois préciser que si vous avez alloué tellement de mémoire que le noyau n'a pas d'autre choix que de faire cela, il s'agit d'un problème de configuration des administrateurs système, et non du noyau lui-même -- il essaie simplement de faire au mieux avec les options que vous lui avez données !
Si vous disposez d'une grande 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 chance que vos données soient swappées ! Le noyau veut utiliser le swap seulement quand les pages en mémoire peuvent être mieux servies en faisant autre chose !
Est-il avantageux de ne pas utiliser le swap du tout ?
Je ne ferais jamais ça. La permutation permet au système d'exploitation de se débarrasser de la mémoire dont vous avez besoin mais qui n'est jamais utilisée. Si vous n'avez pas de swap, vous ne faites qu'avaler de la mémoire que vous ne récupérerez jamais, pour laquelle vous pourriez voir une amélioration significative des performances en autorisant, par exemple, le cache de page à l'avoir à la place.
Quel est le meilleur échange à avoir ?
En théorie, déterminez la quantité de mémoire résidente +20% pour les sécurités comme les appels de bibliothèque réentrants qui doivent allouer de la mémoire depuis le tas - puis fixez votre swap à cette quantité. Cela permettrait (théoriquement en tout cas) au système d'exploitation d'échanger toute la mémoire anonyme s'il le devait pour faire place à quelque chose de plus utile.
Si j'ai l'occasion de tout changer, c'est dangereux, non ?
Rappelez-vous, le noyau ne veut pas échanger pour faire place à une allocation de mémoire plus anonyme ici, il n'échangera jamais les pages non utilisées pour favoriser quelque chose d'autre qui fera un meilleur usage de l'espace à la place.
Si vous échangez de la mémoire anonyme uniquement pour allouer de la mémoire anonyme supplémentaire, vous faites quelque chose de mal et vous avez besoin de plus de RAM ou de réajuster votre pile d'application de toute façon.
De combien de RAM avez-vous besoin ?
Vous devez bien sûr prévoir suffisamment de RAM pour exécuter toutes vos applications, mais vous devriez probablement prévoir 2G de RAM supplémentaires pour le remplissage du cache de page, voire plus. Le cache de pages rend votre ordinateur beaucoup plus rapide et vos disques durent plus longtemps. Si vous envisagez de faire tourner un serveur web, il est judicieux d'en avoir encore plus pour le cache de pages, en raison de la quantité de contenu statique que vous pouvez récupérer et réutiliser à partir du cache de pages et qui serait servi (si le débit de votre serveur web est de 5 mb/s, vous n'avez pas vraiment envie de récupérer ces 5 mb/s de contenu que vous générez sur votre disque après tout !)
Que faire si vous n'avez vraiment pas confiance en linux pour faire un échange correct ?
Si vous êtes vraiment inquiet, vous pouvez allouer plus de mémoire que vous n'en avez :
- Fixez le montant de votre échange de façon à ce qu'il ne soit pas supérieur à votre RAM.
- Définir /proc/sys/vm/overcommit_memory à 2
- Définissez /proc/sys/vm/overcommit_ratio comme une valeur qui ne peut jamais dépasser les limites physiques de la RAM. Voir la documentation du noyau pour calculer ce que ce chiffre serait pour vous.
Quelle est la meilleure façon de régler ma mémoire pour mon application ?
- Comprendre ce que fait réellement le swappiness.
- Utilisez CGroups pour allouer les ressources correctes par application.
- Modifiez le mode d'overcommit mentionné ci-dessus pour que le système d'exploitation applique des limites strictes.
- Utilisez les cgroups comme ci-dessus pour définir les priorités d'OOM sur les applications que vous vraiment que vous voulez garder si vous n'avez plus de mémoire et d'application. vraiment que tu veux abandonner si tu n'as plus de mémoire.
Le vendeur recommande une configuration différente..
Écoutez plutôt ça. Certaines applications sont écrites de telle manière qu'elles invoquent délibérément le noyau pour que leurs pages soient actives avant toutes les autres. C'est un mauvais tour pour être honnête mais cela brise la capacité du noyau à gérer la mémoire de manière transparente lorsque cela se produit. Si votre fournisseur vous donne des informations spécifiques, il est probable qu'il entre dans cette catégorie, alors écoutez plutôt ce qu'il dit.
En résumé
- Swap est destiné à être utilisé comme un endroit pour mettre la mémoire gaspillée. Pas comme "mémoire de secours".
- Le fait de disposer de quantités énormes de swap n'a aucun effet sur vos chances de l'utiliser.
- Le noyau veut vraiment vous empêcher d'accéder au disque pour vos données. Cela s'applique tout autant, sinon plus, au cache des pages qu'à l'espace d'échange.
- Le noyau fera de son mieux pour respecter les paramètres que vous lui donnez pour les applications que vous exécutez. Mais ne soyez pas surpris si vous avez des OOM si vous avez 500 enfants apache qui prennent tous 32M de mémoire. C'est un défaut de la configuration que vous choisissez, pas de la gestion de la mémoire.
Le noyau fait généralement un très bon travail pour gérer correctement la mémoire virtuelle. Il est presque toujours le cas que votre application alloue plus de mémoire que vous ne pouvez espérer travailler avec et c'est ce qui cause un OOM.
Le swap était utilisé comme "mémoire de secours", mais ce n'est plus son but premier, donc ne pensez pas à l'utiliser comme ça. Appréciez plutôt le fait que votre noyau sait probablement mieux que quiconque ce qu'il veut faire de votre mémoire. Donnez-lui l'espace nécessaire pour prendre ces décisions et vous bénéficierez d'une amélioration générale des performances.
Extrait du document "Oracle 10g Server on Red Hat® Enterprise Linux® 5 Deployment Recommendations".
Oracle fournit des outils génériques recommandations concernant la taille des swap dans la MetaLink Note 169706.1. Ces recommandations recommandations peuvent conduire à la création d'un très grand espace d'échange sur les systèmes avec une grande quantité de mémoire. Le très grand espace d'échange peut entraîner des dégradation des performances du système et peut être peut être résolu en réduisant l'espace d'échange. Red Hat ne recommande pas d'allouer plus de 4 Go pour l'espace d'échange sur Red Hat Enterprise Linux 5.
Ainsi, pour 16 Go, vous ne devriez pas avoir plus de 4 Go de swap.
PS. Il est également intéressant de noter que l'invocation de oom
est presque toujours préférable à un processus inutilisable qui utilise toute la bande passante d'entrée/sortie.
Les recommandations actuelles de CentOS Swap utilisent la formule suivante :
M = Amount of RAM in GB, and S = Amount of swap in GB, then
If M < 2
S = M *2
Else
S = M + 2
Ainsi, pour 16G, le montant du swap devrait être de 18G.
Voir http://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-swapspace.html
- Réponses précédentes
- Plus de réponses