[Megoldva] Valami eszi a memóriát Linux alatt

 ( enpassant | 2017. február 16., csütörtök - 18:37 )

Valami megeszi a memóriámat, Ubuntu 16.04-es alatt.

A nap folyamán szépen, folyamatosan növekszik a lefoglalt memória mérete, egészen addig, hogy a 16GB rendszermemória mind elfogy és még a swap-ből is foglal 3-8GB-ot.

Ha kilépek a a legnagyobb memória használó programokból (VirtualBox, ThunderBird és Firefox), akkor felszabadul sok memória, ~8-10GB-t, de a swap nem ürül és egy rakat memória marad foglalva a rendszermemóriában is.

Ezután indítok egy swapoff -ot. Ez mintegy 20-40 perc alatt átpakolja a dolgokat a rendszermemóriába. Ez is miért ilyen borzalmasan lassú? Mindegy, ez nem érdekelne különösebben, ha nem fogyna ki a memóriám.
Ezután ürítem az összes cache és buffer memóriát a

vmstat -s && sudo sync && echo 1 | sudo tee /proc/sys/vm/drop_caches && vmstat -s
vmstat -s && sudo sync && echo 2 | sudo tee /proc/sys/vm/drop_caches && vmstat -s
vmstat -s && sudo sync && echo 3 | sudo tee /proc/sys/vm/drop_caches && vmstat -s
vmstat -s && sudo sync && echo 4 | sudo tee /proc/sys/vm/drop_caches && vmstat -s

parancsokkal, de alig valamit fogy.
Ezután még mindig maradt rengeteg, a mai nap pl. 9GB inactive memóriám.

> vmstat -s
     16353932 K total memory
      1066652 K used memory
       776020 K active memory
      9212624 K inactive memory
      6112500 K free memory
          144 K buffer memory
      9174636 K swap cache
     17407996 K total swap
            0 K used swap
     17407996 K free swap
       485675 non-nice user cpu ticks
         7309 nice user cpu ticks
      2367435 system cpu ticks
     26530867 idle cpu ticks
       195613 IO-wait cpu ticks
            0 IRQ cpu ticks
         1492 softirq cpu ticks
            0 stolen cpu ticks
     23080588 pages paged in
     23883239 pages paged out
       950019 pages swapped in
       960659 pages swapped out
     56814181 interrupts
    352367372 CPU context switches
   1487224431 boot time
        19722 forks

Hogyan lehet megnézni, hogy ezt melyik programok foglalták?
Hogyan lehet rávenni a rendszert, hogy ezt az inactive memóriát is szabadítsa fel?

Előre is köszönöm a hasznos tanácsokat!

Megoldás:
A telepített bootchart programot kell letörölni. Részletek itt.

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Megis hogyan szabaditsa fel a *hasznalt* memoriat a rendszer? Itt bizony fogalomzavar van, csakugy, mint a drop_caches hasznalatanal, mert ami tenyleges hasznalatban van, az szinte azonnal visszaugrik a page cache-be. A hasznalt swap merete miert zavar? Oda kerulnek ki azok a lapok, amiket nem nagyon hasznal a rendszer (peldaul azert, mert inactive). Ha tenylegesen aktiv swapping van, az persze egeszen mas. Mindenesetre 10GB memoriahasznalat nem gyenge. A top mit mutat, mik foglaljak a legtobb memoriat? Amugy 16GB swap (plane, ha nem SSD-rol van szo) igencsak tulzasnak tunik, reg rossz, ha GB-okban merheto az aktivan hasznalt swap.

> Megis hogyan szabaditsa fel a *hasznalt* memoriat a rendszer? Itt bizony fogalomzavar van

Inactive memory is memory that was allocated to a process that is no longer running.

Tehát azt a memóriát kellene felszabadítani, amit korábban használt olyan process, ami már nem fut. Ez a memória jelenleg nincs használatban.

> A top mit mutat, mik foglaljak a legtobb memoriat?

A top csak a jelenleg is futó processek memóriafoglalását mutatja. Ha megnézed, az active memória mindössze 1GB alatti.

Bocs, de ez netto hulyeseg, aki irta, az finoman szolva is fogalmatlan volt.

Én csak ilyeneket találtam, a CentOS doksijában pl. ezt:
Inactive — The total amount of buffer or page cache memory, in kilobytes, that are free and available. This is memory that has not been recently used and can be reclaimed for other purposes.

Akkor meg tudnád mondani, hogy szerinted mi az Inactive memory?
Esetleg valami építő jellegű dolgot?

Amikor kikapcsoltad a swapet, akkor minden ment a swap cache-be, amiből a kernel újra ki fog swapelni a diszkre amint memória kell valaminek. Az inaktívnak jelölt lapok a swap cache-ből kerülnek ki. Az inaktív memória csak egy flag, nem allokációt jelöl, amikor a kernelnek memória kell, akkor az allokált memória azon részéből fog felszabadítani ami az inaktív listán van - ennyi a szerepe.

A CentOS definíciója nagyjából helyes, az első definíció viszont valóban komplett hülyeség. Nézd meg, hogy melyk processz lapjai eszik a swapet:

$ grep VmSwap /proc/*/status | sort -nk2

Esetleg másold be a /proc/meminfo tartalmát ide amikor úgy érzed, hogy elfogyott a memóriád.

Egyébként sose akard felszabadítani az összes memóriát, nem mész vele semmire.

> Az inaktív memória csak egy flag, nem allokációt jelöl, amikor a kernelnek memória kell, akkor az allokált memória azon részéből fog felszabadítani ami az inaktív listán van - ennyi a szerepe.

Pont ez nem történik meg! Amikor az inactive memória kifogyasztja az összes rendszermemóriát (vagyis a nagy részét, mert a swappiness 10-re van állítva), akkor elkezd swap-pelni, ahelyett, hogy az inactive-hoz nyúlna.

> Nézd meg, hogy melyk processz lapjai eszik a swapet:

Nem a swap-pel van a baj, hanem az ismeretlen inactive memóriával, ami szép lassan, vég nélkül növekszik. Ha a swap-et kikapcsolom, akkor ha kifogy a rendszermemóriából, akkor elkezd processeket kilőni (pl. Virtualbox), pedig ~8G inactive memória van.

Ha majd elkezd swap-elni, akkor figyelni fogom. Köszi!

> Egyébként sose akard felszabadítani az összes memóriát, nem mész vele semmire.

Nem azt akarom felszabadítani, hanem azt szeretném, hogy ne nőjön vég nélkül az inactive memória, és ha szükség van rá, akkor pedig használja!

Egy ideje elkezdett swap-pelni, már 1,6G swap-et is foglalt, az aktív processek közül alig valami foglal swap-et.

> grep VmSwap /proc/*/status | sort -nk2
/proc/9678/status:VmSwap:	       0 kB
/proc/self/status:VmSwap:	       0 kB
/proc/thread-self/status:VmSwap:	       0 kB
/proc/1806/status:VmSwap:	       4 kB
/proc/1416/status:VmSwap:	      28 kB
/proc/2625/status:VmSwap:	      32 kB
/proc/1435/status:VmSwap:	     120 kB

> vmstat -s
     16353932 K total memory
      7924968 K used memory
      2245904 K active memory
      7064620 K inactive memory
       169784 K free memory
        28520 K buffer memory
      8230660 K swap cache
     17407996 K total swap
      1637460 K used swap
     15770536 K free swap

Ahogy látszik már a használt swap-ből is csak ~180kB-t ami aktív, a többi ~1,6GB pedig inactive lehet.

Most ezeket egyszerre:
[code]
$ awk '/VmSwap/{ t += $2 } END{ print t" KB" }' /proc/*/status
$ env df -Tt tmpfs
$ vmstat -s
[code]

> awk '/VmSwap/{ t += $2 } END{ print t" KB" }' /proc/*/status
260 KB

> env df -Tt tmpfs
Fájlrendszer   Típ.  1K-blokk Fogl.  Szabad Fo.% Csatol. pont
tmpfs          tmpfs  1635396 18008 1617388   2% /run
tmpfs          tmpfs  8176964   616 8176348   1% /dev/shm
tmpfs          tmpfs     5120     4    5116   1% /run/lock
tmpfs          tmpfs  8176964     0 8176964   0% /sys/fs/cgroup
cgmfs          tmpfs      100     0     100   0% /run/cgmanager/fs
tmpfs          tmpfs  1635396    80 1635316   1% /run/user/1000

> vmstat -s
     16353932 K total memory
      7782960 K used memory
      1319908 K active memory
      6257956 K inactive memory
      2089376 K free memory
         1128 K buffer memory
      6480468 K swap cache
     17407996 K total swap
      2908076 K used swap
     14499920 K free swap

Eh, ez a "vmstat -s" végig megtévesztett, azt hittem, hogy a "swap cache" megegyezik a /proc/meminfo "SwapCached" sorával, pedig köze nincs hozzá.

Hagyjuk ezt a vmstat-ot, mutasd plz a /proc/meminfo tartalmát.

Az inactive memória nem fogyaszt ki semmit. Valami más fogyasztja ki, aminek az egyik tulajdonsága, hogy inactive listán van.

Nem tudom, hogy magyarázhatnám másképp.. Mondjuk ez olyan, mintha azt állítanád, hogy a feketék ragadozók. Részben igaz, mert a fekete kutyák tényleg ragadozók. :)

> Az inactive memória nem fogyaszt ki semmit. Valami más fogyasztja ki, aminek az egyik tulajdonsága, hogy inactive listán van.

Persze, én is így értem. Olyan, mintha valami erősen memory-leakel-ne.
Az a kérdés, hogyan lehet ennek a valaminek a nyomára bukkanni, mert nincs olyan process, ami az induláshoz képest 6-8G-val többet foglalna.
A /proc/meminfo talán beszédesebb:

> cat /proc/meminfo
MemTotal:       16353932 kB
MemFree:         2022116 kB
MemAvailable:    2294408 kB
Buffers:            1936 kB
Cached:          6329968 kB
SwapCached:       103856 kB
Active:          1406076 kB
Inactive:        6240096 kB
Active(anon):    1036800 kB
Inactive(anon):  6114796 kB
Active(file):     369276 kB
Inactive(file):   125300 kB
Unevictable:          48 kB
Mlocked:              48 kB
SwapTotal:      17407996 kB
SwapFree:       14499920 kB
Dirty:               136 kB
Writeback:             0 kB
AnonPages:       1210540 kB
Mapped:          6772144 kB
Shmem:           5837292 kB
Slab:             175484 kB
SReclaimable:      66964 kB
SUnreclaim:       108520 kB
KernelStack:       10576 kB
PageTables:        47740 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    25584960 kB
Committed_AS:   19860284 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
HardwareCorrupted:     0 kB
AnonHugePages:    509952 kB
CmaTotal:              0 kB
CmaFree:               0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:      182016 kB
DirectMap2M:     3934208 kB
DirectMap1G:    13631488 kB

Ami ebben viszonylag sok, az az Shmem. Én is küzdöttem ezzel, még írtam is róla itt.

Nézd meg és másold be, hogy összesen mennyi Shmem allokációért felelősek a futó processzek:
$ awk '/RssShmem/{ t += $2 } END{ print t" KB" }' /proc/*/status
Ugyanez lebontva ha kíváncsi vagy:
$ grep ^RssShmem /proc/*/status | sort -nk2

Illetve ezt is másold be:
$ ipcs -mu

És ezt is:
$ free -m

Köszi, az írásod majd elolvasom!

> awk '/RssShmem/{ t += $2 } END{ print t " KB" }' /proc/*/status
 KB

> grep RssShmem /proc/*/status | sort -nk2

> ipcs -mu

------- Osztott memória állapota --------
segments allocated 29
pages allocated 48211
pages resident  11788
pages swapped   0
Swap performance: 0 attempts	 0 successes

> free -m
              total        used        free      shared  buff/cache   available
Mem:          15970        7473        1056        5773        7440        2335
Swap:         16999        2839       14160

Mi a fene, nincs RssShmem infó a /proc/*/status fájljaidban..? Nálam 4.8.16-os kernelen működik.

Mi van benne?
$ egrep "^(Vm|Rss)" /proc/$$/status

valami csúnyán leakeli az shmem-et...
--
Gábriel Ákos
http://ixenit.com

Amit jelenleg nem használnak, az már szabad. Nem?

Vagy arra gondolsz, hogy lefoglalja, kilép, de a foglalás megmarad, tehát még használtnak tűnik?

oom killerezik a kernel, nem indulnak programok, vagy honnan gondolod, hogy nincs eleg memoria? vagy csak bekepzeled a statisztikakbol?

--
NetBSD - Simplicity is prerequisite for reliability

tehat csak kepzeled :)

--
NetBSD - Simplicity is prerequisite for reliability

Köszi!
Ott nekem úgy tűnik, hogy 4G RAM esetén van problémájuk, hogy ~1-2GB-ot foglal.
Mindenesetre leállítottam az evolution service-eket és a Gnome Software-t. Azonnali hatása egyelőre nem lett.
Az ott említettekből még a Virtualbox lehet talán a nagy fogyasztó, de annak a Virtuális (és a rezidens) memória mérete sem emelkedett indulás óta. Tegnap, amikor kilőttem, akkor sem csökkent le az inaktív memória, meg egy rakat process-t lezártam, azoktól sem.

Egyszer valamikor régen olvastam valami olyasmit, hogy amit tmpfs-ként mountolsz fel (általában /tmp, illetve rendszertől függően akár más könyvtárak is), azokra ha írsz valamit akkor azt valójában swap-be írja. Annó én is szívtam vele, nem értettem mi swap-el 64gb ram mellett, de ott végül az lett a megoldás hogy egy cronból futó script /tmp-be írkált, így szépen nőtt a swap. Ha törlöd a felesleges fájlokat /tmp-ből, akkor csökkenni fog a swap használat is.

Tehát az hogy nem ürül a swap, nem feltétlenül hiba, hanem feature :)

Köszi!
Nálam nem ez a helyzet, ha a /tmp-be írok, akkor sem nő a swap. Illetve nagy a swap, akkor is, amikor a /tmp szinte üres. A swap tartalom csak akkor kezd el nőni, ha kifogy a rendszer memóriából.

Mutass azért egy kimenetet:

$ env df -Tt tmpfs

inactive memory
The amount of inactive memory (in KB), or memory that has not been used for a while and is eligible to be swapped to disk.
Forrás: http://books.gigatux.nl/mirror/linuxperformanceguide/0131486829/ch03lev1sec2.html

Ez is igaz, de az inaktív memória pl tartalmazza a page cache tiszta lapjait is, ami egyszerűen felszabadításra kerül ha szükség van rá.

Milyen kernel verziot hasznalsz?
Esetleg ez: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1655842

-----
“Firefox, you say? No I don't play Pokémon”

Köszi!

A már javítottat: 4.4.0-63-generic #84-Ubuntu

Milyen videokártyád van?

Integrált Intellel megy, de van nVidia is.
Kipróbálom azzal is.

Szerk.:
Nincs változás, ugyanúgy másodpercenként cirka 1-2MB-tal nő a Cached, Inactive és az Shmem; kb. ugyanannyival csökken a MemFree és a MemAvailable.

Az összes futó felhasználói programot kilőttem, plusz a nem létszükséglet service-eket, daemonokat; uninstalláltam az evolution service-it, telepítettem a MATE-t, hátha a Compiz vagy a Unity a bűnös, de egyik esetben sem lett változás.

Valószínűnek tartom, hogy valami kernel bug lehet, de nem azok, amiket korábban is írtatok.

16GB rendszermemória mellett én évek óta nem használok swap-et. Sosem volt még rá szükség. Ha tényleg kihasználod mind a 16 Gb-ot, akkor bővítsd. Én a swap-et elfelejteném.

zolti@zolti-desktop:~$ uname -a
 Linux zolti-desktop 4.4.0-62-generic #83-Ubuntu SMP Wed Jan 18 14:10:15 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

zolti@zolti-desktop:~$ uptime 
 13:21:11 up 6 days, 19:35,  1 user,  load average: 0,65, 0,77, 0,90

zolti@zolti-desktop:~$ vmstat -s
     16125716 K total memory
      4141980 K used memory
      6046744 K active memory
      1925536 K inactive memory
      7629008 K free memory
       426144 K buffer memory
      3928584 K swap cache
            0 K total swap
            0 K used swap
            0 K free swap
      2468470 non-nice user cpu ticks
        11505 nice user cpu ticks
       480223 system cpu ticks
      6571562 idle cpu ticks
        24096 IO-wait cpu ticks
            0 IRQ cpu ticks
        26781 softirq cpu ticks
            0 stolen cpu ticks
      2358143 pages paged in
      9464372 pages paged out
            0 pages swapped in
            0 pages swapped out
     58068008 interrupts
    139356656 CPU context switches
   1486831556 boot time
       348085 forks

Írhatnál arról is, hogy amikor sok az inactive memória, akkor az mennyire befolyásolja a rendszer sebességét, reakcióidejét.

Ha nincs swap (kikapcsolom), akkor ahogy írtam is, elkezd OOM killerkedni és lövi ki a processeket.
Ha van swap, akkor észrevehető lassulás nincs. (A swap SSD-n van)
Ilyenkor a nap végén (10-12 óra) 4-8G swap fogy a 17G-ből, tehát még egy fél napot bírná ;-)

Igaziból együtt tudok vele élni, de mostanra elkezdett annyira zavarni, hogy mi lehet ez, ami így eszi a memóriát és miért nem lehet a nyomára bukkanni, hogy elkezdtem komolyabban nyomozni utána, de lassan feladom.

Megoldás:
A telepített bootchart programot kell letörölni. Részletek itt.

Köszi az infót, tényleg jókat írnak róla itt: https://community.linuxmint.com/software/view/bootchart

Méghogy a boot-olást naplózza és utána leáll, köszi :)