Ceci est un vieux post, cependant, je prendrais toujours la liberté de faire part de mes pensées ici.
À partir de l’en bas, Linux divisera d’abord la mémoire en pages (généralement 4 Ko par page sur un système x86_64). Ensuite, une mémoire virtuelle est créée, dont le mappage est effectué avec une mémoire physique à l'aide de la MMU (unité de gestion de la mémoire).
Les processus se voient allouer de la mémoire à partir de la zone de mémoire virtuelle. Veuillez noter que lorsque vous voyez / proc / meminfo, vous verrez VMalloc * en tant que détails de la mémoire virtuelle.
Disons que vous avez un processus qui demande de la mémoire (disons 300 Mo - un navigateur Web). Le processus se verrait allouer 300 Mo à partir de la mémoire virtuelle. Toutefois, il n'est pas nécessaire que la mémoire soit mappée (c'est-à-dire mappée sur la mémoire physique). Il existe un concept de "copie sur écriture" pour la gestion de la mémoire. Ainsi, si vos processus utilisent réellement la mémoire allouée à partir de la mémoire virtuelle (c’est-à-dire qu’elle enregistre sur la mémoire), elle est alors mappée sur la mémoire physique. Cela aide le noyau à fonctionner correctement dans un environnement multi-processus.
Que sont les caches?
Une grande partie de la mémoire utilisée par les processus est partagée. Disons que la bibliothèque glibc est utilisée par presque tous les processus. Quel est l'intérêt de conserver plusieurs copies de glibc dans la mémoire, alors que chaque processus peut accéder au même emplacement mémoire et effectuer le travail. Ces ressources fréquemment utilisées sont conservées dans le cache de sorte que, lorsque les processus le demandent, elles puissent être référencées au même emplacement mémoire. Cela aide à accélérer les processus, car lire à nouveau glibc (etc.) à partir du disque prendrait beaucoup de temps.
Ce qui précède concernait les bibliothèques partagées proprement dites, il en va de même pour la lecture de fichiers. Si vous lisiez un fichier volumineux (disons 100-200 Mo) pour la première fois, cela prendrait beaucoup de temps. Cependant, lorsque vous essayez de refaire la même lecture, ce serait plus rapide. Les données ont été mises en cache en mémoire et la relecture n'a pas été effectuée pour tous les blocs.
Qu'est-ce qu'un tampon?
En ce qui concerne la mémoire tampon, lorsqu'un processus effectue un fichier d'E / S, il utilise la mémoire tampon du noyau pour écrire des données sur le disque. Les processus demandent au noyau de faire le travail. Ainsi, au nom du processus, le noyau écrit les données dans son "tampon" et indique au processus que l'écriture est terminée. De manière asynchrone, le noyau continuera à synchroniser ces données dans la mémoire tampon sur le disque. De cette façon, les processus comptent sur le noyau pour choisir le bon moment pour synchroniser les données sur le disque et les processus pourraient continuer. Rappelez-vous qu’il s’agit d’entrées / sorties générales effectuées par des processus normaux. Cependant, les processus spécialisés, qui doivent confirmer que les E / S sont réellement effectuées sur le disque, peuvent utiliser un autre mécanisme pour effectuer des E / S sur le disque. Certains des utilitaires opensource sont libaio. En outre, il existe des moyens d'appeler la synchronisation explicite aux FD ouverts dans le contexte de vos processus,
Quels sont les défauts de page alors?
Prenons un exemple, lorsque vous démarrez un processus (par exemple un navigateur Web), dont le fichier binaire fait environ 300 Mo. Cependant, les 300 Mo complets du binaire du navigateur Web ne commencent pas à fonctionner instantanément. Le processus continue de passer de fonctions en fonctions dans son code. Comme indiqué précédemment, la mémoire virtuelle consomme 300 Mo. Toutefois, la mémoire n’est pas entièrement mappée sur la mémoire physique (la mémoire résidente RSS serait inférieure, voir la sortie ci-dessus). Lorsque l'exécution du code atteint un point pour lequel la mémoire n'est pas physiquement mappée, une erreur de page pose problème. Le noyau mapperait cette mémoire sur physique, associerait la page mémoire à votre processus. Un tel défaut de page est appelé "Défauts de page mineurs". De même, lorsqu'un processus est en train de faire un fichier, les erreurs de page majeures sont levées.
Quand et pourquoi Swap Out se produit?
Situation 1:
En ligne avec les détails ci-dessus, considérons un scénario où la bonne quantité de mémoire devient mappée en mémoire. Et maintenant, un processus démarre, ce qui nécessite de la mémoire. Comme discuté ci-dessus, le noyau devra effectuer un certain mappage de la mémoire. Cependant, il n'y a pas assez de RAM physique disponible pour mapper la mémoire. Maintenant, le noyau va d'abord regarder dans le cache, il aura quelques anciennes pages de mémoire qui ne sont pas utilisées. Il videra ces pages sur une partition séparée (appelée SWAP), libérera certaines pages et mappera les pages libérées sur la nouvelle requête à venir. Comme l'écriture sur disque est beaucoup plus lente que la RAM à l'état solide, ce processus prend beaucoup de temps, ce qui entraîne un ralentissement.
Situation 2:
Disons que vous voyez beaucoup de mémoire libre disponible dans le système. Même à ce moment-là, vous voyez qu'il y a beaucoup d'échanges en cours. Il pourrait y avoir un problème de fragmentation de la mémoire. Prenons un processus qui requiert 50 Mo de mémoire contiguë du noyau. (garder à l'esprit contiguë). De toute évidence, le noyau aurait alloué des pages au hasard à différents processus et en aurait libéré certains. Cependant, lorsque nous demandons une mémoire contiguë, il faudra rechercher un bloc qui satisfasse à la demande des processus. S'il ne parvient pas à obtenir une telle mémoire, il devra échanger certaines anciennes pages de mémoire, puis allouer des pages contiguës. Même dans de tels cas, SWAP out aurait lieu. À partir de la version 2.6 et supérieure, les problèmes de fragmentation ont considérablement diminué. Toutefois, si le système fonctionne pendant longtemps, de tels problèmes peuvent toujours survenir.
Voir cet exemple ( sortie vmstat )
2016-10-29 03:55:32 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
2016-10-29 03:55:32 r b swpd free buff cache si so bi bo in cs us sy id wa st
2016-10-30 03:56:04 19 23 2914752 4692144 3344908 12162628 1660 1 8803 12701 4336 37487 14 7 40 38 0
2016-10-30 03:56:34 3 20 2889296 4977580 3345316 12026752 2109 2 8445 14665 4656 36294 12 7 46 34 0
2016-10-30 03:57:04 1 11 3418868 4939716 3347804 11536356 586 4744 2547 9535 3086 24450 6 3 59 33 0 <<<-----
2016-10-30 03:57:34 3 19 3456252 5449884 3348400 11489728 3291 13371 6407 17957 2997 22556 6 4 66 24 0
2016-10-30 03:58:04 7 6 4194500 5663580 3349552 10857424 2407 12240 3824 14560 2295 18237 4 2 65 29 0
2016-10-30 03:58:34 2 16 4203036 5986864 3348908 10838492 4601 16639 7219 18808 2575 21563 6 4 60 31 0
2016-10-30 03:59:04 3 14 4205652 6059196 3348760 10821448 6624 1597 9431 4357 1750 20471 6 2 60 31 0
2016-10-30 03:59:34 2 24 4206968 6053160 3348876 10777216 5221 2067 10106 7377 1731 19161 3 3 62 32 0
2016-10-30 04:00:04 0 13 4205172 6005084 3348932 10785896 6236 1609 10330 6264 1739 20348 4 2 67 26 0
2016-10-30 04:00:34 4 11 4206420 5996396 3348976 10770220 6554 1253 10382 4896 1964 42981 10 5 58 27 0
2016-10-30 04:01:04 6 4 4177176 5878852 3348988 10825840 8682 765 10126 2716 1731 32949 8 4 69 19 0
@ 2016-10-30 03:57:04, nous constatons qu'il reste encore une bonne quantité de mémoire RAM disponible. Cependant, même alors, l'échange est arrivé. À ce stade, nous avons vérifié l’arbre des processus et nous n’avons vu aucun processus nécessitant une telle quantité de mémoire (plus que de la mémoire libre). Le soupçon évident était la situation 2 décrite ci-dessus. Nous avons vérifié les journaux buddyinfo et zoneinfo ci-dessus (utilisez echo m> / proc / sysrq-trigger pour les vérifier, la sortie passe dans syslogs).
Pour un système normal, la comparaison des informations de zone est la suivante. Et les graphiques pour cache / free / low mem sont également mentionnés ci-dessous
En regardant les informations, il est clair qu'il existe une fragmentation de la mémoire dans le noeud 0 et le noeud 1 normal (le noeud est une machine basée sur NUMA, donc plusieurs noeuds (voir numactl pour vérifier les informations sur votre système)).
La fragmentation de la mémoire est également une raison pour laquelle l'utilisation de l'échange peut augmenter même lorsque la mémoire disponible est là.