A quale scala o misura aderiscono la "pressione della memoria" di Mavericks e Yosemite?


57

Il monitor attività di Mavericks (e anche quello di Yosemite) mostra un nuovo diagramma, la pressione della memoria . Purtroppo, il suo testo di aiuto spiega solo vagamente cosa misura esattamente. Come viene calcolata la pressione della memoria?

Mavericks Activity Monitor - memoria

I crediti fotografici vanno a questa risposta da una domanda del sondaggio sulla migliore nuova funzionalità di Mavericks.

Risposte:


51

La pressione della memoria non è un semplice indicatore della percentuale di memoria libera e sembra essere un grafico dallo 0 al 100%. Il sysctlvalore di vm.memory_pressureviene calcolato in relazione a un target calcolato che tiene traccia del rapporto tra le pagine di memoria libera e inattiva rispetto alle pagine cablate e attive. I contatori assoluti vengono visualizzati utilizzando lo vm_statstrumento da riga di comando per controllare l'allocazione dettagliata della memoria virtuale. Jonathan Levin ha un'eccellente documentazione su http://newosxbook.com/articles/MemoryPressure.html che copre sia la memoria virtuale macOS che iOS e come calcola la pressione della memoria e le azioni intraprese quando l'indice di pressione è elevato.

Le relative memorie virtuali (vm) che alimentano il calcolo di vm.memory_pressuresono:

  • vm.page_free_count - un conteggio assoluto di pagine libere
  • vm.vm_page_free_target - un obiettivo o obiettivo calcolato per una situazione "senza pressione"
  • vm.page_free_wanted - cosa vorrebbe liberare il sistema VM per alleviare l'attuale indice di pressione calcolato

Quindi - se stai monitorando la pressione della tua memoria con Activity monitor (o controllando i valori di sysctl a livello di codice o nella shell della riga di comando) faresti bene a guardare questi quattro valori:

sysctl -a vm | egrep "page_free|pressure"

C'è un nuovo comando memory_pressureintrodotto con Mavericks e quando lo eseguo per guidare il sottosistema di memoria in uno stato di avviso - puoi vedere l'aumento della pressione della memoria in un intervallo giallo.

risultati del monitoraggio dell'attività di <code> sudo memory_pressure -l warn </code>

Lo strumento assegnato circa 4 GB di memoria all'utensile come grafico della pressione aumentata costantemente a questo stato in cui è apparentemente graficamente il livello di "warning": sudo memory_pressure -l warn. Come puoi vedere, il sistema prima della pressione utilizzava 5,9 GB e dopo era utilizzato fino a 7,99 GB, che non è nemmeno necessario aggiungere a causa dello scambio e della compressione.

Dopo aver visto come è stato vm_stat 15mostrato il risultato dell'avviso in nessun paging misurabile, ho chiuso lo strumento (Control-C) e quindi ho eseguito nuovamente lo strumento per rendere critica la pressione della memoria:sudo memory_pressure -l critical

Non l'ho lasciato funzionare per più di qualche minuto mentre si avviava il paging e una volta che lo strumento diceva che avevo 5 GB di RAM paginati sul disco, non volevo riempire il mio disco ed uscire dallo strumento.

risultati del monitoraggio dell'attività di <code> sudo memory_pressure -l critical </code>

È possibile osservare la velocità con cui il sistema ha liberato la RAM dopo che l'avviso è stato terminato e anche come si è diffuso nel territorio "rosso" per mostrare che il sistema di memoria virtuale non è stato in grado di comprimere abbastanza pagine per evitare lo scambio su disco. La mia ipotesi istruita è rossa sulla pressione che indica lo scambio e l'eccessiva allocazione drammatica e / o un momento in cui le pagine libere sono inferiori alla quantità che il sistema preferisce e sta attivamente eliminando le pagine inattive e / o le pagine di scambio che dovrebbero essere utilizzate per scambiare. Allo stesso modo, il sistema recupera rapidamente una volta rilasciate le allocazioni e la pressione viene tolta dal sistema di memoria virtuale.


Grazie per il chiarimento. Vorrei sapere se esiste un comando (o una serie di comandi) che calcola i parametri di Memoria virtuale, Cache file e Memoria app nella schermata sopra.
Muhammad Hassan Nasr,

@MuhammadHassan La risposta che segue copre un bel sommario di ingegneria inversa dell'algoritmo e indica dove cercare in xnuopen source per gli interni. Ho estratto i 4 valori coperti più rilevanti per la visualizzazione della pressione della GUI.
bmike

30

Per chiarire un po 'e rendere tale ipotesi più accurata: la pressione della memoria è una metrica utilizzata dal kernel (xnu) con un thread dedicato chiamato memory_status (precedentemente noto come Jetsam). Questo thread è responsabile di rilevare quando la RAM disponibile è bassa, il che in OS X può forzare lo scambio e in iOS uccide l'app che consuma memoria più elevata (poiché non vi è scambio). In Mavericks, i due sistemi operativi sono più vicini. Memorystatus emette una nota del kernel, che il runtime Obj-C alla fine si traduce in un'appDidReceiveLowMemoryWarning. Le app dovrebbero eliminare la memoria inutilizzata o estranea (ad esempio cache). Anche la libC di Darwin cancella automaticamente la memoria.

Esiste una chiamata di sistema specifica (sebbene non documentata), vm_pressure_monitor (# 296, se ricordo bene), che consente a un cliente di ascoltare gli eventi di pressione e vedere quante pagine fisiche possono essere recuperate.

È possibile visualizzare gli eventi di pressione su Mavericks utilizzando Process Explorer per OS X, scaricabile da http://newosxbook.com/index.php?page=downloads . Ciò mostra entrambi il "manometro" della pressione, nonché gli eventi di pressione.


Quel sito web ha anche un articolo dettagliato - newosxbook.com/articles/MemoryPressure.html - che descrive la pressione e la gestione della memoria in OS X e iOS
user61711

Dettagli straordinari sulle somiglianze e le differenze tra Mavericks e kernel iOS. Grazie per il collegamento a Process Explorer.
bmike

14

La pressione della memoria è definita da due contatori che Mach mantiene internamente:

  • vm_page_free_count: Quante pagine di RAM sono attualmente libere
  • vm_page_free_target: Quante pagine di RAM, come minimo, dovrebbero essere ottimamente libere.

Puoi vederli facilmente usando 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

se la quantità di pagine libere scende al di sotto della quantità target, abbiamo una situazione di pressione.


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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.