Perché la RAM parzialmente piena causa un ritardo?


53

Perché la RAM parzialmente piena (diciamo l'80%), fa ritardare molto il dispositivo, anche se c'è un po 'di spazio disponibile per memorizzare più dati? Quello che mi aspetto è che continui a funzionare bene fino al 99%.

Lo noto sul cellulare più che sul PC, poiché ha una RAM più piccola, ad esempio il mio cellulare ha 2 GB di RAM; quando ho meno di 1 GB di RAM libera, è molto indietro! Perché succede, anche se ha ancora ~ 1 GB da usare?


28
Sospettavo che tu stia supponendo che la RAM disponibile non venga utilizzata. Quindi vedi il 20% di RAM disponibile e pensi che venga utilizzato solo l'80% della RAM. Questo non è corretto, la RAM può essere sia utilizzata che disponibile. (Ad esempio, la macchina che sto usando ora ha 32 GB di RAM e 21,1 GB sono disponibili, ma solo 1,8 GB sono gratuiti.)
David Schwartz,

2
Intendi il mio spazio libero su disco fisso con la mia RAM? sicuramente no.
Mohammed Noureldin,

3
Possono essere sostituiti, certo. Ma ciò avrà un enorme effetto negativo sulle prestazioni, esattamente come stai vedendo. Se il set di lavoro supera la RAM, le prestazioni saranno terribili, indipendentemente dalla quantità di RAM disponibile.
David Schwartz,

3
Cosa ti fa pensare che sia la percentuale di RAM a causare il ritardo del dispositivo?
enkryptor,

4
@MohammedNoureldin Immagino ci debba essere un motivo per cui la tua RAM è occupata (un numero di processi sta funzionando e sta facendo qualcosa). Questo potrebbe essere lo stesso motivo per cui il dispositivo è in ritardo. Il caricamento della RAM potrebbe essere solo un sintomo, non il motivo stesso.
enkryptor,

Risposte:


70

C'è molto da fare qui, ma cercherò di spiegarlo nel modo più semplice possibile e in un modo applicabile a qualsiasi sistema operativo.

Ci sono 2 principi di base qui:

  1. La somma totale di tutto ciò che deve essere nella RAM e quelle cose che trarrebbero beneficio dall'essere nella RAM è quasi sempre maggiore della dimensione della RAM. Le cose che trarrebbero beneficio dall'essere nella RAM includono set di lavoro di processo e l'elenco di standby. Quest'ultimo contiene dati e codice che una volta erano in uso attivo ma da allora sono passati all'inattività. Gran parte di questo verrà usato di nuovo, alcuni abbastanza presto, quindi è utile mantenerlo nella RAM. Questa memoria funge da tipo di cache ma non è davvero essenziale, così come lo è nella categoria di memoria disponibile. Come la memoria libera, può essere rapidamente assegnato a qualsiasi programma che ne abbia bisogno. Nell'interesse delle prestazioni, la memoria di riserva dovrebbe essere grande.

  2. La frequenza di utilizzo dei blocchi di memoria è tutt'altro che casuale, ma può essere prevista con notevole precisione. La memoria è divisa in blocchi, spesso 4K byte. Alcuni blocchi sono accessibili più volte al secondo, mentre altri non sono stati accessibili per molti minuti, ore, giorni o addirittura settimane se il sistema è rimasto attivo abbastanza a lungo. Vi è una vasta gamma di utilizzo tra questi 2 estremi. Il gestore della memoria sa quali blocchi sono stati aperti di recente e quelli che non lo hanno fatto. È ragionevole supporre che presto sarà necessario di nuovo un blocco di memoria a cui è stato effettuato l'accesso. La memoria a cui non è stato effettuato l'accesso di recente probabilmente non sarà necessaria in qualunque momento presto. La lunga esperienza ha dimostrato che questo è un principio valido.

Il gestore della memoria sfrutta il secondo principio per mitigare ampiamente le conseguenze indesiderabili del primo. Per fare ciò, fa un atto di bilanciamento nel mantenere i dati di recente accesso nella RAM, mantenendo nel contempo i dati usati raramente nei file originali o nel file di paging.

Quando la RAM è abbondante, questo atto di bilanciamento è facile. Gran parte dei dati non utilizzati di recente possono essere conservati nella RAM. Questa è una buona situazione.

Le cose si complicano quando aumenta il carico di lavoro. La somma totale di dati e codice in uso è maggiore ma la dimensione della RAM rimane la stessa. Ciò significa che un sottoinsieme più piccolo di questo può essere mantenuto nella RAM. Alcuni dei dati utilizzati meno di recente non possono più essere nella RAM ma devono essere lasciati sul disco. Il gestore della memoria si impegna molto per mantenere un buon equilibrio tra la memoria in uso attivo e la memoria disponibile. Ma all'aumentare del carico di lavoro, il gestore della memoria sarà costretto a fornire più memoria disponibile ai processi in esecuzione. Questa non è una buona situazione, ma il gestore della memoria non ha scelta.

Il problema è che lo spostamento dei dati da e verso la RAM durante l'esecuzione dei programmi richiede tempo. Quando la RAM è abbondante, non accadrà molto spesso e non verrà nemmeno notata. Ma quando l'utilizzo della RAM raggiunge livelli elevati, accadrà molto più spesso. La situazione può peggiorare al punto che si impiega più tempo a spostare i dati da e verso la RAM di quanti ne si impiegano realmente. Si tratta di un thrashing, cosa che il gestore della memoria si sforza molto di evitare, ma con un carico di lavoro elevato spesso non può essere evitato.

Il gestore di memoria è dalla tua parte, cercando sempre il meglio per mantenere prestazioni ottimali anche in condizioni avverse. Ma quando il carico di lavoro è ottimo e la memoria disponibile si esaurisce, è necessario fare cose cattive per continuare a funzionare. Questa è in effetti la cosa più importante. La priorità è innanzitutto di mantenere le cose in esecuzione, quindi renderle il più velocemente possibile.


1
La tua risposta mi ha aiutato molto, grazie! Questa memory mangerè una parte del mio OSdiritto? quindi se avessi a che fare con i puntatori e queste cose di livello molto basso, sarebbe ancora in grado di fare il paging?
Mohammed Noureldin,

7
Il gestore della memoria fa parte del sistema operativo. Il paging è una funzione di base del gestore della memoria ed è essenziale per il funzionamento come la respirazione è per te e I. Non può essere fermato.
LMiller7,

2
@MohammedNoureldin: quando si scrivono applicazioni per lo spazio utente (le cui viste di memoria sono isolate da quella del kernel e di altri processi) non è possibile accedere direttamente alla memoria fisica . Tutto ciò a cui puoi accedere è una vista della memoria gestita dal - hai indovinato - gestore della memoria con tutte le sue funzionalità (probabilmente) incluso il paging. I puntatori di memoria si riferiscono solo ai punti negli spazi degli indirizzi di una vista di memoria. Sono un concetto di linguaggio usato sia nel kernel che nel codice dello spazio utente, ma ciò non significa che le due viste di memoria siano identiche. Non confondere la gestione della memoria di processo con il kernel MM!
David Foerster,

6
È "ovvio" o "ben noto", ma forse dovrebbe ancora essere aggiunto in questa risposta: la memoria (ram) è nell'ordine di 1000 volte più veloce di un disco rigido (beh, dipende da molte cose, ad esempio ssd / ide / sata, ecc.). Il sistema operativo esegue il codice da ram (+ cache), non da disco. Quando la memoria si esaurisce e il sistema operativo deve "scambiare" porzioni di codice ("non utilizzato") dalla memoria al disco, per liberare ram per eseguire qualcos'altro, ciò richiederà un sacco di tempo (lo scambio), e se ciò accade spesso (es: hai molti programmi, ognuno ha bisogno di uno scambio per caricare il proprio codice in memoria), rallenterà molto le cose.
Olivier Dulac,

3
Di solito non usiamo il termine "scambio" per fare riferimento al caricamento del codice in memoria. Questo di solito viene chiamato "difetto". Di solito, il termine "scambio" viene utilizzato solo per le informazioni che devono essere scritte sul disco prima che possano essere espulse dalla RAM.
David Schwartz,

29

Tutti i sistemi operativi moderni utilizzano memoria altrimenti inutilizzata per la memorizzazione nella cache dei dati, in modo che sia possibile accedervi dalla RAM veloce anziché dalla memoria più lenta. Generalmente segnaleranno questo come memoria libera, poiché le applicazioni possono svuotare la cache e utilizzarla se necessario, ma è ancora effettivamente utilizzata. Meno c'è, meno dati possono essere memorizzati nella cache e più lento sarà il computer.


11
In realtà, le applicazioni non devono "svuotare" la cache. Richiedono solo RAM dal sistema operativo. Il sistema operativo, visto che non ha RAM inutilizzata, cancellerà parte della cache dei file e fornirà all'applicazione la RAM ora azzerata. L'applicazione non è in grado di dire da dove provenga quella RAM.
Salterio,

5
@MSalters Sì, sono d'accordo, l'applicazione richiede RAM e il sistema operativo cancella la cache, se necessario. Stavo cercando di mantenerlo semplice.
Mike Scott,

Questo è stato in qualche modo chiaro, ma sono un po 'più consapevole dei dettagli, quindi ho la sensazione che manchi qualcosa e ho bisogno di maggiori dettagli. La risposta di @Liller mi ha aiutato davvero, sarebbe fantastico se potessi rivedere informazioni in esso.
Mohammed Noureldin,

4

Questa risposta è stata principalmente riscritta per riorganizzare la struttura e rendere più chiaro il messaggio. L'ho anche aperto come risposta wiki della community; Sentiti libero di modificare.

Il paging è uno schema di gestione della memoria attraverso il quale blocchi di memoria di dimensioni fisse hanno processi assegnati a loro. Quando l'utilizzo della memoria sale a un livello elevato (ovvero l'80% della capacità), il paging inizia a estendersi dalla RAM alla vRAM (RAM virtuale).

vRAM si trova nella memoria di sistema, generalmente all'interno di un disco rigido o in altre posizioni di memorizzazione considerevoli.

Ai processi viene assegnata una parte del disco rigido da eseguire come memoria e tratteranno la loro sezione come RAM. Questo è un processo perfettamente normale, tuttavia, quando aumenta il tempo impiegato per trasferire i dati da e verso la vRAM, le prestazioni del sistema diminuiscono.

Mentre alla RAM dedicata si accede direttamente tramite la scheda madre dalla CPU, che fornisce una connessione veloce, la RAM virtuale deve attraversare il cablaggio tra la scheda e la posizione della vRAM.

Ciò, tuttavia, causa solo un leggero impatto sulle prestazioni. Quando la velocità di paginazione verso vRAM aumenta drasticamente (quando la RAM dedicata si avvicina alla capacità), si verifica il thrashing.

Il thrashing è la pratica di trasferire rapidamente e rapidamente pagine di memoria nella tua memoria virtuale. Ciò comporta un enorme tributo sulle prestazioni poiché è necessario dedicare più tempo a recuperare e indirizzare i dati.

Diciamo che vuoi scrivere un numero di 30 cifre. Puoi sederti accanto al tuo schermo con il tuo blocco note e scriverlo (usando la memoria dedicata), oppure ricordi pezzi di 5, correre nella stanza successiva e scriverlo sul tuo blocco note (usando la memoria virtuale). Entrambi ottengono il lavoro fatto, ma quale sarà più veloce?

Scopri di più su thashing qui !

Un grande ringraziamento ai contributori di questa risposta tra cui Daniel B , xenoid e Jon Bentley .


3
Non è come se il thrashing fosse intenzionale. È solo un effetto collaterale del paging e della competizione per la memoria fisica. Inoltre, la memoria virtuale non viene "creata" spostando le pagine su disco.
Daniel B,

Il thrashing è un sottoprodotto, vero, ma è immensamente utile in periodi in cui i processi si verificano, il che aiuta a prevenire il blocco della griglia. E sì, la memoria virtuale è occupata piuttosto che creata. Lo modificherò.
Sarà il

8
No, stai confondendo il cestino e il paging. Il cestino è solo il paging che diventa patologico.
xenoide,

@xenoid Paging è uno schema di gestione della memoria; È come dire che sto confondendo colpendo un cervo con la mia macchina e il sistema autostradale. Il thrashing è il processo che causa questo calo delle prestazioni; Sono tuttavia d'accordo con te sul fatto che questo è il risultato del sistema di paging.
Sarà il

1
I commenti incorporati, inseriti nella risposta wiki, sono liberi di essere modificati.
Sarà il

1

È perché il sistema operativo deve eseguire molte operazioni di paginazione (caricamento di parti di programmi attivi) e di scambio (spostamento dei dati dalla RAM su HD e viceversa) per mantenere il software in esecuzione. Quando devono essere caricate nuove pagine che potrebbero richiedere più spazio del 20% disponibile, il sistema operativo dovrà sostituire le pagine esistenti nella RAM che considera meno probabili per essere utilizzate presto. Soprattutto all'avvio di altri programmi. Scambiare e tornare alle pagine richiede molto tempo e rallenta drasticamente le prestazioni del tuo PC perché ora stai lavorando alla velocità dell'HD, non della RAM.

Aiuta un po 'su un HDD a creare una partizione speciale sul tuo HD e assegnarlo come spazio dedicato "swap" (non usarlo per file "reali") in modo che lo scambio sia meno influenzato dalla frammentazione degli HD.


La ROM è solo una nomenclatura per l'HD quando si parla di cache, paging, ecc. Tutto ciò che non è la memoria di lavoro. E la ROM di solito è più lenta della RAM, quasi sempre lo è stata. I vecchi computer hanno copiato i dati dalla ROM alla RAM (ROM Shadowing) all'avvio perché ha funzionato più velocemente.
Gilles Lesire,

1
Certo, ma ROM e RAM sono usate anche come memoria non volatile vs volatile? La ROM BTW di solito è più lenta, la ROM viene copiata nella RAM (ROM Shadowing) all'avvio per un miglioramento delle prestazioni. Ma certo, cambierò l'unico riferimento per correggere il tuo nitpicking. ;)
Gilles Lesire,

1

Ricorda, i dischi rigidi sono di un ordine di grandezza più lenti della RAM e la RAM stessa non è poi così veloce (nell'architettura generale). In ordine di velocità di accesso (dove ogni gradino è un ordine di grandezza più lento di quello sopra) hai

  1. Registri del processore - In termini pratici, i registri sono disponibili entro 1 ciclo del processore . Considerando che i processori eseguono miliardi di cicli al secondo (3 GHz = 3 miliardi di cicli al secondo), questo è follemente veloce.
  2. Cache processore : dipende dal livello, ma è comunque piuttosto rapido (3-5 cicli di disponibilità per cache L1).
  3. Memoria ad accesso casuale (RAM) : la parte casuale indica che non si conosce lo stato in cui si trova quando si accede ad esso. Pensa a un fattorino che deve fermarsi, ritira il pacco, cammina verso la porta e suona il campanello e aspetta una risposta. Forse non aspetti affatto, o forse aspetti un paio di minuti che la signora Smith si precipiti alla porta per il retro della casa. In termini pratici, stiamo parlando da 14 a 27 cicli (a seconda dello stato in cui si trovava la RAM quando abbiamo effettuato l'accesso).
  4. Hard Disk Drive - Qui c'è un processo fisico qui e mentre accade il più velocemente possibile stai aspettando che le teste si muovano e le tracce si muovano sotto quelle teste. In termini pratici, un HDD a 7.200 RPM può completare una rivoluzione in circa 4 ms , o da qualche parte circa 750.000 cicli per un processore a 3 GHz . È lento.

Virtual Memory Manager è un giocatore d'azzardo. Sta scommettendo che non hai bisogno di tutta la tua RAM per tutto il tempo, quindi fa un'ipotesi istruita e lancia i dadi che il tuo programma di documento (che è stato in background negli ultimi 10 minuti mentre leggi questo) non è davvero importante e lo spinge sull'HDD.

Ma poi fai clic di nuovo sul documento! Ora VMM deve caricare nuovamente tutti quei dati dall'HDD. Peggio ancora, se hai poca RAM, ora deve spingere altri dati (più giochi d'azzardo) sull'HDD per liberare spazio utilizzabile. A Linux piace vivere al limite qui. Riempirà la stragrande maggioranza della RAM con dati utilizzati di frequente (ottimo per server con pochi processi).


1
Sì, il gestore della memoria è un giocatore d'azzardo, ma potrebbe essere facilmente frainteso. Se l'accesso alla memoria fosse veramente casuale, allora il gestore della memoria avrebbe torto tanto spesso quanto l'intero sistema e si guasterebbe. Ma i programmi tendono ad esibire una forte località di riferimento. Cioè la maggior parte degli accessi alla memoria tendono ad essere localizzati in un'area relativamente piccola di memoria. Si muovono ma abbastanza lentamente per far funzionare il sistema. Le probabilità sono raggruppate a favore dei gestori di memoria e gli errori vengono corretti rapidamente. Ciò è stato dimostrato in decenni di esperienza
LMiller7,

Il Casuale nella memoria ad accesso casuale si riferisce al fatto che è possibile accedervi in ​​modo casuale. (Al contrario di dover aspettare che i dati passino sotto le testine di lettura come in un disco rigido o nastri, e quindi accedere ai dati in sequenza.).
Phil

0

Il thrashing risponde praticamente inchiodandolo. Se sei in grado, puoi ridurre al minimo la velocità con cui ciò accade riducendo la swappiness (la quantità di RAM che il sistema permetterà di utilizzare prima di spostare le cose nello spazio di swap). Mi piace impostare i sistemi in modo che rimangano fuori dallo scambio fino a quando il ram non raggiunge il 99% per le applicazioni server poiché l'impostazione predefinita significherebbe effettivamente che avrei bisogno di programmare per utilizzare le cose solo per l'80% del ram per sfruttare la cache senza essere penalizzato per il push il sistema nello spazio di scambio.

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.