Prestazione

Cos'è il vm.min_free_kbytes e come ottimizzarlo?

Cos'è il vm.min_free_kbytes e come ottimizzarlo?
Cos'è il vm.min_free_kbytes sysctl sintonizzabile per il kernel Linux e su quale valore dovrebbe essere impostato?  Studieremo questo parametro e come influisce su un sistema Linux in esecuzione in questo articolo.  Verificheremo il suo impatto sulla cache della pagina del sistema operativo e su malloc e cosa mostra il comando libero di sistema quando questo parametro è impostato.  Faremo alcune ipotesi plausibili sui valori ideali per questo parametro sintonizzabile e mostreremo come impostare vm.min_free_kbytes permanentemente per sopravvivere ai riavvii.  Quindi andiamo.

Come vm.min_free_kbytes funziona

Le allocazioni di memoria potrebbero essere necessarie al sistema per garantire il corretto funzionamento del sistema stesso.  Se il kernel consente di allocare tutta la memoria, potrebbe avere difficoltà quando è necessaria la memoria per le operazioni regolari per mantenere il sistema operativo senza intoppi.  Ecco perché il kernel fornisce il sintonizzabile vm.min_kbyte_liberi.  Il parametro sintonizzabile costringerà il gestore della memoria del kernel a mantenere almeno X quantità di memoria libera.   Ecco la definizione ufficiale dal documentazione del kernel linux: “Questo viene utilizzato per forzare la VM Linux a mantenere un numero minimo di kilobyte liberi.  La VM utilizza questo numero per calcolare un valore di watermark[WMARK_MIN] per ogni zona lowmem nel sistema. Ogni zona lowmem ottiene un numero di pagine gratuite riservate in base alla sua dimensione. È necessaria una quantità minima di memoria per soddisfare le allocazioni PF_MEMALLOC; se lo imposti su un valore inferiore a 1024 KB, il tuo sistema si romperà leggermente e sarà soggetto a un deadlock sotto carichi elevati. Impostando questo valore troppo alto, la tua macchina verrà immediatamente OOM.“

Convalida vm.min_free_kbytes Funziona

Per verificare che l'impostazione di min_free_kbytes funzioni come previsto, ho creato un'istanza virtuale Linux con solo 3.75 GB di RAM.  Usa il comando gratuito qui sotto per analizzare il sistema:

# libero -m

Guardando l'utilità di memoria libera sopra usando il flag -m per avere i valori stampati in MB.  La memoria totale è 3.da 5 a 3.75 GB di memoria.  Vengono utilizzati 121 MB di memoria, 3.3 GB di memoria sono liberi, 251 MB sono utilizzati dalla cache del buffer.  e 3.Sono disponibili 3 GB di memoria.

Ora andiamo a modificare il valore di vm.min_free_kbytes e guarda qual è l'impatto sulla memoria di sistema.  Faremo eco al nuovo valore nel filesystem virtuale proc per modificare il valore del parametro del kernel come di seguito:

# echo 1500000 > /proc/sys/vm/min_free_kbytes
# sysctl vm.min_kbyte_liberi

Puoi vedere che il parametro è stato cambiato in 1.5 GB circa ed è entrato in vigore.  Ora usiamo il gratuito comando di nuovo per vedere eventuali modifiche riconosciute dal sistema.

# libero -m

La memoria libera e la cache del buffer sono invariate dal comando, ma la quantità di memoria visualizzata come a disposizione è stato ridotto da 3327 a 1222 MB.  Che è una riduzione approssimativa della variazione del parametro a 1.5 GB di memoria libera min.

Ora creiamo un file di dati da 2 GB e poi vediamo cosa fa la lettura di quel file nella cache del buffer sui valori.  Ecco come creare un file di dati da 2 GB in 2 righe di script bash di seguito.  Lo script genererà un file casuale di 35 MB utilizzando il comando dd e quindi lo copierà 70 volte in un nuovo file di dati produzione:

# dd if=/dev/random of=/root/d1.txt conteggio=1000000
# per i in 'seq 1 70'; fai echo $i; gatto /radice/d1.txt >> /root/file_dati; fatto

Leggiamo il file e ignoriamo il contenuto leggendo e reindirizzando il file a /dev/null come di seguito:

# cat data_file > /dev/null

Ok, cosa è successo alla nostra memoria di sistema con questo insieme di manovre, controlliamo ora:

# libero -m

Analizzando i risultati sopra.  Abbiamo ancora 1.8 GB di memoria libera in modo che il kernel abbia protetto una grossa fetta di memoria come riservata a causa della nostra impostazione min_free_kbytes.  La cache del buffer ha utilizzato 1691 MB, che è inferiore alla dimensione totale del nostro file di dati che è 2.3 GB.  A quanto pare l'intero file di dati non è stato possibile memorizzare nella cache a causa della mancanza di memoria disponibile da utilizzare per la cache del buffer.  Possiamo convalidare che l'intero file non è memorizzato nella cache ma cronometrando i ripetuti tentativi di lettura del file. Se fosse memorizzato nella cache, ci vorrebbe una frazione di secondo per leggere il file.  Proviamolo.

# time cat data_file > /dev/null
# time cat data_file > /dev/null

La lettura del file ha richiesto quasi 20 secondi, il che implica che quasi certamente non è tutto memorizzato nella cache.

Come una convalida finale riduciamo il vm.min_free_kbytes per consentire alla cache della pagina di avere più spazio per funzionare e possiamo aspettarci di vedere la cache funzionare e la lettura del file diventare molto più veloce.

# echo 67584 > /proc/sys/vm/min_free_kbytes
# time cat data_file > /dev/null
# time cat data_file > /dev/null

Con la memoria extra disponibile per la memorizzazione nella cache, il tempo di lettura del file è sceso da 20 secondi prima a .364 secondi con tutto nella cache.

Sono curioso di fare un altro esperimento.  Cosa succede con le chiamate malloc per allocare memoria da un programma C di fronte a questo vm davvero alto?.impostazione min_free_kbytes.  Fallirà il malloc??  Il sistema morirà??  Prima resetta il vm.min_free_kbytes al valore veramente alto per riprendere i nostri esperimenti:

# echo 1500000 > /proc/sys/vm/min_free_kbytes

Guardiamo ancora la nostra memoria libera:

Teoricamente abbiamo 1.9 GB liberi e 515 MB disponibili.  Usiamo un programma di stress test chiamato stress-ng per usare un po' di memoria e vedere dove falliamo.  Useremo il tester vm e proveremo ad allocare 1 GB di memoria.  Dal momento che abbiamo prenotato solo 1.5 GB su un 3.Sistema da 75 GB, immagino che dovrebbe funzionare.

# stress-ng --vm 1 --vm-bytes 1G --timeout 60s
stress-ng: info:  [17537] shipping hogs: 1 vm
stress-ng: info:  [17537] allocazione della cache: dimensione della cache predefinita: 46080K
stress-ng: info:  [17537] esecuzione riuscita completata in 60.09s (1 min, 0.09 secondi)
# stress-ng --vm 2 --vm-bytes 1G --timeout 60s
# stress-ng --vm 3 --vm-bytes 1G --timeout 60s

Riproviamo con più lavoratori, possiamo provare 1, 2, 3, 4 lavoratori e ad un certo punto dovrebbe fallire.  Nel mio test è passato con 1 e 2 lavoratori ma non è riuscito con 3 lavoratori.

Ripristiniamo il vm.min_free_kbytes a un numero basso e vedere se questo ci aiuta a eseguire 3 stress di memoria con 1 GB ciascuno su un 3.Sistema da 75 GB.

# echo 67584 > /proc/sys/vm/min_free_kbytes
# stress-ng --vm 3 --vm-bytes 1G --timeout 60s

Questa volta ha funzionato correttamente senza errori, l'ho provato due volte senza problemi.  Quindi posso concludere che c'è una differenza comportamentale nell'avere più memoria disponibile per malloc, quando il vm.Il valore min_free_kbytes è impostato su un valore inferiore.

Impostazione predefinita per vm.min_kbyte_liberi

Il valore predefinito per l'impostazione sul mio sistema è 67584 che è circa 1.8% di RAM sul sistema o 64 MB. Per motivi di sicurezza su un sistema pesantemente thrashing, tenderei ad aumentarlo un po' forse a 128 MB per consentire una memoria libera più riservata, tuttavia per un utilizzo medio il valore predefinito sembra abbastanza ragionevole.  La documentazione ufficiale avverte di rendere il valore troppo alto.  Impostarlo al 5 o al 10% della RAM di sistema probabilmente non è l'uso previsto dell'impostazione ed è troppo alto.

Impostazione vm.min_free_kbytes per sopravvivere ai riavvii

Per garantire che l'impostazione possa sopravvivere ai riavvii e non venga ripristinata ai valori predefiniti al riavvio, assicurarsi di rendere persistente l'impostazione sysctl inserendo il nuovo valore desiderato in /etc/sysctl.conf file.

Conclusione

Abbiamo visto che il vm.min_free_kbytes linux kernel sintonizzabile può essere modificato e può riservare memoria sul sistema al fine di garantire che il sistema sia più stabile soprattutto durante un uso intenso e allocazioni di memoria pesanti.  Le impostazioni predefinite potrebbero essere un po' troppo basse, specialmente su sistemi ad alta memoria e dovrebbero essere considerate come aumentate con attenzione.  Abbiamo visto che la memoria riservata da questo parametro sintonizzabile impedisce alla cache del sistema operativo di utilizzare tutta la memoria e impedisce anche ad alcune operazioni di malloc di utilizzare anche tutta la memoria.

I 5 migliori giochi arcade per Linux
Al giorno d'oggi, i computer sono macchine serie utilizzate per i giochi. Se non riesci a ottenere il nuovo punteggio più alto, saprai cosa intendo. I...
Battaglia per Wesnoth 1.13.6 Sviluppo rilasciato
Battaglia per Wesnoth 1.13.6 rilasciato il mese scorso, è la sesta versione di sviluppo nella 1.13.x e offre una serie di miglioramenti, in particolar...
Come installare League Of Legends su Ubuntu 14.04
Se sei un fan di League of Legends, questa è un'opportunità per testare League of Legends. Nota che LOL è supportato su PlayOnLinux se sei un utente L...