Zdá se, že standardní soubory/nástroje, které hlásí paměť, mají v různých distribucích Linuxu různé formáty. Například na Arch a Ubuntu.
-
Arch
$ 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
Jak tedy mohu přenositelně (pouze v rámci linuxových distribucí) a spolehlivě získat množství paměti – s výjimkou swapu – kterou má můj software k dispozici pro použití v určitou dobu? Pravděpodobně je to to, co je ve výstupu free
zobrazeno jako „dostupné“ a „MemAvailable“ a cat /proc/meminfo
v Archu, ale jak dostanu totéž v Ubuntu nebo jiné distribuci?
Přijatá odpověď:
MemAvailable
je součástí /proc/meminfo
od verze 3.14 jádra; bylo přidáno commitem 34e431b0a. To je určující faktor ve výstupních variacích, které ukazujete. Zpráva odevzdání uvádí, jak odhadnout dostupnou paměť bez MemAvailable
:
V současné době lze množství paměti, která je k dispozici pro novou zátěž, aniž by bylo nutné systém přepínat do swapu, odhadnout z
MemFree
,Active(file)
,Inactive(file)
aSReclaimable
, stejně jako „nízké“ vodoznaky z/proc/zoneinfo
.
Nízké vodoznaky jsou úrovní, pod kterou systém přehodí. Takže při absenci MemAvailable
můžete alespoň sečíst hodnoty dané pro MemFree
, Active(file)
, Inactive(file)
a SReclaimable
(podle toho, které jsou uvedeny v /proc/meminfo
) a odečtěte spodní vodoznaky z /proc/zoneinfo
. Ten také uvádí počet bezplatných stránek na zónu, což může být užitečné pro srovnání…
Kompletní algoritmus je uveden v patchi meminfo.c
a zdá se být poměrně snadné se přizpůsobit:
- sečíst nízké vodoznaky ve všech zónách;
- vezměte identifikovanou volnou paměť (
MemFree
); - odečtěte nízký vodoznak (nemusíme se ho dotýkat, aby nedošlo k záměně);
- přidejte množství paměti, kterou můžeme použít z mezipaměti stránky (součet
Active(file)
aInactive(file)
):to je množství paměti, kterou využívá mezipaměť stránky, mínus buď polovina mezipaměti stránky, nebo nízký vodoznak, podle toho, která hodnota je menší; - přidejte množství paměti, kterou můžeme získat zpět (
SReclaimable
), podle stejného algoritmu.
Takže, když to všechno dáte dohromady, můžete získat paměť dostupnou pro nový proces pomocí:
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