GNU/Linux >> Linux Esercitazione >  >> Linux

Linux:come ottenere la quantità di memoria disponibile in modo portatile attraverso le distribuzioni?

I file/strumenti standard che riportano la memoria sembrano avere formati diversi su diverse distribuzioni Linux. Ad esempio, su Arch e Ubuntu.

  • Arco

    $ free
                  total        used        free      shared  buff/cache   available
    Mem:        8169312     3870392     2648348       97884     1650572     4110336
    Swap:      16777212      389588    16387624
    
    
    $ head /proc/meminfo 
    MemTotal:        8169312 kB
    MemFree:         2625668 kB
    MemAvailable:    4088520 kB
    Buffers:          239688 kB
    Cached:          1224520 kB
    SwapCached:        17452 kB
    Active:          4074548 kB
    Inactive:        1035716 kB
    Active(anon):    3247948 kB
    Inactive(anon):   497684 kB
    
  • Ubuntu

    $ free
                 total       used       free     shared    buffers     cached
    Mem:      80642828   69076080   11566748    3063796     150688   58358264
    -/+ buffers/cache:   10567128   70075700
    Swap:     20971516    5828472   15143044
    
    
    $ head /proc/meminfo 
    MemTotal:       80642828 kB
    MemFree:        11565936 kB
    Buffers:          150688 kB
    Cached:         58358264 kB
    SwapCached:      2173912 kB
    Active:         27305364 kB
    Inactive:       40004480 kB
    Active(anon):    7584320 kB
    Inactive(anon):  4280400 kB
    Active(file):   19721044 kB
    

Quindi, come posso in modo portatile (solo su distribuzioni Linux) e ottenere in modo affidabile la quantità di memoria, escluso lo scambio, che è disponibile per il mio software da utilizzare in un determinato momento? Presumibilmente questo è ciò che viene mostrato come "disponibile" e "MemAvailable" nell'output di free e cat /proc/meminfo in Arch ma come posso ottenere lo stesso in Ubuntu o in un'altra distribuzione?

Risposta accettata:

MemAvailable è incluso in /proc/meminfo dalla versione 3.14 del kernel; è stato aggiunto dal commit 34e431b0a. Questo è il fattore determinante nelle variazioni di output che mostri. Il messaggio di commit indica come stimare la memoria disponibile senza MemAvailable :

Attualmente, la quantità di memoria disponibile per un nuovo carico di lavoro, senza spingere il sistema in swap, può essere stimata da MemFree , Active(file) , Inactive(file) e SReclaimable , così come le filigrane "basse" da /proc/zoneinfo .

Le filigrane basse sono il livello al di sotto del quale il sistema si scambierà. Quindi in assenza di MemAvailable puoi almeno sommare i valori forniti per MemFree , Active(file) , Inactive(file) e SReclaimable (qualunque sia presente in /proc/meminfo ) e sottrarre le filigrane basse da /proc/zoneinfo . Quest'ultimo elenca anche il numero di pagine libere per zona, che potrebbe essere utile come confronto…

L'algoritmo completo è fornito nella patch a meminfo.c e sembra ragionevolmente facile da adattare:

  • somma i limiti minimi in tutte le zone;
  • prendere la memoria libera identificata (MemFree );
  • sottrai il watermark basso (dobbiamo evitare di toccarlo per evitare lo scambio);
  • aggiungi la quantità di memoria che possiamo utilizzare dalla cache della pagina (somma di Active(file) e Inactive(file) ):questa è la quantità di memoria utilizzata dalla cache della pagina, meno la metà della cache della pagina o la filigrana bassa, a seconda di quale sia la minore;
  • aggiungi la quantità di memoria che possiamo recuperare (SReclaimable ), seguendo lo stesso algoritmo.
Correlati:Linux – Come rendere scrivibile un'unità flash USB su Linux??

Quindi, mettendo insieme tutto questo, puoi ottenere la memoria disponibile per un nuovo processo con:

awk -v low=$(grep low /proc/zoneinfo | awk '{k+=$2}END{print k}') 
 '{a[$1]=$2}
  END{ 
   print a["MemFree:"]+a["Active(file):"]+a["Inactive(file):"]+a["SReclaimable:"]-(12*low); 
  }' /proc/meminfo 

Linux
  1. Come posso ottenere un elenco di reti wireless disponibili su Linux?

  2. Come registrare il consumo di memoria su Linux?

  3. Come elencare i processi collegati a un segmento di memoria condivisa in Linux?

  4. Come ottenere il nome utente in C/C++ in Linux?

  5. Come posso riservare un blocco di memoria dal kernel Linux?

Come ottenere la dimensione di una directory in Linux

Come ottenere la dimensione di una directory in Linux

Come ottenere il nome del file dal percorso completo in Linux

Come ottenere il numero di processori/core in Linux

Come utilizzare il comando procs per mostrare i processi attivi in ​​Linux?

Le 10 migliori distribuzioni Linux