V případě programu free je relevantní řádek začínající řetězcem „-/+ buffers/cache“, kde jsou od využité paměti odečteny diskové vyrovnávací paměti, které se v případě potřeby uvolní. Pokusme se nyní o malý experiment. Po restartu systému spusťte free, pak obnovu databáze pro „locate“ (např. locate -u -c) a poté znovu free. V závislosti na počtu souborů na zkoumaných discích a velikosti paměti se zmenší velikost volné paměti. V mém případě to bylo přes 125MB. Kampak se tedy ta paměť poděla?
Odpověď se nalézá v souboru /proc/slabinfo. Nalezneme tam výpis vyrovnávacích pamětí jádra (síťové údaje, údaje souborových systémů, virtuální paměti a buffery pro DMA přenosy). Většinou jsou největšími žrouty paměti položky inode-cache a dentry-cache (directory entry cache). Nejdůležitější pro nás je pátá položka každého řádku – určuje celkový počet alokovaných stránek. Bližší informace viz man slabinfo. I když se tato paměť také v případě potřeby uvolňuje (ovšem při současných zmatcích okolo VM subsystému v jádru asi nikdo nebude kompetentní říct, zda se v nějaké konkrétní verzi jádra dá přednost odswapování části dat oproti uvolnění slabcache…), není započítána do „Cached“ paměti v /proc/meminfo, a tudíž i příkaz free a ostatní utilitky tohoto typu zobrazí tuto paměť jako „natvrdo“ obsazenou.
Na tento problém jsem narazil při zkoumání paměťového zatížení serveru. Sledoval jsem strategii přidělování paměti procesům a její odkládání na swap v různých situacích. Pro tyto účely jsem potřeboval znát hodnotu volné paměti se zohledněním údajů ze slabinfo. Počítaní s kalkulačkou v ruce mě přestalo záhy bavit, a proto jsem si napsal utilitku, která dělala celou špinavou práci.
Výstup prográmku rfree (real free ;-) se nápadně podobá výstupu programu free. Zaměnil jsem pouze nepoužívanou hodnotu „Shared“ za „Slab“. Snažil jsem se zachovat i ostatní vlastnosti free – podporovány jsou všechny přepínače:
-m údaje v megabajtech -k údaje v kilobajtech (implicitní) -b údaje v bajtech -o vynechá řádek "-/+ buffers..." -t přidá řádek total - součet fyzické paměti a swapu -V vypíše verzi -s n doba opakuje výpis každých n vteřin. n může být číslo s plovoucí des. čárkou. Pro dodržení odstupů byl použit pro jednoduchost usleep, ale uvažuji o předělávce na nanosleep.
Na rozdíl od free rfree kontroluje platnost údaje za -s a bouří se, pokud nenalezne kladnou číselnou hodnotu. Originální free nic nenamítá např. proti -s –1 a čeká pak mezi jednotlivými výpis pravděpodobně 2147483648 vteřin. Bohužel zdroják nemám a čekat takovou dobu se mi nechtělo.
Známé chyby: nevím, jak vypadá slabinfo na SMP počítačích a na jádrech se zakompilovanými slabinfo statistikami, program v těchto případech pravděpodobně selže. Pokud mi zašlete výstup cat /proc/slabinfo, rád program opravím.
Překlad a instalace:
tar xvfz rfree.tar.gz make make install
rfree.tar.gz (2,2 KiB)
Pro make install je nutno mít práva na zápis do /usr/bin.
Jsem si vědom, že tento program je velmi primitivní a každý trochu zkušenější uživatel si napíše elegantnější v nějakém skriptovacím jazyku během několika minut, ale já jsem (možná právě proto) na internetu program s podobnou funkčnosti nenašel. Budu rád, když alespoň někomu poslouží. Nejsem žádný C a už vůbec ne Linux guru, proto budu jen rád, když pošlete alternativní verze nebo patche přímo do diskuse pod článkem nebo na miho@centrum.cz.
free: total used free shared buffers cached Mem: 515420 506400 9020 0 81108 209496 -/+ buffers/cache: 215796 299624 Swap: 522072 0 522072 rfree: total used free slab buffers cached Mem: 515420 506396 9024 144020 81108 209500 -/+ buffers/cache: 71768 443652 Swap: 522072 0 522072