58 votes

À quelle échelle ou mesure la "pression mémoire" de Mavericks et de Yosemite obéit-elle ?

Le moniteur d'activité de Mavericks (et aussi de Yosemite) affiche un nouveau diagramme, le pression de mémoire . Malheureusement, son texte d'aide n'explique que vaguement ce qu'il mesure exactement. Comment la pression de la mémoire est-elle calculée ?

Mavericks Activity Monitor - memory

Le mérite de la photo revient à cette réponse d'une question de sondage sur la meilleure nouvelle fonctionnalité de Mavericks.

55voto

Oskar Points 1242

La pression mémoire n'est pas une simple mesure du pourcentage de mémoire libre et semble être un graphique de 0 à 100%. Le site sysctl valeur de vm.memory_pressure est calculé par rapport à une cible calculée qui suit le rapport entre les pages de mémoire libres et inactives et les pages câblées et actives. Les compteurs absolus sont visualisés à l'aide de la fonction vm_stat outil de ligne de commande pour inspecter l'allocation détaillée de la mémoire virtuelle. Jonathan Levin propose une excellente documentation à l'adresse http://newosxbook.com/articles/MemoryPressure.html couvrant la mémoire virtuelle de MacOS et d'iOS et la façon dont ils calculent la pression de la mémoire ainsi que les actions prises lorsque l'indice de pression est élevé.

La mémoire virtuelle (vm) concernée qui alimente le calcul de la vm.memory_pressure sont :

  • vm.page_free_count - un décompte absolu des pages libres
  • vm.vm_page_free_target - une cible ou un objectif calculé pour une situation "sans pression".
  • vm.page_free_wanted - ce que le système vm aimerait libérer pour alléger l'indice de pression calculé actuel

Ainsi, si vous suivez votre pression mémoire avec le moniteur d'activité (ou si vous vérifiez les valeurs sysctl de manière programmatique ou en ligne de commande), vous feriez bien de regarder ces quatre valeurs :

sysctl -a vm | egrep "page_free|pressure"

Il existe une nouvelle commande memory_pressure introduit avec Mavericks et lorsque je l'exécute pour conduire le sous-système de mémoire dans un état d'alerte - vous pouvez voir la pression de la mémoire augmenter dans une gamme jaune.

activity monitor results of <code>sudo memory_pressure -l warn</code>

L'outil a alloué environ 4 Go de mémoire à l'outil alors que le graphique de la pression augmentait régulièrement jusqu'à cet état où apparemment le niveau "d'avertissement" est représenté graphiquement : sudo memory_pressure -l warn . Comme vous pouvez le voir, le système avant la pression avait 5,9 Go utilisés et après était monté à 7,99 Go utilisés, ce qui n'a même pas besoin d'être additionné en raison du swapping et de la compression.

Après avoir vu comment vm_stat 15 a montré que l'avertissement n'entraînait aucune pagination mesurable, j'ai quitté l'outil (Control-C) puis j'ai relancé l'outil pour rendre la pression mémoire critique : sudo memory_pressure -l critical

Je ne l'ai pas laissé tourner plus de quelques minutes car la pagination commençait et une fois que l'outil a indiqué que j'avais 5 Go de RAM paginée sur le disque, je n'ai pas voulu remplir mon disque et j'ai quitté l'outil.

activity monitor results of <code>sudo memory_pressure -l critical</code>

Vous pouvez observer la rapidité avec laquelle le système a libéré la RAM après la fin de l'avertissement et aussi comment il est passé en territoire "rouge" pour montrer que le système de mémoire virtuelle ne pouvait pas compresser suffisamment de pages pour éviter le swapping sur le disque. Je pense que le rouge sur la pression indique un swapping et une sur-allocation dramatique et/ou un moment où les pages libres sont inférieures à la quantité que le système préfère et où il purge activement les pages inactives et/ou swape les pages qui devraient être utilisées pour le swap. De même, le système se rétablit rapidement dès que les allocations sont libérées et que la pression est relâchée sur le système de mémoire virtuelle.

0 votes

Merci pour cette précision. J'aimerais savoir s'il existe une commande (ou un ensemble de commandes) qui calcule les paramètres de mémoire virtuelle, de cache de fichier et de mémoire d'application dans la capture d'écran ci-dessus.

0 votes

@MuhammadHassan La réponse ci-dessous présente un bon résumé de l'algorithme par rétro-ingénierie et indique où chercher dans xnu open source pour les internes. J'ai extrait les 4 valeurs couvertes qui sont les plus pertinentes pour l'affichage de la pression dans l'interface graphique.

1 votes

Le graphique de pression de la mémoire est de loin la source d'information la plus simple et la plus indicative sur l'état de la mémoire. Je pense que la formule derrière ce graphique est assez complexe et gourmande en ressources, mais il est peut-être possible de trouver une version simplifiée qui serait "suffisante" dans la plupart des cas, par exemple pour fonctionner constamment en arrière-plan afin de surveiller la charge d'un serveur MacOS.

31voto

Just helping Points 361

Pour clarifier quelque peu et rendre cette supposition plus précise : la pression mémoire est une métrique utilisée par le noyau (xnu) avec un thread dédié appelé memory_status (précédemment connu sous le nom de Jetsam). Ce thread est chargé de détecter quand la RAM disponible est faible - ce qui, dans OS X, peut forcer le swapping et, dans iOS, tue l'application qui consomme le plus de mémoire (car il n'y a pas de swap). Dans Mavericks, les deux systèmes d'exploitation sont plus proches. Memorystatus émet une note du noyau, que le runtime Obj-C traduit finalement en appDidReceiveLowMemoryWarning. Les applications sont censées purger la mémoire inutilisée ou superflue (par exemple, les caches). La libC de Darwin purge aussi la mémoire automatiquement.

Il existe un appel système spécifique (bien que non documenté), vm_pressure_monitor (#296, si je me souviens bien), qui permet à un client d'écouter les événements de pression, et de voir combien de pages physiques peuvent être récupérées.

Vous pouvez visualiser les événements de pression sur Mavericks à l'aide de Process Explorer pour OS X - téléchargeable à l'adresse suivante http://newosxbook.com/index.php?page=downloads . Cela vous montre à la fois la "jauge" de pression, ainsi que les événements de pression.

0 votes

Ce site web contient également un article détaillé - newosxbook.com/articles/MemoryPressure.html - détailler la pression et la manipulation de la mémoire dans OS X et iOS

0 votes

Des détails impressionnants sur les similitudes et les différences entre Mavericks et iOS kernel. Merci pour le lien vers Process Explorer.

16voto

leppie Points 67289

La pression de la mémoire est définie par deux compteurs que Mach conserve en interne :

  • vm_page_free_count : Combien de pages de RAM sont actuellement libres
  • vm_page_free_target : Combien de pages de RAM, au minimum, devraient être libres de façon optimale.

Vous pouvez les voir facilement en utilisant sysctl :

morpheus@Zephyr (~/Documents) % sysctl -a vm | grep page_free
vm.vm_page_free_target: 2000
vm.page_free_wanted: 0
vm.page_free_count: 73243

si le nombre de pages libres est inférieur à l'objectif fixé, nous sommes en situation de pression.


De http://newosxbook.com/articles/MemoryPressure.html

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X