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 sysctl
valeur de vm.memory_pressure
est 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_stat
outil 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_pressure
est:
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_pressure
introduite 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.
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 15
le 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.
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.
xnu
interne pour les composants internes. J'ai extrait les 4 valeurs couvertes les plus pertinentes pour l'affichage de la pression par l'interface graphique.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.
la source
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 libresvm_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:
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
la source