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)
eInactive(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.
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