Ci sono numerosi modi per ottenere informazioni sulla memoria installata sui sistemi Linux e vedere quanta di quella memoria è utilizzata. Alcuni comandi forniscono una quantità schiacciante di dettagli, mentre altri forniscono risposte succinte, anche se non necessariamente facili da digerire. In questo post, vedremo alcuni degli strumenti più utili per controllare la memoria e il suo utilizzo.
Prima di entrare nei dettagli, tuttavia, rivediamo alcune nozioni di base. La memoria fisica e la memoria virtuale non sono la stessa cosa. Quest’ultima include lo spazio su disco configurato per essere usato come swap. Lo swap può includere partizioni messe da parte per questo uso o file che vengono creati per aggiungere allo spazio di swap disponibile quando la creazione di una nuova partizione non è pratica. Alcuni comandi Linux forniscono informazioni su entrambi.
Swap espande la memoria fornendo spazio su disco che può essere utilizzato per ospitare pagine inattive che vengono spostate su disco quando la memoria fisica si riempie.
Un file che gioca un ruolo nella gestione della memoria è /proc/kcore. Questo file sembra un file normale (anche se estremamente grande), ma non occupa affatto spazio su disco. Invece, è un file virtuale come tutti i file in /proc.
$ ls -l /proc/kcore-r--------. 1 root root 140737477881856 Jan 28 12:59 /proc/kcore
Interessante, i due sistemi interrogati di seguito non hanno la stessa quantità di memoria installata, ma la dimensione di /proc/kcore è la stessa su entrambi. Il primo di questi due sistemi ha 4 GB di memoria installata; il secondo ha 6 GB.
system1$ ls -l /proc/kcore-r--------. 1 root root 140737477881856 Jan 28 12:59 /proc/kcoresystem2$ ls -l /proc/kcore-r-------- 1 root root 140737477881856 Feb 5 13:00 /proc/kcore
Le spiegazioni che affermano che la dimensione di questo file rappresenta la quantità di memoria virtuale disponibile (forse più 4K) non hanno molto peso. Questo numero suggerirebbe che la memoria virtuale su questi sistemi è di 128 terabyte! Quel numero sembra rappresentare invece quanta memoria un sistema a 64 bit potrebbe essere in grado di indirizzare – non quanta è disponibile sul sistema. I calcoli di come sarebbero 128 terabyte e quel numero, più 4K, sono abbastanza facili da fare sulla linea di comando:
$ expr 1024 \* 1024 \* 1024 \* 1024 \* 128140737488355328$ expr 1024 \* 1024 \* 1024 \* 1024 \* 128 + 4096140737488359424
Un altro comando più umano per esaminare la memoria è il comando free. Ti dà un rapporto di facile comprensione sulla memoria.
$ free total used free shared buff/cache availableMem: 6102476 812244 4090752 13112 1199480 4984140Swap: 2097148 0 2097148
Con l’opzione -g, free riporta i valori in gigabyte.
$ free -g total used free shared buff/cache availableMem: 5 0 3 0 1 4Swap: 1 0 1
Con l’opzione -t, free mostra gli stessi valori che mostra senza opzioni (non confondere -t con terabyte!) ma aggiungendo una linea totale in fondo al suo output.
$ free -t total used free shared buff/cache availableMem: 6102476 812408 4090612 13112 1199456 4983984Swap: 2097148 0 2097148Total: 8199624 812408 6187760
E, naturalmente, si può scegliere di usare entrambe le opzioni.
$ free -tg total used free shared buff/cache availableMem: 5 0 3 0 1 4Swap: 1 0 1Total: 7 0 5
Potreste rimanere delusi da questo report se state cercando di rispondere alla domanda “Quanta RAM è installata su questo sistema? Questo è lo stesso sistema mostrato nell’esempio precedente che è stato descritto come avente 6GB di RAM. Ciò non significa che questo rapporto sia sbagliato, ma che è la visione del sistema della memoria che ha a disposizione.
Il comando free fornisce anche un’opzione per aggiornare la visualizzazione ogni X secondi (10 nell’esempio qui sotto).
$ free -s 10 total used free shared buff/cache availableMem: 6102476 812280 4090704 13112 1199492 4984108Swap: 2097148 0 2097148 total used free shared buff/cache availableMem: 6102476 812260 4090712 13112 1199504 4984120Swap: 2097148 0 2097148
Con -l, il comando free fornisce l’utilizzo della memoria alta e bassa.
$ free -l total used free shared buff/cache availableMem: 6102476 812376 4090588 13112 1199512 4984000Low: 6102476 2011888 4090588High: 0 0 0Swap: 2097148 0 2097148
Un’altra opzione per guardare la memoria è il file /proc/meminfo. Come /proc/kcore, questo è un file virtuale che fornisce un utile rapporto che mostra quanta memoria è installata, libera e disponibile. Chiaramente, libera e disponibile non rappresentano la stessa cosa. MemFree sembra rappresentare la RAM inutilizzata. MemAvailable è una stima di quanta memoria è disponibile per avviare nuove applicazioni.
$ head -3 /proc/meminfoMemTotal: 6102476 kBMemFree: 4090596 kBMemAvailable: 4984040 kB
Se volete vedere solo la memoria totale, potete usare uno di questi comandi:
$ awk '/MemTotal/ {print $2}' /proc/meminfo6102476$ grep MemTotal /proc/meminfoMemTotal: 6102476 kB
Le voci DirectMap dividono le informazioni sulla memoria in categorie.
$ grep DirectMap /proc/meminfoDirectMap4k: 213568 kBDirectMap2M: 6076416 kB
DirectMap4k rappresenta la quantità di memoria mappata su pagine standard da 4k, mentre DirectMap2M mostra la quantità di memoria mappata su pagine da 2MB.
Il comando getconf è uno che fornirà molte più informazioni di quelle che molti di noi vogliono contemplare.
$ getconf -a | moreLINK_MAX 65000_POSIX_LINK_MAX 65000MAX_CANON 255_POSIX_MAX_CANON 255MAX_INPUT 255_POSIX_MAX_INPUT 255NAME_MAX 255_POSIX_NAME_MAX 255PATH_MAX 4096_POSIX_PATH_MAX 4096PIPE_BUF 4096_POSIX_PIPE_BUF 4096SOCK_MAXBUF_POSIX_ASYNC_IO_POSIX_CHOWN_RESTRICTED 1_POSIX_NO_TRUNC 1_POSIX_PRIO_IO_POSIX_SYNC_IO_POSIX_VDISABLE 0ARG_MAX 2097152ATEXIT_MAX 2147483647CHAR_BIT 8CHAR_MAX 127--More--
Para quell’output a qualcosa di specifico con un comando come quello mostrato sotto, e otterrai lo stesso tipo di informazioni fornite da alcuni dei comandi precedenti.
$ getconf -a | grep PAGES | awk 'BEGIN {total = 1} {if (NR == 1 || NR == 3) total *=$NF} END {print total / 1024" kB"}'6102476 kB
Questo comando calcola la memoria moltiplicando i valori nella prima e nell’ultima linea di output in questo modo:
PAGESIZE 4096 <==_AVPHYS_PAGES 1022511_PHYS_PAGES 1525619 <==
Calcolando questo in modo indipendente, possiamo vedere come viene ricavato questo valore.
$ expr 4096 \* 1525619 / 10246102476
E’ chiaramente uno di quei comandi che merita di essere trasformato in un alias!
Un altro comando con un output molto digeribile è top. Nelle prime cinque righe dell’output di top, vedrete alcuni numeri che mostrano come viene utilizzata la memoria.
$ toptop - 15:36:38 up 8 days, 2:37, 2 users, load average: 0.00, 0.00, 0.00Tasks: 266 total, 1 running, 265 sleeping, 0 stopped, 0 zombie%Cpu(s): 0.2 us, 0.4 sy, 0.0 ni, 99.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 stMiB Mem : 3244.8 total, 377.9 free, 1826.2 used, 1040.7 buff/cacheMiB Swap: 3536.0 total, 3535.7 free, 0.3 used. 1126.1 avail Mem
E infine un comando che risponderà alla domanda “Allora, quanta RAM è installata su questo sistema?” in modo succinto:
$ sudo dmidecode -t 17 | grep "Size.*MB" | awk '{s+=$2} END {print s / 1024 "GB"}'6GB
A seconda di quanti dettagli volete vedere, i sistemi Linux forniscono molte opzioni per vedere quanta memoria è installata sui vostri sistemi e quanta è utilizzata e disponibile.