Come disabilitare Mac OS X dall'uso dello swap quando c'è ancora memoria "inattiva"?


61

Un fenomeno comune nel mio uso quotidiano (e molti altri secondo vari post su Internet) di OS X, il sistema sembra rallentare ogni volta che non c'è più memoria "libera" disponibile. Presumibilmente, ciò è dovuto allo scambio, poiché è evidente un'intensa attività su disco e che vm_stat riporta molte pagine. (Correggimi dall'errore)

Tuttavia, la quantità di RAM "Inattivo" è in genere intorno al 12,5% -25% di tutta la memoria disponibile (^ 1.) Quando inizia / si verifica / termina lo scambio.

Secondo http://support.apple.com/kb/ht1342 :

Memoria inattiva

Queste informazioni in memoria non vengono utilizzate attivamente, ma sono state utilizzate di recente.

Ad esempio, se hai utilizzato Mail e poi lo hai chiuso, la RAM utilizzata da Mail è contrassegnata come memoria inattiva. Questa memoria inattiva è disponibile per l'uso da un'altra applicazione, proprio come la memoria libera. Tuttavia, se si apre Mail prima che la sua memoria inattiva venga utilizzata da un'altra applicazione, Mail si aprirà più rapidamente perché la sua memoria inattiva viene convertita in memoria attiva, invece di caricare Mail dal disco rigido più lento.

E secondo http://developer.apple.com/library/mac/#documentation/Performance/Conceptual/ManagingMemory/Articles/AboutMemory.html :

L'elenco inattivo contiene pagine attualmente residenti nella memoria fisica ma a cui non è stato effettuato l'accesso di recente. Queste pagine contengono dati validi ma possono essere rilasciate dalla memoria in qualsiasi momento .

Quindi, in sostanza: quando un programma viene chiuso, la sua memoria viene contrassegnata come Inattiva e dovrebbe essere rivendicabile in qualsiasi momento. Tuttavia, OS X preferirà iniziare a scambiare la memoria con il file Swap invece di rivendicare questa memoria, ogni volta che la memoria "Libera" si esaurisce.

Perché? Qual è il vantaggio di questo comportamento rispetto, ad esempio, al rilascio immediato della memoria inattiva e nemmeno il tocco del file di scambio? Alcune fonti (^ 2.) Indicano che OS X eseguirà lo swap della memoria "Inattiva" prima di rilasciarla, ma non ha senso adesso se la memoria può essere rilasciata dalla memoria in qualsiasi momento ? Lo scambio è costoso, il rilascio è economico, giusto?

Questo comportamento può essere modificato utilizzando una preferenza o un hack noto? (Preferibilmente uno che non include la disabilitazione totale di swap / dynamic_pager e il riavvio ...)

Apprezzo il comando purge , così come il concetto di riparazione dei permessi del disco per forzare un po 'di memoria libera, ma quelli sono modi per forzare dolorosamente più memoria libera che per riparare effettivamente la logica di decisione di scambio / rilascio ...

Tra l'altro una domanda simile è stata posta qui: http://forums.macnn.com/90/mac-os-x/434650/why-does-os-x-swap-when/ e qui: http: //hintsforums.macworld .com / showthread.php? t = 87688 ma anche se gli OP hanno ripreso la domanda principale, nessuna delle risposte risponde a una risposta ...

^ 1. AGGIORNAMENTO 17-mar-2012 Da quando ho pubblicato questa domanda per la prima volta, sono passato da 4 GB a 8 GB di RAM installata e il problema persiste. La quantità di ram "Inattivo" era 0,5 gb-1,0 gb prima e ora è in genere intorno a 1,0-2,0 GB quando inizia / si verifica / termina lo scambio, ovvero sembra che circa il 12,5% -25% del ram sia conservato come inattivo da osx logica del kernel.

^ 2. Ad esempio https://apple.stackexchange.com/questions/4288/what-does-it-mean-if-i-have-lots-of-inactive-memory-at-the-end-of-a-work- giorno :

Una volta utilizzata tutta la memoria (la memoria disponibile è 0), il sistema operativo scriverà la memoria inattiva nel file di scambio per creare più spazio nella memoria attiva.

AGGIORNAMENTO 17-mar-2012

Ecco un riepilogo dei metodi che sono stati suggeriti per aiutare finora:

Il comando di eliminazione

"Utilizzato per approssimare le condizioni di avvio iniziali con una cache del buffer del disco freddo per l'analisi delle prestazioni. Non influisce sulla memoria anonima che è stata allocata tramite malloc, vm_allocate, ecc.".

Ciò è utile per impedire a osx di scambiare la cache del disco (il che è ridicolo che osx lo faccia effettivamente in primo luogo), ma con il rovescio della medaglia che la cache del disco viene rilasciata, il che significa che se la cache del disco non stava per essere Scambiato, si finirebbe semplicemente con una cache del buffer del disco freddo, probabilmente influendo negativamente sulle prestazioni.

L' app FreeMemory e / o le autorizzazioni di riparazione del disco per forzare un po 'di memoria libera

Non aiuta a liberare memoria, spostando solo alcuni gigabyte di contenuto di memoria da ram a hd. Alla fine, questo provoca molti swap-in quando tento di utilizzare le applicazioni che erano aperte mentre liberavo memoria, poiché molti dei suoi VM sono ora in scambio.

Accelerare l'allocazione degli swap utilizzando dynamicpagerwrapper

Sembra una buona cosa da fare per accelerare l'utilizzo dello swap, ma non affronta il problema dello scambio di osx in primo luogo mentre c'è ancora memoria inattiva.

Disabilitare lo scambio disabilitando dynamicpager e riavviando

Ciò costringerà osx a non utilizzare lo swap al prezzo del sistema in sospeso quando viene utilizzata tutta la memoria. Non è una valida alternativa ...

Disabilitazione dello scambio tramite un DynamicPager compromesso

Simile alla disabilitazione di dynamicpager sopra, alcuni estratti dai commenti al post sul blog indicano che questa non è una soluzione praticabile: "La memoria inattiva è alta come al solito". "quando il sistema esaurisce la memoria, l'intero sistema operativo si blocca ...", "se si consuma tutta la quantità di memoria del mac, probabilmente la macchina si bloccherà"

Per riassumere, non sono ancora a conoscenza di un modo per disabilitare Mac OS X dall'uso dello scambio quando c'è ancora memoria "inattiva". Se non è possibile, forse almeno c'è una spiegazione da qualche parte sul perché osx preferisce scambiare la memoria che può essere rilasciata dalla memoria in qualsiasi momento ?


1
Ho questo problema, illustrato da questi numeri di Activity Monitor: bassistance.de/i/f2322d.png Quasi nessuna memoria libera, ma molta memoria inattiva. Invece di rivendicarlo, OSX preferisce iniziare a scambiare pesantemente, come puoi vedere dalle pagine da 40 GB.
Jörn Zaefferer,

Ho molta memoria libera e ci sono ancora più GB di swap in uso. 16 GB rMBP.
Steven Lu,

1
a quanto pare alcune persone hanno riportato benefici dall'esecuzione di "purge" apple.stackexchange.com/questions/67031/… non negativo
rogerdpack,

Risposte:


19

Per definizione, la memoria inattiva è una memoria pronta per il paging e il paging potrebbe implicare la sua scrittura per lo scambio. Questo non è alcun tipo di problema o problema che dovrebbe essere ottimizzato; in effetti OS X funziona come previsto .

Sfortunatamente, gli autori del supporto tecnico non sono sviluppatori del kernel e la citazione dell'articolo di supporto della Apple Knowledge Base è sbagliata quando afferma che la memoria inattiva è memoria non utilizzata dai programmi. Quando si esce da un programma, tutta la sua memoria residente diventa libera; non si ferma in Inattivo. Tuttavia, il secondo collegamento al sito dello sviluppatore che descrive come funziona la gestione della memoria è una buona risorsa, se letto completamente.

Esistono molte idee sbagliate sul significato di "memoria inattiva" in OS X. Contrariamente alle idee sbagliate, non tutta la memoria inattiva è vuota, non utilizzata, cache o eliminabile. In effetti, la memoria attiva può anche essere memorizzata nella cache o eliminabile, se è stata acceduta di recente. Molta memoria inattiva contiene anche dati che non possono essere semplicemente scartati. Se fosse scartato, i programmi si arresterebbero in modo anomalo, poiché le pagine scartate avrebbero contenuto dati validi (come dice la citazione dal lato dello sviluppatore di OS X) e i programmi si aspettano che i dati memorizzati nella memoria (virtuale) non scompaiano.

La memoria inattiva contiene gli stessi tipi di dati della memoria attiva. L'unica differenza è che OS X ha notato che alcuni blocchi di memoria non sono stati letti o scritti da un po 'di tempo.

Il motivo per cui OS X classifica la memoria come inattiva e altre regioni come "attive" ha a che fare con il paging. Quando la memoria si esaurisce, è necessario eseguire il paging di alcuni dati. La domanda è: quali dati? Se si pagano i dati che un programma risulta immediatamente necessari, si perde tempo e non si ottiene nulla. Quindi vuoi eliminare la memoria che un programma non dovrà immediatamente riutilizzare.

Anticipare quali pagine probabilmente non saranno necessarie in futuro è difficile perché un programma può usare la sua memoria virtuale come preferisce e non dire nulla al sistema operativo su quali siano i suoi piani. Ma come euristico, molti programmi sono "appiccicosi" nell'uso della memoria; se non hanno usato un po 'di memoria per un po', è probabile che continuino a non utilizzare quella memoria e che probabilmente continuino a usare la memoria che hanno usato di recente.

Quindi, quando il sistema operativo decide di eseguire il paging di alcuni dati, prende la strategia di scambiare pagine che non sono state utilizzate di recente. Ecco perché OS X ordina la memoria occupata dai programmi in due pile di "attivo" e "inattivo". Il link sopra pubblicato al sito dello sviluppatore, se letto completamente, spiega come avviene quel processo:

  • Quando la memoria inizia a esaurirsi, il sistema operativo inizia a scorrere le pagine di memoria attive e imposta un flag su ciascuna.
  • Se un programma legge o scrive su una pagina, il flag viene cancellato.
  • Se, dopo qualche ritardo, la bandiera non viene cancellata, quella pagina viene ordinata nella pila "inattiva".
  • Se al suo programma accede a una pagina "inattiva", questa viene rimessa nella pila "attiva".
  • Quando la memoria si esaurisce, le pagine "inattive" vengono esaurite.

Si noti che questo processo di ordinamento per decidere quale memoria scambiare è simile in tutti i sistemi operativi moderni. Linux ha gli stessi due elenchi di pagine attive e inattive, come descritto in Comprensione di Linux Virtual Memory Manager . Windows potrebbe usare qualcosa di leggermente diverso con più di due classi di recency; Non riesco a trovare una descrizione tecnica recente e affidabile al momento. Altre implementazioni sono discusse nella pagina Wikipedia intitolata "Algoritmo di sostituzione della pagina" . L'unica differenza con OS X era come venivano mostrate le statistiche: qualcuno decise che sarebbe stata una buona idea mostrare numeri separati per il topmonitoraggio attivo e inattivo o per Activity monitor. Con il senno di poi questa non è stata una buona idea (e questo è cambiato in OS X 10.9.)

Questo processo di impostazione e cancellazione di flag e mantenimento di heap attivi / inattivi richiede un po 'di potenza del processore. Per questo motivo, OS X non lo fa quando c'è molta memoria libera. Quindi i primi programmi che avvierai verranno visualizzati come tutta la memoria "attiva" fino a quando la memoria libera non inizia a esaurirsi.

Quindi, quando inizi da una lavagna vuota e apri sempre più programmi, puoi aspettarti di vedere la seguente progressione in Activity Monitor:

  • Innanzitutto, c'è molta memoria "libera" e pochissima inattiva. Questo perché il flagger di memoria non ha iniziato a funzionare.
  • Man mano che la quantità di memoria libera diminuisce, OS X inizierà a eseguire il suo flagger di memoria e vedrai aumentare la quantità di "inattivo". Ogni bit di "inattivo" era precedentemente "attivo".
  • Quando si esaurisce la memoria libera, le pagine dalla pila "inattiva" verranno sfogliate. Il flagger di memoria eseguirà anche l'inclinazione completa ordinando la memoria in attiva e inattiva. In genere, vedrai un sacco di "inattivo" durante la scrittura di swap, indicando che il flagger della memoria sta facendo quello che dovrebbe.

Le pagine devonoessere classificato come inattivo prima di essere sostituito. Questo è ciò che significa la citazione dal sito degli sviluppatori Apple quando dice "Queste pagine contengono dati validi ma possono essere rilasciate dalla memoria in qualsiasi momento". Questo è in opposizione alle pagine attive, che non verranno rilasciate fino a quando non saranno state retrocesse inattive. Esistono vari modi per rilasciare le pagine; se la pagina è stata mappata da un file e non è stata modificata, può essere eliminata immediatamente e riletta su richiesta. Allo stesso modo se si tratta di memoria che era stata precedentemente scambiata e non modificata da quando è stata scambiata. I programmi possono anche allocare esplicitamente cache e memoria eliminabile, per archiviare dati che possono essere dimenticati e ricreati su richiesta (ma il motivo per cui un programma alloca cache è se ci vuole tempo significativo per ricreare quei dati.

Pertanto, esaminando la quantità di memoria "inattiva" in Activity Monitor e vedendo che c'è molta inattività mentre il computer sta scrivendo per scambiare, si dice solo che il sistema funziona come previsto.

C'è anche una confusione tra memoria inattiva e cache dei file. Non sono sicuro del motivo per cui c'è quella confusione, perché Activity Monitor li elenca già in intestazioni separate. La cache è la memoria utilizzata per archiviare dati recenti che sono stati letti o scritti dal file system, nel caso in cui debbano accedere nuovamente. Quando la memoria è insufficiente, OS X tende a sbarazzarsi prima della cache. Se hai il thrashing di swap e Activity Monitor mostra un grosso mucchio di cache (NON inattivo), questo sarebbe un problema. Ma la memoria inattiva è una cosa diversa.

In caso di dubbio, ignora la distinzione tra "inattivo" e "attivo". Considerali come un pezzo di "memoria utilizzata dai programmi" e aggiungi i due numeri insieme. Questo è ciò che fa ogni altro sistema operativo quando ti parla dell'utilizzo della memoria.

NOTA per OS X 10.9: Mavericks ha introdotto la "compressione della memoria" che è, più o meno, un altro livello di scambio. Le pagine attive ora vengono classificate inattive, quindi compresse (che potrebbero essere visualizzate come memoria del kernel in base agli strumenti che stai utilizzando), quindi scritte per scambiare all'aumentare dell'utilizzo della memoria. Mavericks ha anche smesso di mostrare numeri separati per attivo e inattivo in Activity Monitor, dal momento che risulta non essere una cosa utile da guardare, soprattutto date le idee sbagliate che lo circondano.


4

Al momento non esiste un modo semplice per regolare il comportamento di swappiness (o così viene chiamato) di macos X. Tuttavia, ci sono alcuni hack disponibili (richiede account sviluppatore e SDK):

http://cestdelamerde.com/archives/22-Killing-Mac-OS-X-Swapping-How-To-Disable-dynamic_pager.html

http://dropsafe.crypticide.com/article/3848

In bocca al lupo!

PostScript. Immagino che potresti voler leggere questa risposta (anche da me) per avere una recensione più generale di quali memorie attive, inattive e di altro tipo in MacOSX: Memoria cablata vs. Memoria attiva in OS X


Grazie per le tue risposte Regolare lo swappiness sarebbe sicuramente di aiuto - mi dispiace che non sia facile! Per quanto riguarda il primo link, sto davvero cercando un hack che non includa completamente la disabilitazione di swap / dynamic_pager e il riavvio, dal momento che richiede troppo sforzo per disabilitare l'utilizzo dello swap, oltre a lasciare il sistema instabile quando ci si avvicina a una quantità bassa di memoria inattiva e libera. Il secondo collegamento si riferisce al problema dei file di scambio in continua crescita. Sebbene sia un problema importante soprattutto quando si sta esaurendo i file di scambio, non è molto rilevante per la mia domanda in questo thread ...
Motin

4

Non è una soluzione permanente, ma almeno può aiutare a recuperare un po 'di memoria inattiva, evitando potenzialmente il temuto scambio: http://itunes.apple.com/nz/app/freememory/id460931672?mt=12

Lo strumento è gratuito e abbastanza facile da usare. Una volta avviato, seleziona l'opzione "Memoria libera" nella barra degli strumenti / menu di sistema.

A differenza del display della memoria ActivityMonitor, mostra solo la memoria libera, che sembra essere un indicatore migliore dello scambio in corso o meno.


Sto valutando questa app dal tuo suggerimento circa due mesi fa. Sembra che questa app aumenti davvero la quantità di memoria "libera" attraverso vari trucchi, tra cui rivendicare in modo aggressivo molta memoria per sé, quindi rilasciarla. Tuttavia, ciò provoca lo scambio della stessa quantità di memoria che ha "liberato". Questo per dire che non aiuta a liberare memoria, spostando solo i contenuti della memoria da ram a hd. Alla fine, ciò provoca molti swap-in quando tento di utilizzare le applicazioni che erano aperte mentre liberavo memoria, poiché molti dei suoi VM sono ora in scambio. :(
Motin

@Motin, ho usato FreeMemory per mesi e non lo fa, almeno nella mia esperienza. Se dovessi educare a indovinare (in base a ciò che ho visto in Activity Monitor), la differenza è che FM consuma prima la memoria "attiva", che ha la priorità sulle cache del disco. "Libera" altra memoria essendo più prioritaria, quindi libera la propria memoria. Non l'ho mai visto aggiungere allo swap in modo significativo (forse una piccola quantità che viene allocata mentre consuma).
mancanza di palpebre

2

A partire da OS X 10.5 ci sono evidenti problemi di gestione della memoria in MAC OS X. Il web era già allora ingombro di lamentele sul rallentamento del sistema dopo qualche tempo. All'epoca avevo una macchina più lenta, Mac Mini con 1 GB di RAM, quindi ho (erroneamente) concluso che era dovuto a hardware inferiore.

Ora ho 2010 MBP, core i7, 8 GB di RAM, doppia GPU. Mac OS X Snow Leopard è stato doloroso, ma dopo essere migrato su OS X Lion, lavorare su MAC con alcune cose serie ha iniziato a diventare un incubo.

Finalmente sono riuscito a riprodurre lo scenario problematico, quindi ho eseguito il test e registrato lo schermo, in video.

MAC OS X Lion problema di prestazioni - gestione della memoria interrotta

Eseguo il comando tar + bzip, che è roba unix di base, sulla grande quantità di file di immagini, nella mia cartella Immagini /. Appena prima di iniziare, eseguo il comando "purge" per eliminare i dati del programma inattivi / memorizzati nella cache.

Nel video puoi vedere che la memoria libera inizia a cadere molto velocemente e che inattiva è in costante aumento. Se dai un'occhiata al comando "bsdtar", ci vuole solo un frammento di RAM, quindi il problema non è in questo processo. Non si può dire che si tratti di una perdita di memoria del programma, perché il problema non sarebbe in RAM inattiva, piuttosto in attiva / cablata.

Quando la memoria libera è scesa sotto i 100 MB, ho avviato alcune app, come Safari, iPhoto e MS Word, e puoi vedere nel video che ci vogliono anche pochi minuti per avviare un'app, quando normalmente (quando c'è RAM libera), richiederebbe 3-5 secondi per caricare.

Corro lo stesso scenario e gli stessi comandi sul mio Linux Centos 6 box, nessun problema lì! L'utilizzo della memoria è di circa 10-20 MB, nessun problema con cache / buffer.

La gestione della memoria deve essere molto rotta in Mac OS X!


2
Quello che vedi è il sistema di memorizzazione nella cache dei file nella memoria. Concordo sul fatto che ci sia un problema, in quanto la cache non sembra mai essere stata eliminata ... ma la memorizzazione nella cache stessa (e la crescita della memoria inattiva di conseguenza) è una funzionalità di prestazione sana e talvolta utile.
mancanza di palpebre

Anche l'ambiente di test è tutt'altro che sterile. Non possiamo dire cosa stia facendo QuickTime Player o qualsiasi altro programma aperto.
chrishiestand,

1

Scommetto che non c'è una risposta giusta a questo. È lo stesso con la memoria che rimane attiva quando metti il ​​Mac in stop, cresce e cresce con ogni sonno che fai.

Sul lato "divertente" (noto anche come costoso), è possibile aggiornare la memoria o sostituire l'HDD con un SSD, quindi lo scambio non sarà quello di un hit di prestazione. Ho scelto la prima opzione, poiché la memoria Corsair è ora disponibile a un prezzo ragionevole.

16 GB di RAM


2
Tieni presente che gli SSD hanno cicli di scrittura limitati. Si noti inoltre che per gli SSD non-trim abilitati, le scritture possono eventualmente essere costose poiché la cella Flash deve essere cancellata.
Wavy Crab,

Puoi citare una fonte sul problema "La sospensione provoca un aumento dell'utilizzo della memoria"?
GordonM,

Posso citare la mia esperienza? :) Ho fatto una ricerca veloce e ho trovato questo: discussioni.apple.com/message/21624847#21624847 + ci sono molti argomenti relativi alla memoria inattiva che non viene cancellata quando necessario. Personalmente ho visto come, dopo ogni sonno, la memoria inattiva rimane com'era prima e aumenta. 'purge' è un'opzione, ma non vorrei eliminare la memoria inattiva una volta ogni 20 minuti (scommetto che sarebbe il caso di 4 GB di RAM).

1
Gli SSD di @WavyCrab possono avere cicli di scrittura limitati, ma non c'è alcuna possibilità che tu raggiunga quel limite. Non me ne preoccuperei, a meno che non sia un SSD per un Data Center. In ogni caso, se si vuole abbattere l'SSD con una scrittura eccessiva, si dovrebbe abbattere prima un HDD.
andreadi,
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.