Come VM.MIN_FREE_KBYTES Works
Il sistema potrebbe essere necessario allocazioni di memoria al fine di garantire il corretto funzionamento del sistema stesso. Se il kernel consente di allocare tutta la memoria, potrebbe lottare quando ha bisogno di memoria per le operazioni regolari per mantenere il sistema operativo senza intoppi. Ecco perché il kernel fornisce la VM sintonizzabile.min_free_kbytes. Il sintonizzabile costringerà il gestore della memoria del kernel a mantenere almeno x quantità di memoria libera. Ecco la definizione ufficiale della documentazione del kernel Linux: “Questa viene utilizzata per forzare la VM Linux a mantenere un numero minimo di kilobyte. La VM utilizza questo numero per calcolare un valore di filigrana [Wmark_min] per ciascuna zona LowMem nel sistema. Ogni zona LowMem ottiene una serie di pagine gratuite riservate basate proporzionalmente sulla sua dimensione. È necessaria una quantità minima di memoria per soddisfare le allocazioni PF_MeMalloc; Se si imposta questo su un minore di 1024kb, il sistema diventerà sottilmente rotto e incline a deadlock sotto carichi elevati. Impostarlo troppo in alto, oom la tua macchina istantaneamente."
Convalidamento VM.MIN_FREE_KBYTES Works
Al fine di testare che l'impostazione di min_free_kbytes funzioni come progettato, ho creato un'istanza virtuale Linux con solo 3.75 GB di RAM. Utilizzare il comando gratuito di seguito per analizzare il sistema:
# gratuito -m
Guardando l'utilità di memoria libera sopra usando il flag -m per avere i valori stampati in MB. La memoria totale è 3.5 a 3.75 GB di memoria. Viene utilizzato 121 mb di memoria, 3.3 GB di memoria sono gratuiti, 251 MB viene utilizzato dalla cache del buffer. E 3.Sono disponibili 3 GB di memoria.
Ora cambieremo il valore della VM.min_free_kbytes e vedere qual è l'impatto sulla memoria del sistema. Facciamo eco al nuovo valore del filesystem Virtual Proc per modificare il valore del parametro del kernel come di seguito:
# echo 1500000>/proc/sys/vm/min_free_kbytes
# sysctl VM.min_free_kbytes
Puoi vedere che il parametro è stato cambiato in 1.5 GB approssimativamente e ha avuto effetto. Ora usiamo il gratuito comanda nuovamente di vedere eventuali modifiche riconosciute dal sistema.
# gratuito -m
La memoria libera e la cache del buffer sono invariate dal comando, ma la quantità di memoria visualizzata come disponibile è stato ridotto da 3327 a 1222 MB. Che è una riduzione approssimativa del cambiamento nel parametro a 1.Memoria libera da 5 GB Min.
Ora creiamo un file di dati da 2 GB e quindi vediamo cosa fa la lettura di quel file nella cache del buffer ai 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 da 35 MB utilizzando il comando DD e quindi lo copierà 70 volte in un nuovo file di dati produzione:
# dd if =/dev/casuale di =/root/d1.TXT COUNT = 1000000
# per I in 'seq 1 70'; Echo $ i; gatto /radice /d1.txt >> /root /data_file; Fatto
Leggiamo il file e ignoriamo il contenuto leggendo e reindirizzando il file su /dev /null come sotto:
# cat data_file> /dev /null
Ok, cosa è successo alla nostra memoria di sistema con questo set di manovre, controlliamo ora:
# gratuito -m
Analizzare i risultati sopra. Ne abbiamo ancora 1.8 GB di memoria libera in modo che il kernel abbia protetto un grosso pezzo di memoria come riservato 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. Apparentemente il tutto 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 è archiviato nella cache ma tempendo i tentativi ripetuti di leggere il 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
Il file lettura ha richiesto quasi 20 secondi, il che implica quasi certamente non tutto memorizzato nella cache.
Come una convalida finale riduciamo la VM.min_free_kbyte per consentire alla cache di pagina di avere più spazio per operare e possiamo aspettarci di vedere la cache funzionare e il file lettura diventa 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 eliminato da 20 secondi prima a .364 secondi con tutto nella cache.
Sono curioso di fare un altro esperimento. Cosa succede con le chiamate di Malloc per allocare la memoria da un programma C di fronte a questa VM davvero alta.Impostazione MIN_FREE_KBYTES. Fallirà il malloc? Il sistema morirà? Ripristina prima la VM.MIN_FREE_KBYTES Imposta sul valore davvero alto per riprendere i nostri esperimenti:
# echo 1500000>/proc/sys/vm/min_free_kbytes
Diamo di nuovo il nostro ricordo libero:
Teoricamente abbiamo 1.9 GB gratuito e 515 MB Disponibile. 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 riservato solo 1.5 GB su un 3.Sistema 75 GB, immagino che questo dovrebbe funzionare.
# stress-ng --vm 1 --vm-bytes 1g-timeout 60s
Stress-NG: Info: [17537] Spedizione di maiali: 1 VM
stress-ng: Info: [17537] Cache Allocate: cache predefinita Dimensione: 46080K
Stress-NG: Info: [17537] Run di successo completato in 60.09s (1 min, 0.09 sec)
# stress-ng --vm 2 --vm-bytes 1g-timeout 60s
# stress-ng --vm 3 --vm-bytes 1g-timeout 60s
Proviamolo di nuovo 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 ha fallito con 3 lavoratori.
Ripristiniamo la VM.min_free_kbytes a un numero basso e vedere se questo ci aiuta a eseguire 3 fattori 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 con successo senza errore, l'ho provato due volte senza problemi. Quindi posso concludere che c'è una differenza comportamentale di avere più memoria disponibile per Malloc, quando la VM.Il valore min_free_kbytes è impostato su un valore inferiore.
Impostazione predefinita per VM.min_free_kbytes
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 fortemente battuto, tenderei ad aumentarlo un po 'forse a 128 MB per consentire una memoria libera più riservata, tuttavia per l'utilizzo medio il valore predefinito sembra abbastanza sensibile. La documentazione ufficiale avverte di rendere troppo alto il valore. Impostarlo al 5 o 10% del sistema RAM probabilmente non è l'uso previsto dell'impostazione ed è troppo elevato.
Impostazione VM.min_free_kbyte per sopravvivere al riavvio
Al fine di garantire che l'impostazione possa sopravvivere al riavvio e non viene ripristinata ai valori predefiniti durante il riavvio, assicurarsi di rendere persistente l'impostazione SYSCTL mettendo il nuovo valore desiderato in /etc /sySctl.Conf File.
Conclusione
Abbiamo visto che la VM.MIN_FREE_KBYTES Linux Kernel Tuneble può essere modificato e può riservare la memoria sul sistema al fine di garantire che il sistema sia più stabile soprattutto durante l'utilizzo pesante e le allocazioni di memoria pesanti. Le impostazioni predefinite potrebbero essere un po 'troppo basse, specialmente su sistemi di memoria elevati e dovrebbero essere considerate aumentate con cura. Abbiamo visto che la memoria riservata da questo 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.