Come controllare l’uso della memoria dal terminale Linux
- Dave McKay
@TheGurkha
- March 11, 2020, 8:00am EDT
Ci sono molti modi per avere informazioni sull’utilizzo della memoria nel vostro sistema Linux. In questa carrellata, copriremo i metodi da riga di comando più comunemente usati: free
vmstat
, e top
. Guarderemo anche la lettura diretta di /proc/meminfo
.
Come Linux usa la RAM
La RAM è una risorsa finita di cui tutti i processi, come applicazioni e demoni, vogliono una parte. Ce n’è solo tanta disponibile. Il kernel arbitra le dispute sulla memoria e alloca la memoria razionata a tutti i processi affamati. È un po’ come una madre uccello con più becchi aperti di quelli per cui ha il grub.
La RAM non utilizzata è RAM sprecata. Linux usa ogni RAM di riserva per cose come lo spazio per il buffer dei file, per mantenere il computer in esecuzione a prestazioni ottimali. È facile avere l’impressione che la RAM del tuo sistema sia stata consumata da qualche processo in fuga o da una perdita di memoria, ma questo è raramente il caso.
Di solito è solo il kernel che fa tenacemente il suo lavoro in background. Se ci sono altre richieste per la RAM che il kernel ha rubato per i suoi dispositivi, cede la memoria all’istante, quindi non ci sono danni.
Se il kernel decide che è più efficiente iniziare ad usare lo spazio di swap, mette in gioco anche quello. C’è molta confusione sul valore swappiness
in Linux e su quando il kernel inizierà ad usare lo swap. Non è vero che il valore swappiness
imposta una soglia per l’utilizzo della RAM che fa scattare l’attivazione di swap.
Ma ora, diamo un’occhiata alle diverse tecniche che si possono utilizzare nella finestra del terminale per vedere l’utilizzo della RAM sul vostro computer Linux.
Il comando free
Il comando free ti dà una tabella della RAM totale, usata, libera, condivisa, buffer/cache e disponibile sul tuo computer. Ti mostra anche la quantità totale di spazio swap configurato, e quanto è usato e disponibile.
Nel nostro esempio, useremo l’opzione -m
(mebibytes). Tuttavia, potresti anche usare -b
(bytes), -k
(kibibytes), o -g
(gibytes).
Scriviamo il seguente comando:
free -m
Questo è l’output che otteniamo:
total used free shared buff/cache available Mem: 1987 901 95 80 990 811 Swap: 1521 651 869
Le colonne Mem
contengono le seguenti informazioni:
- Totale: La quantità totale di RAM fisica su questo computer.
- Usata: La somma di Free+Buffers+Cache sottratta dalla quantità totale.
- Free: La quantità di memoria inutilizzata.
- Shared: Quantità di memoria usata dai
tmpfs
file system. - Buff/cache: Quantità di memoria usata per i buffer e la cache. Questa può essere rilasciata rapidamente dal kernel se necessario.
- Disponibile: Questa è una stima della memoria disponibile per soddisfare le richieste di memoria da parte delle applicazioni e di qualsiasi altro software operativo sul computer.
Le colonne Swap
contengono le seguenti informazioni:
- Totale: La dimensione della partizione o file di swap.
- Usato: La quantità di spazio swap che è in uso.
- Libero: La quantità di spazio swap rimanente (inutilizzato).
È anche possibile utilizzare il seguente trucco ingegnoso che abbiamo modificato da uno dei nostri lettori per vedere la percentuale di spazio swap che viene utilizzato:
free -m | grep Swap | awk '{print ($3/$2)*100}'
RELATO: Come usare il comando free su Linux
Il comando vmstat
E’ impossibile avere una buona comprensione del modo in cui la RAM viene utilizzata nella vostra macchina Linux senza un apprezzamento dello stato del vostro spazio di swap. La RAM e lo spazio di swap lavorano strettamente insieme.
Puoi usare il comando vmstat
per fare un’immersione più profonda su come viene usato lo spazio di swap (o memoria virtuale). Vi dà un rapporto su una varietà di statistiche relative allo swap basate sui valori medi dall’ultimo riavvio.
Digita quanto segue:
vmstat
Questo è l’output senza il wrap-around:
Ci sono molti punti dati in questo rapporto, quindi li suddivideremo:
- Proc:
- r: Il numero di processi “eseguibili”. Sono in esecuzione o in attesa del loro prossimo burst di cicli di CPU.
- b: Il numero di processi in sonno ininterrotto. Questi non stanno dormendo, ma eseguendo una chiamata di sistema bloccante. Non possono essere interrotti finché non completano la loro azione corrente. Tipicamente, questo processo è un driver di dispositivo in attesa che qualche risorsa si liberi. Qualsiasi interrupt in coda per quel processo viene gestito quando il processo riprende la sua solita attività.
- Memoria:
- swpd: La quantità di memoria virtuale usata, cioè quanta memoria è stata scambiata.
- libera: La quantità di memoria inattiva (inutilizzata).
- buff: La quantità di memoria usata come buffer.
- cache: La quantità di memoria usata come cache.
- Swap:
- si: La quantità di memoria virtuale scambiata dallo spazio di swap.
- so: La quantità di memoria virtuale scambiata verso lo spazio di swap.
- IO:
- bi: Blocchi in. Il numero di blocchi di dati usati per scambiare la memoria virtuale nella RAM.
- bo: Blocchi in uscita. Il numero di blocchi di dati usati per scambiare la memoria virtuale fuori dalla RAM e nello spazio di swap.
- Sistema:
- in: Il numero di interrupt al secondo, incluso il clock.
- cs: Il numero di switch di contesto al secondo. Un cambio di contesto è quando il kernel passa dall’elaborazione di sistema a quella in modalità utente.
- CPU: Questi valori sono tutte percentuali del tempo totale della CPU:
- us: Tempo speso nell’esecuzione di codice utente (non kernel).
- sy: Tempo trascorso eseguendo codice kernel.
- id: Tempo trascorso inattivo.
- wa: Tempo trascorso in attesa di in- o output.
- st: Il tempo che una macchina virtuale deve aspettare che l’hypervisor finisca di servire altre macchine virtuali prima di poter tornare ad occuparsi di questa macchina virtuale.
RELATO: Come usare il comando vmstat su Linux
Il comando top
Il comando top
mostra una schermata piena di informazioni. I valori vengono aggiornati ogni pochi secondi.
Per usarlo, digitiamo quanto segue:
top
È stato premuto il tasto “e”. Questo ha cambiato la visualizzazione in megabyte, che sono più facili da analizzare visivamente che lunghe stringhe che rappresentano byte. Ci sono cinque linee di informazioni nella parte superiore dello schermo e un pannello inferiore con colonne di dati.
Queste sono le informazioni che troverete su ogni linea:
- Linea uno: L’ora, da quanto tempo il computer è in funzione, quante persone sono collegate e qual è stata la media di carico negli ultimi uno, cinque e 15 minuti.
- Linea due: Il numero di compiti e i loro stati: in esecuzione, fermi, dormienti o zombie.
- Linea tre: Informazioni sulla CPU (vedi la ripartizione dei campi qui sotto).
- Linea quattro: La quantità totale di memoria fisica, e quanta è libera, usata, bufferata o cached.
- Linea cinque: Quantità totale di memoria swap, e quanta è libera, usata e disponibile (tenendo conto della memoria che ci si aspetta sia recuperabile dalle cache).
I campi CPU sulla linea tre sono i seguenti:
- us: Tempo che la CPU trascorre eseguendo processi per gli utenti nello spazio utente.
- sy: Tempo che la CPU ha trascorso eseguendo processi di sistema “spazio kernel”.
- ni: Tempo che la CPU ha trascorso eseguendo processi con un valore di nice impostato manualmente.
- id: Tempo di inattività della CPU.
- wa: Tempo che la CPU trascorre in attesa che l’I/O sia completato.
- hi: Tempo che la CPU ha trascorso servendo gli interrupt hardware.
- si: Tempo che la CPU ha trascorso servendo gli interrupt software.
- st (steal time): Tempo che la CPU ha perso a causa dell’esecuzione di macchine virtuali.
Potresti dover premere i tasti freccia sinistra o destra per vedere tutte le colonne. I valori in ogni colonna sono descritti di seguito:
- PID: ID del processo.
- USER: Nome del proprietario del processo.
- PR: Priorità del processo.
- NI: Il valore piacevole del processo.
- VIRT: Memoria virtuale usata dal processo.
- RES: Memoria residente usata dal processo.
- SHR: Memoria condivisa usata dal processo.
- S: Stato del processo. (Vedi la lista dei valori che questo campo può assumere qui sotto).
- %CPU: La quota di tempo della CPU usata dal processo dall’ultimo aggiornamento.
- %MEM: La quota di memoria fisica usata.
- TIME+: Tempo totale di CPU usato dal task in centesimi di secondo.
- COMANDO: Il nome o la linea del comando (nome + opzioni). (Questa colonna è fuori schermo a destra nell’immagine sopra.)
Lo stato visualizzato nella colonna S
può essere uno dei seguenti:
- D: Uninterruptible sleep.
- R: Running.
- S: Sleeping.
- T: Traced (stopped).
- Z: Zombie.
Premere Q per uscire top
.
Lettura di /proc/meminfo
Molti (e, molto probabilmente, la maggior parte) degli strumenti in Linux che riportano statistiche sulla memoria recuperano le loro informazioni dallo pseudo filesystem /proc/meminfo
. Possiamo usare i comandi cat
o less
per fare lo stesso.
Scriviamo quanto segue:
less /proc/meminfo
Potreste vedere campi diversi a seconda del kernel in esecuzione e dell’architettura della CPU. Abbiamo ottenuto i seguenti risultati sulla nostra macchina virtuale:
MemTotal: 2035260 kB MemFree: 919064 kB MemAvailable: 1300932 kB Buffers: 33528 kB Cached: 457604 kB SwapCached: 29732 kB Active: 313360 kB Inactive: 603276 kB Active(anon): 74648 kB Inactive(anon): 355004 kB Active(file): 238712 kB Inactive(file): 248272 kB Unevictable: 16 kB Mlocked: 16 kB SwapTotal: 1557568 kB SwapFree: 873024 kB Dirty: 80 kB Writeback: 0 kB AnonPages: 414100 kB Mapped: 97436 kB Shmem: 4148 kB KReclaimable: 52932 kB Slab: 94216 kB SReclaimable: 52932 kB SUnreclaim: 41284 kB KernelStack: 9280 kB PageTables: 45264 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 2575196 kB Committed_AS: 5072192 kB VmallocTotal: 34359738367 kB VmallocUsed: 35712 kB VmallocChunk: 0 kB Percpu: 720 kB HardwareCorrupted: 0 kB AnonHugePages: 0 kB ShmemHugePages: 0 kB ShmemPmdMapped: 0 kB CmaTotal: 0 kB CmaFree: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB Hugetlb: 0 kB DirectMap4k: 180160 kB DirectMap2M: 1916928 kB
Tutte le dimensioni sono in kibibyte se non diversamente indicato. Ecco cosa significano, insieme ad altri che potreste vedere a seconda della configurazione del vostro computer e dell’hardware:
- MemTotal: RAM totale utilizzabile (a parte alcuni bit riservati e il codice binario del kernel).
- MemFree: La somma di
LowFree
HighFree
. La quantità di RAM attualmente disponibile. - MemAvailable: Stima della memoria disponibile per avviare nuove applicazioni, senza swapping.
- Buffers: Memorizzazione temporanea per i blocchi del disco grezzo. Questo riduce l’in- e l’output del disco rigido. Inoltre velocizza l’accesso alle richieste successive per gli stessi dati perché sono già in memoria.
- Cached: Pagine in cache lette da file sul disco rigido (non incluso
SwapCached
). - SwapCached: Memoria che è stata scambiata fuori e dentro, e una copia rimane nello spazio di swap.
- Attivo: Memoria usata di recente. Non viene recuperata a meno che non sia assolutamente necessario.
- Inattivo: Memoria che è stata usata, ma non la più recente. È un probabile candidato per il recupero.
- Attiva(anon): Memoria allocata ai file creati in un
tmpfs
sistema di pseudo-file. I file anonimi non risiedono sul disco rigido. - Inactive(anon): Quantità di memoria anonima,
tmpfs
, eshmem
candidata allo sfratto (recupero di memoria). - Attivo(file): Quantità di memoria cache di file in uso, o che è stata usata dal precedente ciclo di recupero della memoria.
- Inactive(file): Quantità di memoria cache di file letta da un disco rigido che è un candidato per la bonifica.
- Inattivo: Quantità di memoria che dovrebbe essere evitabile, ma non lo è perché è bloccata in memoria da processi nello spazio utente.
- Mlocked: Quantità totale di memoria non evitabile perché è bloccata da processi in spazio utente.
- HighTotal: Quantità totale di HighMem, che è usata da programmi in spazio utente e dalla cache di pagina. Il kernel può accedere a questa zona di memoria, ma è più lento di LowMem.
- HighFree: Quantità di HighMem libera.
- LowTotal: Quantità di LowMem, che è disponibile per tutti gli stessi usi di HighMem, ma anche per il kernel da usare per i suoi scopi.
- LowFree: Quantità di LowMem libera.
- MmapCopy: Quantità di memoria che è stata mappata su file di dati.
- SwapTotal: Quantità totale di spazio swap disponibile.
- SwapFree: Quantità di spazio di swap attualmente inutilizzato.
- Dirty: Quantità di memoria in attesa di essere riscritta sul disco.
- Writeback: Memoria che viene attivamente riscritta sul disco.
- AnonPages: Pagine non supportate da file mappate in tabelle di pagina nello spazio utente.
- Mappate: File (come le librerie) che sono mappati in memoria.
- Shmem: Quantità di memoria consumata in
tmpfs
sistemi di pseudo-file. - KReclaimable: Allocazioni di memoria del kernel che il kernel tenterà di reclamare se la richiesta di memoria è abbastanza grave.
- Slab: Cache delle strutture dati del kernel.
- SReclaimable: Quantità di
Slab
memoria che potrebbe essere recuperata, come le cache. - SUnreclaim: Quantità di
Slab
memoria che non può essere recuperata. - KernelStack: Quantità di memoria allocata agli stack del kernel.
- PageTables: Quantità di memoria dedicata al livello più basso delle tabelle di pagina.
- Quicklists: Poiché l’allocazione e la cancellazione delle tabelle di pagina è un’operazione molto frequente, è vitale che sia il più veloce possibile. Quindi, le pagine usate per le tabelle di pagina sono memorizzate nella cache in un certo numero di liste diverse chiamate “quicklists.”
- NFS_Unstable: Pagine del Network File System (NFS) che il server ha ricevuto, ma non ancora scritte nella memoria non volatile.
- Bounce: Memoria usata per i buffer di rimbalzo dei dispositivi a blocchi. Un bounce buffer è posizionato in memoria abbastanza in basso da permettere a un dispositivo di accedervi direttamente. I dati vengono poi copiati nella pagina utente desiderata in HighMem.
- WritebackTmp: Memoria usata dal Filesystem in Userspace (FUSE) per buffer temporanei di write-back.
- CommitLimit: La quantità totale di memoria attualmente disponibile per essere allocata nel sistema.
- Committed_AS: La quantità di memoria stimata per soddisfare tutte le richieste correnti. Se un programma richiede della RAM, la richiesta viene registrata, ma la RAM viene allocata solo quando il programma inizia ad usarla. È anche allocata solo come richiesto, fino alla quantità massima che il programma ha riservato. Può essere “allocata” più memoria di quella che può essere effettivamente consegnata. Se tutti i programmi cercano di incassare i loro chip di RAM in una volta sola, il casinò della memoria potrebbe fallire (e dover andare con il cappello in mano ai finanziatori dello spazio di swap).
- VmallocTotal: Dimensione totale dell’area di memoria vmalloc.
- VmallocUsed: Quantità di area vmalloc usata. Da Linux 4.4, questo campo non è più calcolato, è hard-coded.
- VmallocChunk: Il più grande blocco contiguo di area vmalloc libera.
- HardwareCorrupted: Quantità di memoria etichettata come avente problemi di corruzione della memoria fisica. Non sarà allocata.
- LazyFree: Quantità di memoria in stato
MADV_FREE
. Quando un’applicazione imposta il flagMADV_FREE
su una serie di pagine, questo indica che non ne ha più bisogno e che ora sono candidate alla bonifica. L’effettiva bonifica potrebbe essere ritardata fino a che non ci sia una sufficiente richiesta di memoria. Se l’applicazione inizia a scrivere sulle pagine, la bonifica può essere annullata. - AnonHugePages: Pagine enormi non supportate da file mappate in tabelle di pagina nello spazio utente. Le pagine non supportate da file non provengono da un file del disco rigido.
- ShmemHugePages: Quantità di memoria usata dalla memoria condivisa (
shmem
) e dai sistemi pseudo-file (tmpfs
) allocata con pagine enormi. - ShmemPmdMapped: Quantità di memoria condivisa mappata nello spazio utente con pagine enormi.
- CmaTotal: Quantità di pagine CMA (Contiguous Memory Allocator). Queste sono usate dai dispositivi che possono comunicare solo a regioni contigue di memoria.
- CmaFree: Quantità di pagine CMA (Contiguous Memory Allocator) libere.
- HugePages_Total: Dimensione del pool di pagine enormi.
- HugePages_Free: Numero di pagine enormi non allocate nel pool.
- HugePages_Rsvd: Numero di pagine enormi riservate. L’impegno ad allocare è stato preso, ma l’allocazione non è ancora avvenuta.
- HugePages_Surp: Numero di pagine enormi nel pool oltre il valore di sistema definito.
- Hugepagesize: Dimensione delle pagine enormi.
- DirectMap4k: Numero di byte di RAM mappati su pagine da 4 kB.
- DirectMap4M: Numero di byte di RAM mappati su pagine da 4 MB.
- DirectMap2M: Numero di byte di RAM mappati su pagine da 2 MB.
- DirectMap1G: Numero di byte di RAM mappati su pagine da 2 GB.
Come al solito con Linux, c’è più di un modo per avere una rapida panoramica, e sempre almeno un modo per andare più in profondità nei dettagli.
Probabilmente userete free
top
, e vmstate
regolarmente, e tenere /proc/meminfo
di riserva per quando è necessario fare un’immersione profonda per indagare su un problema particolare.
Dave McKay ha usato i computer per la prima volta quando il nastro di carta perforato era in voga, e da allora ha sempre programmato. Dopo oltre 30 anni nell’industria informatica, ora è un giornalista tecnologico a tempo pieno. Durante la sua carriera, ha lavorato come programmatore freelance, come manager di un team internazionale di sviluppo software, come project manager di servizi IT e, più recentemente, come Data Protection Officer. Dave è un evangelista di Linux e un sostenitore dell’open source.Read Full Bio”