Fragmentation de la mémoire Linux

Y a-t-il un moyen de détecter la fragmentation de la mémoire dans Linux? Cela est dû au fait que sur certains serveurs de travail longs, j'ai remarqué une diminution de la productivité et seulement après le redémarrage du processus, j'ai vu une meilleure performance. Je l'ai remarqué plus lorsque vous utilisez des pages énormes Linux - Énormes pages B. Linux Sont plus sensibles à la fragmentation?

En particulier, j'ai vu / proc / buddyinfo. Je veux savoir s'il y a de meilleurs moyens (Pas seulement des équipes CLI En tant que tel, tout programme ou fondations théoriques conviendra.), Regarder ça.
Invité:

Dominique

Confirmation de:

Je réponds sur

étiqueter. Ma réponse ne concerne que

Linux

.

Oui, d'énormes pages sont plus susceptibles à la fragmentation. Il y a deux types de mémoire: une qui obtient votre processus (Virtuel), et deuxième à laquelle le noyau gère ​​(Réel). Plus n'importe quelle page, plus il sera difficile de regrouper (Et enregistrer) Ses voisins, surtout lorsque votre service fonctionne dans un système, qui devrait également soutenir les autres, qui sont alloués par défaut et écrivent à beaucoup plus de mémoire qu'ils n'utilisent en fin de compte.

Afficher le noyau (Réel) Les adresses fournies sont privées. Il y a une très bonne raison pour laquelle l'espace utilisateur les voit comme il représente le noyau, car le noyau devrait pouvoir remplacer, sans confondre l'espace utilisateur. Votre processus devient beau, continu

"Diseneyfid"

espace d'adresses dans lequel travailler, ne prêtant pas attention à ce qui est en réalité un noyau

Fabriquer

Avec cette mémoire dans les coulisses.

La raison pour laquelle vous voyez une réduction des performances des serveurs de travail longs est susceptible d'être associée à des blocs dédiés qui n'ont pas été explicitement bloqués (par exemple,

mlock()

/

mlockall()

ou

posix_madvise()

) Et pendant longtemps n'a pas changé, étaient

Déchargé

, Ce qui signifie que votre service se déplace sur le disque quand il doit être lu. Changer ce comportement fait votre processus

Mauvais voisin

, Tant de gens placent leur SGBD sur un serveur complètement différent de celui de web / php / python / ruby ​​/ autre chose. La seule façon raisonnable de le réparer. - Réduire la concurrence pour les blocs adjacents.

La fragmentation est vraiment perceptible (Dans la plupart des cas), Quand page A est en mémoire et la page B Déplacé à glisser. Naturellement, le redémarrage de votre service apparemment "guérir", mais seulement parce que le noyau n'a pas encore été en mesure d'apporter le processus (à présent) Des blocs nouvellement isolés dans son coefficient de fixation excessive.

En fait, redémarrer (Disons) 'apache' Avec une charge élevée, il convient probablement d'envoyer des blocs appartenant à d'autres services directement sur le disque. Donc oui apache peut s'améliorer pendant une courte période, mais mysql Peut souffrir ... Au moins, tant que le noyau les pousse à souffrir de manière égale, quand il suffit de ne pas assez de mémoire physique.

Ajouter plus de mémoire ou diviser exigeant

malloc()

Création de consommateurs :) Ce n'est pas simplement une fragmentation pour laquelle vous devez regarder.

Essayer

vmstat

Obtenir un aperçu de ce qui est réellement stocké.

Babette

Confirmation de:

Coeur

Pour obtenir l'index de fragmentation actuel, utilisez:

sudo cat /sys/kernel/debug/extfrag/extfrag_index

Pour défragmenter la mémoire du noyau, essayez d'exécuter:

sysctl vm.compact_memory=1  

Vous pouvez également désactiver des pages d'énormes pages transparentes (Aussi connu sous le nom THP) et / Ou désactiver le podcast (Ou diminuer

swappiness

).

Espace utilisateur

Pour réduire la fragmentation de l'espace utilisateur, vous pouvez essayer un autre distributeur, par exemple

jemalloc

(Il est excellent
https://github.com/jemalloc/je ... stics
, Qu'est-ce qui vous donnera une idée de la fragmentation interne du distributeur).

Vous pouvez basculer sur personnalisable malloc, Recompilation de votre programme avec elle ou en exécutant simplement votre programme avec

LD_PRELOAD

:

LD_PRELOAD=${JEMALLOC_PATH}/lib/libjemalloc.so.1 app

(il faut se méfier
https://www.digitalocean.com/c ... tors/
)

Bien qu'il soit un peu non lié à la fragmentation de la mémoire (Mais associé au sceau / Mémoire en migration), Vous voulez probablement exécuter plusieurs instances de votre service, un pour chaque noeud NUMA, et attachez-les avec

numactl

.

Babette

Confirmation de:

L'utilisation de pages énormes ne doit pas provoquer une fragmentation supplémentaire de la mémoire dans Linux; Linux Prend en charge d'énormes pages pour la mémoire globale (de l'autre côté shmget ou mmap), Et toutes les pages énormes utilisées doivent être spécifiquement demandées et surlignées à l'avance par un administrateur système. Trouver en mémoire, ils sont fixés et non déchargés. Le problème du podaching des pages énormes face à la fragmentation de la mémoire est exactement pourquoi ils restent fixes en mémoire (Lors de la mise en surbrillance d'une énorme taille de page 2 MB Kernel devrait trouver 512 Pages libres adjacentes 4 KB, qui pourrait même exister).

Documentation par Linux Sur des pages énormes:
http://lwn.net/Articles/375098/
Il y a une circonstance dans laquelle la fragmentation de la mémoire peut entraîner une allocation lente de pages énormes. (Mais pas où d'énormes pages

cause

Fragmentation de la mémoire), Et ceci est si votre système est configuré pour augmenter le pool de pages énormes sur la demande d'application. Si un / proc / sys / vm / nr_overcommit_hugepages plus que / proc / sys / vm / nr_hugepages, Cela peut arriver.

Blanche

Confirmation de:

Il y a

/proc/buddyinfo

Ce qui est très utile. Il est plus utile avec un format de sortie magnifique, par exemple ce scénario Python peut:

https://gist.github.com/labeneator/9574294
Pour d'énormes pages, vous avez besoin de fragments libres 2097152 (2 Mb) ou plus. Pour des pages énormes transparentes, il rétrécit automatiquement lorsque le noyau le demande, mais si vous voulez voir combien vous pouvez obtenir, courir au nom de root:

echo 1 | sudo tee /proc/sys/vm/compact_memory

En outre, oui, d'énormes pages causent de gros problèmes de fragmentation. Ou vous ne pouvez pas obtenir d'énormes pages ou leur présence fait que le noyau passe beaucoup de temps supplémentaire à essayer de les obtenir.

J'ai une solution qui me convient. Je l'utilise sur plusieurs serveurs et sur mon ordinateur portable. Cela fonctionne bien avec des machines virtuelles.

Ajouter

kernelcore=4G

Dans la ligne de commande du noyau Linux. Sur mon serveur j'utilise 8G. Soyez prudent avec le nombre car il empêchera votre noyau de souligner quoi que ce soit en dehors de cette mémoire. Les serveurs nécessitant de nombreux tampons de prise ou qui gèrent un streaming du disque à des centaines de disques ne produiront pas de telles restrictions. Toute allocation de mémoire qui doit être «inscrite» pour slab ou DMA, fait référence à cette catégorie.

Tout le reste de la mémoire devient "mobile", ce qui signifie qu'il peut être pressé dans de beaux fragments pour mettre en évidence des pages énormes. Maintenant, les énormes pages transparentes peuvent vraiment décoller et travailler au besoin. Quand le noyau est requis plus 2M pages, il peut simplement réaffecter des pages 4K à un autre endroit.

Et je ne suis pas tout à fait sûr de savoir comment il interagit avec une introduction directe avec une copie zéro. La mémoire dans la "zone mobile" ne doit pas être corrigée, mais la demande directe d'E / S le fera en particulier pour DMA. Il peut le copier. En tout cas, il peut l'attacher dans la zone mobile. En tout cas, ce n'est probablement pas exactement ce dont vous avez besoin.

Pour répondre aux questions, connectez-vous ou registre