Esiste una relazione tra la frammentazione della memoria e se lo swap è abilitato o meno su un sistema?


8

Una delle risposte a Ho bisogno di spazio di scambio se ho una quantità di RAM più che sufficiente? mi chiedevo se esiste una relazione tra la frammentazione della memoria misurata da cat /proc/buddyinfo e se lo swap è in uso o meno. Per essere più specifici, mi chiedo se l'utilizzo dello swap può ridurre la frammentazione della memoria. Durante una normale giornata di lavoro con swap off sul mio sistema ho questo:

tvbox@tvbox-G31M-ES2L:~$ cat /proc/buddyinfo
Node 0, zone      DMA      3      3      4     14     16      6      2      0      0      1      0 
Node 0, zone   Normal   1564   1052    462    356    240    109     33     21      6      1      0 
Node 0, zone  HighMem     43   1972    839    285    183    109     98     34     16      0      0 
tvbox@tvbox-G31M-ES2L:~$ free
             total       used       free     shared    buffers     cached
Mem:       2053888    1821904     231984     171376     299908     812940
-/+ buffers/cache:     709056    1344832
Swap:            0          0          0

Nota: questo sistema ha un tempo di attività che non supera mai le 18 ore.

Su un sistema più utilizzato ho questo:

me@me-zippy:~$ cat /proc/buddyinfo
Node 0, zone      DMA    149    106     70     26     15      5      4      0      0      2      0 
Node 0, zone   Normal   2455   3527   4651   1421    367    157     61     19     14      3      0 
Node 0, zone  HighMem      7     43     75    266    166    162     91     43     27      0      0 
me@me-zippy:~$ free -h
             total       used       free     shared    buffers     cached
Mem:          7.4G       7.0G       351M       281M       116M       6.0G
-/+ buffers/cache:       967M       6.4G
Swap:           0B         0B         0B
me@me-zippy:~$ uptime
 12:01:49 up 3 days,  3:20,  2 users,  load average: 0.52, 0.23, 0.17

Noterai che nessuno di questi sistemi ha lo swap abilitato.


4
Per curiosità, perché dovrebbe importare se la memoria fosse frammentata? Non è come un disco rigido in cui il tempo di ricerca è importante. La memoria apparirà sempre logicamente contigua nello spazio degli indirizzi virtuali del processo, quindi lo spazio utente non può nemmeno dire se la memoria è frammentata a livello fisico. È perché le tabelle di traduzione delle pagine diventano più complicate?
Celada,

Buona domanda. La condizione è stata sollevata come motivo per utilizzare lo swap. Rimango scettico, quindi sto cercando qualsiasi collegamento tra l'utilizzo dello swap e la frammentazione della memoria. Non mi aspetto di trovarne uno, ma sono sempre disposto a cambiare la mia posizione di fronte a nuove informazioni. Potrei finire per rispondere a questo da solo dopo ulteriori test.
Elder Geek,

Risposte:


3

Lo scambio consente di spostare le pagine fisiche, nel senso che a una pagina utilizzata per uno scopo potrebbe essere scambiato il contenuto e utilizzato per un altro scopo.

Sotto un sistema di gestione della memoria virtuale di varietà da giardino, non esiste una frammentazione della memoria fisica per quanto riguarda le applicazioni. Ogni pagina allocata da un'applicazione può essere portata ovunque nella memoria fisica, non c'è motivo per cui due pagine consecutive nella memoria virtuale debbano avere una particolare vicinanza nella memoria fisica.

Ci sono molti casi in cui la frammentazione della memoria è un problema: qualsiasi circostanza in cui la posizione della memoria fisica è importante. Ciò comprende:

  • Paravirtualizzazione , in cui le macchine virtuali decidono chi possiede quale pagina fisica con una granularità più grossolana di una pagina.
  • Allo stesso modo, i cluster in cui più nodi condividono lo stesso pool RAM.
  • Memoria utilizzata dalle periferiche, che di solito richiede grandi buffer contigui.
  • Ottimizzazioni come pagine enormi .

In assenza di scenari "complessi", la frammentazione della memoria fisica potrebbe portare a problemi di connessione di un nuovo dispositivo che richiede un pool di memoria contigua (il kernel mantiene tali pool per quello, ma potrebbe essere necessario ingrandirli se un driver improvvisamente fa un grande richiesta). Se l'utilizzo del dispositivo è costante, la frammentazione fisica non avrebbe importanza e, in particolare, non farebbe rallentare o esaurire lo spazio di un'applicazione.

È possibile che la frammentazione dello spazio degli indirizzi fisici possa portare a una maggiore quantità di memoria utilizzata nel kernel per rappresentare l'elenco libero. Non credo che ciò avvenga in Linux, ma sono ben lungi dall'essere un esperto nella gestione della memoria.

Riassumendo, consentire lo scambio di parte di un'applicazione non consente a questa applicazione di allocare più memoria, ma potrebbe consentire ad alcuni driver hardware di allocare la memoria di cui hanno bisogno.

L'aggiunta di swap non ha alcun effetto sullo spazio di memoria virtuale dell'applicazione. Questo è il punto di scambio, dopo tutto: è trasparente per le applicazioni.

Tuttavia, è possibile che l'aggiunta di swap a una macchina abbia un'influenza indiretta sulla frammentazione all'interno dello spazio di memoria virtuale di un'applicazione. Se il sistema esaurisce la memoria virtuale, l'applicazione dovrà accontentarsi di ciò che ha. Se l'applicazione utilizza la maggior parte della memoria allocata dal sistema operativo, ciò col tempo causerà la frammentazione all'interno di quello spazio poiché piccoli blocchi vengono liberati qua e là. Se l'applicazione ha più memoria virtuale (alcune delle quali vengono scambiate), questo offre al gestore della memoria più spazio di manovra e riduce quindi il rischio che l'applicazione rimanga a corto di memoria, con tre blocchi separati da 2kB disponibili quando desiderava un singolo Oggetto da 4kB.


Non è interessante come ogni risposta porti a una nuova domanda? Ora mi incuriosisco sull'ordine delle operazioni di gestione della memoria e su quali tecniche per liberare la memoria debbano fallire prima che venga raggiunta una condizione di memoria esaurita. La mia ipotesi è che la cache sia la meno importante e verrebbe scaricata per prima. So che c'è un nocciolo di verità qui da qualche parte (gioco di parole intenzionale). ;-)
Elder Geek

@ElderGeek - Documentation / cgroups / memory.txt è probabilmente un buon punto di partenza. Sebbene sia irrimediabilmente obsoleto , fa una panoramica del controller di memoria del kernel abbastanza bene.
Mikeserv,

@mikeserv Grazie per quello. Ho anche scoperto - landley.net/writing/memory-faq.txt che sembra anche essere "irrimediabilmente obsoleto", ma almeno sembra la mia teoria riguardo al dumping logico della cache prima di liberare la RAM prima di ricorrere all'uccisione i processi sono accurati. Dubito che imparerò molto di più a riguardo senza approfondire il codice stesso. Questo potrebbe essere un po 'al di là di me dato che non ho scritto alcun codice oltre lo script bash per decenni ...
Elder Geek
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.