Oct 202013
 

Come amministratore di sistema, o semplice utente che utilizza Linux sul suo computer a volte si nota che qualcosa sta mangiando tutta la memoria del nostro sistema.
Come prima cosa assicuratevi di capire come Linux gestisce la memoria, sono stato chiamato troppe volte da utenti spaventato che davano un free e non erano in grado di leggere in modo corretto il suo output, in breve, non preoccupatevi se il kernel di Linux sta utilizzando la memoria per memorizzare dei file nella cache.

< modalità sfogo >

Per i miei “amati” utenti :

State tranquilli che gli sviluppatori del kernel possono fare un lavoro migliore di voi (e di me) nel trovare un buon algoritmo per memorizzare nella cache i file e liberare quelle aree di memoria quando un processo ne ha bisogno, quindi per favore non chiedetemi di mettere in cron qualche programma che sostanzialmente fà :

echo 3 > /proc/sys/vm/drop_caches

Dopo questo avrete più memoria libera disponibile nel sistema, è vero, ma al sistema sarà necessario ri-leggere tutti i file dal disc , quindi in termini di prestazioni questa è di solito una cattiva mossa .

< /sfogo >

Ma ora diamo un’occhiata a un piccolo programma che ci può aiutare a trovare quale processo/utenti utilizzano, per davvero, la memoria dei nostri sistemi .


smem è uno strumento che può dare numerosi report sull’utilizzo della memoria sui sistemi Linux. A differenza degli strumenti esistenti, smem può segnalare proportional set size ( PSS ), che è una rappresentazione più significativa della quantità di memoria utilizzata dalle librerie e applicazioni in un sistema con memoria virtuale .

Poichè grandi porzioni di memoria fisica sono in genere condivise tra più applicazioni, la misura standard di utilizzo della memoria nota come resident set size ( RSS ) sarà sovrastimata notevolmente nel suo utilizzo. Il parametro PSS invece misura per ogni applicazione la “quota equa ” di ogni area condivisa per dare una misura realistica .

smem ha molte caratteristiche :

  • Panoramica del sistema
  • elenchi da parte di processo, mappatura, l’utente
  • filtraggio per processo, mappatura, o utente
  • colonne configurabili da più origini di dati
  • output configurabili come unità e/o percentuali
  • intestazioni configurabili e totali
  • lettura di dati in tempo reale da /proc
  • lettura di snapshots dei dati da directory in mirror o archivi compressi
  • strumento di cattura dei dati leggero per sistemi embedded
  • incorpora tutto quello che serve per la generazione di un grafico

Installazione

Se si utilizza Debian, Ubuntu o Mint è possibile installare smem direttamente dal repository ufficiale con il comando:

$ sudo apt-get install smem

Gli utenti di Arch Linux possono installare il pacchetto dal repository AUR .

Gli utenti Red Hat / Fedora / CentOS / SuSE possono utilizzare il binario precompilato che è possibile scaricare direttamente dal sito ufficiale, per comodità è possibile copiare e incollare questi comandi che metteranno il comando smem nella vostra directory /usr/local/bin :

cd /tmp/
wget http://www.selenic.com/smem/download/smem-1.3.tar.gz
tar xvf smem-1.3.tar.gz
sudo cp /tmp/smem-1.3/smem /usr/local/bin/
sudo chmod +x /usr/local/bin/smem

Uso base

smem segnala l’utilizzo della memoria fisica, prendendo in considerazione le pagine di memoria condivisa. La memoria non condivisa viene segnalato come USS (Unique Set Size). La memoria condivisa è diviso equamente tra i processi che condividono la memoria. La memoria non condivisa (USS) più parte di un processo di memoria condivisa viene segnalato come PSS (Proportional Set Size). La USS e la PSS includono solo l’utilizzo della memoria fisica. Non comprendono la memoria che è in stato di swapping su disco.

L’uso di base visualizza i processi in esecuzione con la quantità di memoria utilizzata, per vederli eseguire il comando smem senza nessuna opzione, questo stampa un output simile a questo:

# smem
  PID User     Command                         Swap      USS      PSS      RSS
....
 4223 linuxaria   /usr/lib/chromium-browser/c        0     9144    11696    29132 
14280 root     python ./smem                      0    11580    11839    13680 
 2180 linuxaria   /usr/bin/python /usr/share/        0    12956    14691    24392 
 2144 linuxaria   python /usr/lib/linuxmint/m        0    20252    22337    35648 
 2121 linuxaria   Thunar --daemon                    0    13316    23122    44404 
 2123 linuxaria   xfdesktop                          0    24004    24924    36032 
13095 linuxaria   /usr/lib/chromium-browser/c        0    27536    30996    53328 
 2577 linuxaria   /usr/bin/python /usr/lib/ub        0    34192    35112    41300 
 2127 linuxaria   /home/riccio/copy/x86_64/Co        0    40268    41081    52248 
10720 linuxaria   /usr/lib/chromium-browser/c        0    38684    42107    63928 
10561 linuxaria   /usr/lib/chromium-browser/c        0    43956    48137    71644 
10579 linuxaria   /usr/lib/chromium-browser/c        0    46276    50290    73484 
 5605 linuxaria   transmission-gtk /tmp/[kick        0    48616    51508    65148 
 8938 linuxaria   /usr/lib/firefox/plugin-con        0    48960    55428    71132 
 2186 linuxaria   /home/linuxaria/.dropbox-dist/        0    55524    56061    64820 
 1722 root     /usr/bin/X :0 -audit 0 -aut        0    52360    73110    96008 
10623 linuxaria   /usr/lib/chromium-browser/c        0   114224   121888   149236 
 4171 linuxaria   chromium-browser --disable-        0   131044   140415   165780 
 7050 linuxaria   /usr/lib/thunderbird/thunde        0   253428   256803   273152 
 2644 linuxaria   /usr/lib/firefox/firefox           0   528420   537423   558992

Quindi in questo esempio (il mio desktop) il processo che sta mangiando più RAM è Firefox e al secondo posto Thunderbird.

Una opzione utile è la -u che mostra la somma di memoria utilizzata per ogni utente:

#smem -u
User     Count     Swap      USS      PSS      RSS 
daemon       1        0      196      197      368 
rtkit        1        0      300      312     1396 
nobody       1        0      428      442     1600 
mdm          2        0      600      695     1808 
avahi        2        0      568      806     2420 
syslog       1        0     1032     1043     1884 
messagebus     1        0     1124     1207     2048 
root        40        0    96568   123002   203372 
linuxaria      83        0  1539864  1640378  2222556

E’ possibile aggiungere un -p con questo comando (ed anche per tutti gli altri) per mostrare valori percentuali:

#smem -u -p
User     Count     Swap      USS      PSS      RSS 
daemon       1    0.00%    0.00%    0.00%    0.00% 
rtkit        1    0.00%    0.00%    0.00%    0.02% 
nobody       1    0.00%    0.01%    0.01%    0.02% 
mdm          2    0.00%    0.01%    0.01%    0.02% 
avahi        2    0.00%    0.01%    0.01%    0.03% 
syslog       1    0.00%    0.01%    0.01%    0.02% 
messagebus     1    0.00%    0.01%    0.01%    0.03% 
root        40    0.00%    1.18%    1.47%    2.41% 
linuxaria      83    0.00%   19.29%   20.48%   27.58%

O se preferite un ampio panorama sull’utilizzo della memoria nel sistema, è possibile utilizzare -w

#smem -w -p
Area                           Used      Cache   Noncache 
firmware/hardware             0.00%      0.00%      0.00% 
kernel image                  0.00%      0.00%      0.00% 
kernel dynamic memory        64.55%     62.42%      2.13% 
userspace memory             22.12%      3.00%     19.12% 
free memory                  13.33%     13.33%      0.00%

Con l’opzione -w suggerisco di usare anche l’opzione -R MEMORIA, questo valore è la quantità di RAM fisica. Ciò consente a smem rilevare la quantità di memoria utilizzata dal firmware/hardware nell’output con -w. Se inserito, sarà utilizzato anche come dimensione totale della memoria per basarci le percentuali.

#smem -R 8G -w -p
Area                           Used      Cache   Noncache 
firmware/hardware             2.83%      0.00%      2.83% 
kernel image                  0.00%      0.00%      0.00% 
kernel dynamic memory        63.02%     60.95%      2.07% 
userspace memory             21.60%      2.91%     18.68% 
free memory                  12.56%     12.56%      0.00%


Creare dei grafici della memoria di linux con smem

Con smem (e avendo la libreria matplotlib) è possibile generare grafici a barre ed a torta con solo qualche opzione in più.

Mostra un grafico a barre con le colonne “pss ed uss”:

smem --bar pid -c "pss uss"

smem

Crea un grafico a torta dei processi che iniziano con ‘k’ su un sistema in esecuzione:

#smem -P '^k' --pie=name

smem_pie

Conclusioni

Smem è uno strumento facile da usare che può dare con facilità alcune informazioni utili per la ricerca di processi che stanno occupando la memoria, è anche semplice ottenere un grafico, in questo modo sarete in grado di parlare con gli utenti e convincerli che dopo tutto il loro processo non è così piccolo e ben fatto, per quello che riguarda la memoria.

Popular Posts:

Flattr this!

  6 Responses to “Linux Terminal: Verifica chi usa tutta la tua memoria con smem”

  1. A dure il vero in Arch Linux il programma è nel repository “community”; per installarlo basta quindi un semplice “pacman -S smem”
    Ciao

  2. A quick sudo yum search smem shows that it is in the repos for Fedora 19.

    ================================================ N/S matched: smem ================================================
    smem.noarch : Report application memory usage in a meaningful way

    Cheers!

  3. Be aware of a name conflict. There is a utility that is part of secure-delete which may cause a problem if you have it installed. That utility was formerly known as ‘sdmem’ but was renamed to ‘smem’. The manpage explains the name change this way: “This utility was originally called sdmem but was renamed for debian to avoid name clashes with another package.”

  4. This is a delight!
    Well more to learn I guess…. thanks a lot

Leave a Reply to Michael Cancel reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)

*