Nestydatě zkopírujte/vložte moji odpověď ze serverfault právě druhý den :-)
Systém linuxové virtuální paměti není tak jednoduchý. Nemůžete jen sečíst všechna pole RSS a získat nahlášenou hodnotu used
od free
. Existuje pro to mnoho důvodů, ale uvedu pár těch největších.
-
Když se proces rozvětví, rodič i podřízený se zobrazí se stejným RSS. Linux však používá kopírování při zápisu, takže oba procesy skutečně využívají stejnou paměť. Teprve když jeden z procesů upraví paměť, bude skutečně duplikována.
To způsobífree
číslo menší nežtop
Součet RSS. -
Hodnota RSS nezahrnuje sdílenou paměť. Protože sdílená paměť není vlastněna žádným procesem,
top
nezahrnuje jej do RSS.
To způsobífree
číslo bude větší nežtop
Součet RSS.
Pokud hledáte čísla paměti, která se sčítají, podívejte se na smem:
smem je nástroj, který může poskytovat četné zprávy o využití paměti v systémech Linux. Na rozdíl od stávajících nástrojů může smem hlásit proporcionální velikost sady (PSS), což je smysluplnější vyjádření množství paměti používané knihovnami a aplikacemi v systému virtuální paměti.
Protože velké části fyzické paměti jsou obvykle sdíleny mezi více aplikacemi, standardní míra využití paměti známá jako velikost rezidentní sady (RSS) výrazně nadhodnocuje využití paměti. PSS místo toho měří „spravedlivý podíl“ každé aplikace na každé sdílené oblasti, aby poskytl realistickou míru.
Například zde:
# smem -t
PID User Command Swap USS PSS RSS
...
10593 root /usr/lib/chromium-browser/c 0 22868 26439 49364
11500 root /usr/lib/chromium-browser/c 0 22612 26486 49732
10474 browser /usr/lib/chromium-browser/c 0 39232 43806 61560
7777 user /usr/lib/thunderbird/thunde 0 89652 91118 102756
-------------------------------------------------------------------------------
118 4 40364 594228 653873 1153092
Takže PSS
je zde zajímavý sloupec, protože bere v úvahu sdílenou paměť.
Na rozdíl od RSS
má smysl to sečíst. Zde získáme celkem 654 Mb pro uživatelské procesy.
Výstup pro celý systém vypovídá o zbytku:
# smem -tw
Area Used Cache Noncache
firmware/hardware 0 0 0
kernel image 0 0 0
kernel dynamic memory 345784 297092 48692
userspace memory 654056 181076 472980
free memory 15828 15828 0
----------------------------------------------------------
1015668 493996 521672
Takže 1 Gb RAM celkem =654 Mb procesů v uživatelské zemi + 346 Mb paměť jádra + 16 Mb zdarma
(dejte nebo vezměte pár Mb)
Celkově je asi polovina paměti využita pro cache (494 Mb).
Bonusová otázka :co je zde uživatelská mezipaměť vs mezipaměť jádra?
btw pro něco vizuálního zkuste:
# smem --pie=name
Opravdu dobrý nástroj je pmap
které vypisují aktuální využití paměti pro určitý proces:
pmap -d PID
Více informací o něm najdete na manuálové stránce man pmap
a také se podívejte na 20 nástrojů pro monitorování systému Linux, které by měl znát každý správce systému, které obsahují seznam skvělých nástrojů, které vždy používám k získání informací o svém linuxovém boxu.