À quelle échelle ou mesure la «pression de la mémoire» de Mavericks et Yosemite adhère-t-elle?


57

Le Moniteur d'activité de Mavericks (et également de Yosemite) affiche un nouveau diagramme, la pression de la mémoire . Malheureusement, son aide n’explique que très vaguement ce qu’il mesure exactement. Comment calcule-t-on la pression de la mémoire?

Moniteur d'activité Mavericks - mémoire

Picture Creds va à cette réponse d'une question de sondage sur la meilleure nouvelle fonctionnalité de Mavericks.

Réponses:


51

La pression de la mémoire n'est pas une simple jauge de pourcentage de mémoire libre et semble être un graphique de 0 à 100%. La sysctlvaleur de vm.memory_pressureest calculée par rapport à une cible calculée qui enregistre le rapport entre les pages de mémoire libres et inactives aux pages câblée et active. Les compteurs absolus sont visualisés à l'aide de l' vm_statoutil de ligne de commande pour vérifier l'allocation détaillée de la mémoire virtuelle. Jonathan Levin dispose d’une excellente documentation sur http://newosxbook.com/articles/MemoryPressure.html, qui traite à la fois de la mémoire virtuelle macOS et iOS et explique comment ils calculent la pression de la mémoire ainsi que les actions prises lorsque l’indice de pression est élevé.

La mémoire virtuelle pertinente (vm) qui alimente le calcul vm.memory_pressureest:

  • vm.page_free_count - un nombre absolu de 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 voudrait libérer pour atténuer l'indice de pression calculé actuel

Donc, si vous suivez votre pression de mémoire avec Activity Monitor (ou si vous vérifiez les valeurs sysctl par programmation ou à partir du shell de ligne de commande), vous feriez bien de regarder ces quatre valeurs:

sysctl -a vm | egrep "page_free|pressure"

Une nouvelle commande a été memory_pressureintroduite avec Mavericks et lorsque je l’exécute pour conduire le sous-système de mémoire à un état d’avertissement - vous pouvez voir la pression de la mémoire augmenter dans une plage jaune.

résultats du moniteur d'activité de <code> sudo memory_pressure -l warn </ code>

L'outil alloué environ 4 Go de mémoire à l'outil comme le graphique de la pression a augmenté de façon constante à cet état où apparemment le niveau « d'alerte » est représentée graphiquement: sudo memory_pressure -l warn. Comme vous pouvez le constater, le système utilisé avant la pression utilisait 5,9 Go et 7,99 Go après, sans avoir à s’ajouter en raison de la permutation et de la compression.

Après avoir observé comment vm_stat 15le résultat de l'avertissement était affiché sans aucune pagination mesurable, j'ai quitté l'outil (Control-C), puis j'ai à nouveau exécuté l'outil pour rendre la pression de la mémoire critique:sudo memory_pressure -l critical

Je ne l'ai pas laissé fonctionner plus de quelques minutes au début de la pagination et une fois que l'outil m'a indiqué que j'avais 5 Go de mémoire RAM paginée sur disque, je ne voulais pas remplir mon disque et quitter l'outil.

résultats du moniteur d'activité de <code> sudo memory_pressure -l critical </ code>

Vous pouvez observer la rapidité avec laquelle le système a libéré de la mémoire RAM après la fin de l'avertissement, ainsi que son passage en territoire "rouge" pour indiquer que le système de mémoire virtuelle ne pouvait pas compresser suffisamment de pages pour éviter la permutation sur disque. Ma supposition éclairée est que le rouge sur la pression indique un échange et une sur-allocation considérable et / ou un temps où le nombre de pages libres est inférieur au montant souhaité par le système et où il purge activement les pages inactives et / ou les pages d'échange qui devraient être utilisées pour l'échange. De même, le système récupère rapidement une fois les allocations libérées et la pression supprimée du système de mémoire virtuelle.


Merci pour la clarification. J'aimerais savoir s'il existe une commande (ou un ensemble de commandes) permettant de calculer les paramètres de mémoire virtuelle, de cache de fichiers et de mémoire d'application dans la capture d'écran ci-dessus.
Muhammad Hassan Nasr

@MuhammadHassan La réponse ci-dessous couvre un bon résumé de l'ingénierie inverse de l'algorithme et indique où chercher en xnuinterne pour les composants internes. J'ai extrait les 4 valeurs couvertes les plus pertinentes pour l'affichage de la pression par l'interface graphique.
bmike

30

Pour clarifier un peu et rendre cette hypothèse plus précise: la pression de la mémoire est une métrique utilisée par le noyau (xnu) avec un thread dédié appelé memory_status (auparavant appelé Jetsam). Ce thread est chargé de détecter le moment où la RAM disponible est faible - ce qui sous OS X peut forcer le basculement et iOS détruit l'application consommant le plus de mémoire (sans échange). Dans Mavericks, les deux systèmes d'exploitation sont plus proches l'un de l'autre. Memorystatus émet une note dans le noyau, que l'exécution d'Obj-C traduit finalement en appDidReceiveLowMemoryWarning. Les applications sont supposées purger la mémoire non utilisée ou superflue (par exemple, les caches). La libC de Darwin purge également la mémoire automatiquement.

Il existe un appel système spécifique (bien que non documenté), vm_pressure_monitor (# 296, si mes souvenirs sont exacts), 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 afficher les événements de pression sur Mavericks à l'aide de Process Explorer pour OS X - téléchargeable à partir de http://newosxbook.com/index.php?page=downloads . Que les deux vous montre la "jauge" de pression, ainsi que les événements de pression.


Ce site Web contient également un article détaillé - newosxbook.com/articles/MemoryPressure.html - détaillant la pression et la gestion de la mémoire sous OS X et iOS
utilisateur61711

Détail impressionnant sur les similitudes et les différences entre Mavericks et le noyau iOS. Merci pour le lien vers Process Explorer.
bmike

14

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 manière 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 tombe en dessous du montant cible, nous sommes dans une situation de pression.


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.