In che modo FreeBSD alloca la memoria?


9

Sono consapevole che questo è semplificato / spiegazione generalizzata, ma top(1)la memoria si divide utilità in FreeBSD in sei piscine- Active, Inactive, Wired, Cache, Bufferse Free. Esempio top(1)dall'output:

Mem: 130M Active, 42M Inact, 51M Wired, 14M Cache, 34M Buf, 648K Free
Swap: 512M Total, 512M Free

Activeviene utilizzato dai processi in esecuzione e Wiredviene utilizzato principalmente per il kernel. Inactiveè memoria di processi chiusi che è ancora memorizzata nella cache nel caso in cui debba essere riutilizzata, Cachedati memorizzati nella cache, Buffersbuffer del disco (suppongo sia simile all'output di cachedLinux free(1)(?)) ed Freeè memoria completamente inutilizzata. Sono corretto che Kernel di FreeBSD automaticamente assegna lo spazio da Inactive, Cachee Bufferspiscine per Activeo Wired, se necessario?

Risposte:


13

Per farla breve, attiva e cablata viene utilizzata la memoria che non deve o non può essere scambiata con memoria libera. Mentre inattivo può essere correttamente sostituito, ma è ancora posseduto (non liberato) da un processo o dal kernel, quindi questa non è memoria utilizzata pesantemente, ma ancora utilizzata.

Nuovo è il bucato che è un elenco di pagine di memoria sporche, che potrebbero dover essere scritte sul dispositivo di scambio. O se la memoria sporca doveva essere scambiata o meno, viene aggiunta nuovamente nella coda inattiva.

La memoria cablata non dovrebbe essere scambiata, per sicurezza (nel caso del kernel) o per l'ottimizzazione del processo dell'utente (come ZFS). La memoria cablata viene utilizzata per le cache dei filesystem, che potrebbero essere liberate dal kernel. Al minimo per ZFS questo può essere visto come memoria per lo più libera.

La memoria libera è decisamente gratuita.

La cache (ora deprecata, immagino) è pronta per essere liberata, poiché è già stata scambiata e solo lì per una possibile riallocazione.

Il buffer viene utilizzato come cache dalla maggior parte dei filesystem (UFS, FAT, ...) ed è la quantità di memoria utilizzata dai filesystem. Può essere actice, inattivo o cablato.

ARC (Adaptive Replacement Cache) è la cache utilizzata da ZFS ed è la memoria che può essere liberata quando necessario.

Dal Wiki di FreeBSD sulla memoria

Classi di memoria

Attivo

  • Contiene pagine "attivamente" (recentemente) a cui fa riferimento userland
  • Contiene un mix di pagine pulite e sporche
  • Le pagine vengono scansionate regolarmente dal demone (ogni pagina viene visitata una volta ogni vm.pageout_update_period secondi)
  • Le scansioni controllano se la pagina è stata referenziata dall'ultima scansione
  • Se un numero sufficiente di scansioni viene completato senza visualizzare un riferimento, la pagina viene spostata nella coda inattiva
  • Implementa pseudo-LRU

Non attivo

  • Contiene pagine scadute dalla coda attiva
  • Contiene pagine eliminate dalla cache del buffer
  • Contiene un mix di pagine pulite e sporche
  • Le pagine vengono scansionate dal demone della pagina (a partire dalla testa della coda) quando c'è una carenza di memoria:
    • Le pagine a cui è stato fatto riferimento vengono spostate indietro nella coda attiva o nella coda della coda inattiva
    • Le pagine sporche vengono spostate nella coda della coda della biancheria
    • Le pagine pulite, senza riferimenti, possono essere liberate e riutilizzate immediatamente
  • Implementa LRU di seconda possibilità

Lavanderia

  • Coda per la gestione di pagine inattive sporche, che devono essere pulite ("lavate") prima che possano essere riutilizzate
  • Gestito da un thread separato, il thread di lavanderia, anziché il demone della pagina
  • Il thread della lavanderia lava un piccolo numero di pagine per bilanciare le code inattive e quelle della lavanderia
  • La frequenza del riciclaggio dipende da:
    • Quante pagine pulite sta liberando il daemon di pagine; più libertà contribuisce a una maggiore frequenza di riciclaggio
    • La dimensione della coda di bucato rispetto alla coda inattiva; se la fila di biancheria sta crescendo, laveremo più frequentemente
  • Le pagine vengono scansionate dal thread della lavanderia (a partire dalla coda della coda):
    • Le pagine a cui è stato fatto riferimento vengono spostate indietro nella coda attiva o nella coda della coda della lavanderia
    • Le pagine sporche vengono lavate e quindi spostate vicino all'inizio della coda inattiva

Gratuito

  • Memoria disponibile per l'uso da parte del resto del sistema.

Cablata

  • Memoria non paginabile: non può essere liberata fino a quando non viene esplicitamente rilasciata dal proprietario
  • La memoria dell'utente può essere cablata tramite mlock (2) (soggetto ai limiti di sistema e per utente)
  • Gli allocatori di memoria del kernel restituiscono la memoria cablata
  • Il contenuto di ARC e la cache del buffer sono cablati
  • Parte della memoria è cablata in modo permanente e non viene mai liberata (ad esempio, il file del kernel stesso)

Da La progettazione e l'implementazione del sistema operativo FreeBSD capitolo 6.12 Sostituzione della pagina (Non più completamente accurato, ma qui per riferimento alla vecchia domanda):

Il kernel divide la memoria principale in cinque liste:

  1. Cablato : le pagine cablate sono bloccate in memoria e non è possibile effettuare il paging. In genere queste pagine vengono utilizzate dal kernel o dal pager della memoria fisica, oppure sono state bloccate con mlock . Inoltre, tutte le pagine utilizzate per contenere le pile di thread di processi caricati (cioè non scambiati) sono anch'esse cablate.
  2. Attivo : le pagine attive vengono utilizzate da una o più aree di memoria virtuale. Sebbene il kernel sia in grado di eliminarli, è probabile che ciò causi nuovamente un processo attivo che li ripropone.
  3. Inattivo : le pagine inattive possono essere sporche e avere contenuti che sono ancora noti, ma di solito non fanno parte di alcuna regione attiva. Se i contenuti della pagina sono sporchi, i contenuti devono essere scritti nell'archivio di backup prima di poter riutilizzare la pagina. Una volta che la pagina è stata pulita, viene spostata nell'elenco della cache. Se il sistema diventa a corto di memoria, il demone pageout può provare a spostare le pagine attive nell'elenco inattivo nella speranza di trovare pagine che non sono realmente in uso. I criteri di selezione utilizzati dal demone pageout per selezionare le pagine da spostare dall'elenco attivo all'elenco inattivo sono descritti più avanti in questa sezione. Quando gli elenchi di memoria libera e cache scendono al minimo, il daemon pageout attraversa l'elenco inattivo per creare più cache e pagine libere.
  4. Cache : le pagine della cache hanno contenuti ancora noti, ma non fanno parte di una mappatura. Se si verificano errori nella regione attiva, non fanno parte di alcuna mappatura. Se vengono rilevati errori in un'area attiva, verranno spostati dall'elenco cache all'elenco attivo. Se vengono utilizzati per una lettura o una scrittura, verranno prima spostati dall'elenco cache nella cache buffer e infine rilasciati nell'elenco inattivo. Una chiamata di sistema mlock può recuperare una pagina dall'elenco cache e collegarla. Le pagine dell'elenco cache sono simili alle pagine inattive, tranne per il fatto che non sono sporche, o perché non sono state modificate da quando sono state inserite nella pagina o perché sono state scritte nel loro archivio di backup. Possono essere richiesti per un nuovo utilizzo quando è necessaria una pagina.
  5. Gratuito : le pagine libere non hanno contenuti utili e verranno utilizzate per soddisfare le nuove richieste di pagefault.

Per rispondere alla tua domanda originale

Sono corretto che il kernel FreeBSD alloca automaticamente lo spazio dai pool Inattivo, Cache e Buffer a Attivo o Cablato, se necessario?

Le pagine attive possono diventare inattive se non vengono utilizzate per un certo periodo di tempo. Se il kernel scambia una pagina inattiva, questa pagina viene spostata nell'elenco della cache . Le pagine nell'elenco cache non fanno parte della mappatura virtuale di alcun processo ma possono essere facilmente recuperate, come attive o cablate . O quando necessario per l'I / O come cache buffer .

La memoria cablata non può essere sostituita dalla memoria principale. Se è cablato da un processo, deve essere non cablato con la munlockchiamata per diventare di nuovo memoria attiva .

La memoria attiva , inattiva e cablata può essere liberata dal processo o dal kernel e aggiunta all'elenco gratuito .


Ho appena notato un errore nella mia domanda iniziale. Ho chiesto "Ho ragione che il kernel FreeBSD automaticamente assegna lo spazio da Inactive, Wired, Cachee Bufferspiscine per Activeo Wired, se necessario?" mentre Volevo chiedere: "Ho ragione che il kernel FreeBSD automaticamente assegna lo spazio da Inactive, Cachee Bufferspiscine da Activeo Wiredse necessario?". Ho aggiornato la mia domanda iniziale. Quindi, in poche parole, di memoria utilizzate in FreeBSD è Wired+ Activee se quei due piscine hanno bisogno di ulteriore quantità di memoria, allora questo è preso da Inacative, Cached, Bufferso Freepiscine?
Martin,

@Martin sì, sembra giusto. Ho aggiornato la mia risposta alla tua domanda.
Raphael Ahrens,
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.