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

57

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

Icreditiimmaginevannoa questa risposta da una domanda del sondaggio sulla migliore nuova funzionalità di Mavericks.

    
posta Jens Erat 27.10.2013 - 17:49
fonte

3 risposte

51

La pressione di memoria non è un semplice indicatore di percentuale di memoria libera e sembra essere un grafico da 0 a 100%. Il valore sysctl di vm.memory_pressure viene calcolato in relazione a un target calcolato che tiene traccia del rapporto tra pagine di memoria libere e inattive nelle pagine cablate e attive. I contatori assoluti sono visualizzati utilizzando lo strumento della riga di comando vm_stat per ispezionare l'allocazione dettagliata della memoria virtuale. Jonathan Levin ha una documentazione eccellente sul link che copre sia la memoria virtuale di macOS e iOS sia il modo in cui calcolano la pressione della memoria e le azioni intraprese quando l'indice di pressione è alto.

La memoria virtuale rilevante (vm) che alimenta il calcolo di vm.memory_pressure è:

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

Quindi, se stai monitorando la pressione della memoria con il monitor Attività (o se controllo i valori di sysctl a livello di programmazione o sulla shell della riga di comando) faresti bene a guardare questi quattro valori:

sysctl -a vm | egrep "page_free|pressure"

C'è un nuovo comando memory_pressure introdotto 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.

Lostrumentohaallocatocirca4GBdimemoriaallostrumentomentreilgraficodellapressioneaumentavacostantementeinquestostatoincuiapparentementeillivellodi"avvertimento" è rappresentato: sudo memory_pressure -l warn . Come potete vedere, il sistema prima della pressione aveva 5,9 GB utilizzati e dopo era utilizzato fino a 7,99 GB, che non ha nemmeno bisogno di aggiungere a causa dello scambio e della compressione.

Dopo aver visto come vm_stat 15 ha mostrato il risultato dell'avviso senza paginazione misurabile, ho chiuso lo strumento (Control-C) e poi ho ripetuto lo strumento per rendere critica la pressione della memoria: sudo memory_pressure -l critical

Non l'ho lasciato funzionare per più di qualche minuto con l'inizio del paging e una volta che lo strumento diceva che avevo 5 GB di RAM pagati su disco, non volevo riempire il mio disco e chiudere lo strumento.

ÈpossibileosservarelarapiditàconcuiilsistemahaliberatolaRAMdopolafinedell'avvisoeancheilmodoincuièpassatoalterritorio"rosso" per dimostrare che il sistema di memoria virtuale non è in grado di comprimere un numero di pagine sufficiente a evitare lo swap su disco. La mia supposizione istruita è rossa sulla pressione indica swapping e drammatica sovra-allocazione e / o un tempo in cui le pagine libere sono al di sotto della quantità che il sistema preferisce e sta eliminando attivamente pagine inattive e / o scambiando le pagine che ci si aspetta vengano scambiate. Allo stesso modo, il sistema recupera rapidamente una volta che le allocazioni sono state rilasciate e la pressione viene rimossa dal sistema di memoria virtuale.

    
risposta data 28.10.2013 - 02:22
fonte
30

In qualche modo chiarire e rendere questa ipotesi più accurata: la pressione della memoria è una metrica usata dal kernel (xnu) con un thread dedicato chiamato memory_status (precedentemente noto come Jetsam). Questo thread è responsabile della rilevazione quando la RAM disponibile è bassa, che in OS X può forzare lo swapping e in iOS uccide la più alta app che consuma memoria (dato che non c'è scambio). In Mavericks, i due sistemi operativi sono più vicini. Memorystatus emette una nota del kernel, che il runtime Obj-C alla fine traduce in un'appDidReceiveLowMemoryWarning. Le app devono eliminare la memoria inutilizzata o estranea (ad esempio, le cache). La libC di Darwin elimina anche automaticamente la memoria.

C'è una chiamata di sistema specifica (anche se non documentata), vm_pressure_monitor (# 296, se ricordo bene), che consente ad un client di ascoltare eventi di pressione e vedere quante pagine fisiche possono essere recuperate.

Puoi visualizzare gli eventi di pressione su Mavericks usando Process Explorer per OS X - scaricabile dal link . Che entrambi ti mostrano la pressione "calibro", così come gli eventi di pressione.

    
risposta data 31.10.2013 - 05:53
fonte
14

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

  • vm_page_free_count : quante pagine di RAM sono attualmente gratuite
  • vm_page_free_target : quante pagine di RAM, come minimo, dovrebbero essere libere in modo ottimale.

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 dell'importo target, abbiamo una situazione di pressione.

Da link

    
risposta data 01.02.2014 - 21:36
fonte