Diverse risorse in rete (scuse per non avere i collegamenti a portata di mano) raccomandano di determinare la quantità totale di memoria fisica disponibile su un sistema Linux dal secondo valore sulla riga "- / + buffer / cache" nell'output di free
, con la spiegazione che buffer e cache possono essere scartati immediatamente se un processo tenta di allocare più memoria di quella inutilizzata al momento (riga "Mem:" di free
). Ho trovato questa affermazione essere coerentemente empiricamente sbagliata, il che significa allocare più memoria di quella che "inutilizzata" fallisce spesso.
Facendo una ricerca su questo, ho trovato la riga "MemAvailable:" in /proc/meminfo
, e questa spiegazione :
Subject: provide estimated available memory in /proc/meminfo
Many load balancing and workload placing programs check /proc/meminfo
to estimate how much free memory is available. They generally do this
by adding up "free" and "cached", which was fine ten years ago, but
is pretty much guaranteed to be wrong today.
It is wrong because Cached includes memory that is not freeable as
page cache, for example shared memory segments, tmpfs, and ramfs,
and it does not include reclaimable slab memory, which can take up
a large fraction of system memory on mostly idle systems with lots
of files.
Currently, the amount of memory that is available for a new workload,
without pushing the system into swap, can be estimated from MemFree,
Active(file), Inactive(file), and SReclaimable, as well as the "low"
watermarks from /proc/zoneinfo.
Il mio problema è che il sistema a mia disposizione per eseguire i miei programmi ha un kernel 3.2.0 che apparentemente non fornisce "MemAvailable".
La mia domanda: Come posso calcolare (approssimativamente) la quantità di memoria fisica disponibile da solo, usando le informazioni di memoria che sono a mia disposizione?
MemTotal: 16536344 kB
MemFree: 8615224 kB
Buffers: 241896 kB
Cached: 1341944 kB
SwapCached: 100232 kB
Active: 5320768 kB
Inactive: 2021312 kB
Active(anon): 4298508 kB
Inactive(anon): 1483164 kB
Active(file): 1022260 kB
Inactive(file): 538148 kB
Unevictable: 32 kB
Mlocked: 32 kB
SwapTotal: 9918460 kB
SwapFree: 7730432 kB
Dirty: 56 kB
Writeback: 0 kB
AnonPages: 5720696 kB
Mapped: 103628 kB
Shmem: 23432 kB
Slab: 432516 kB
SReclaimable: 356780 kB
SUnreclaim: 75736 kB
KernelStack: 7320 kB
PageTables: 69764 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 18186632 kB
Committed_AS: 12325296 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 120924 kB
VmallocChunk: 34351227352 kB
HardwareCorrupted: 0 kB
AnonHugePages: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 103240 kB
DirectMap2M: 16738304 kB
PS: Mi rendo conto che l'effettivo calcolo è dettagliato nella patch del kernel a cui mi sono collegato, ma sto avendo difficoltà a collegarlo all'output che mi è disponibile.
dmesg
)?