Linux, memory leak a OOM killer

v

Linux, memory leak a OOM killer
« kdy: 20. 02. 2017, 13:27:29 »
RssAnon procesu roste i když strace neukazuje volání (s)brk/mmap a po nějaké době dorazí oom reaper
pomoc
« Poslední změna: 20. 02. 2017, 20:46:59 od Petr Krčmář »


MP

Re:linux, memory leak
« Odpověď #1 kdy: 20. 02. 2017, 13:52:35 »
valgrind ?

Jenda

Re:linux, memory leak
« Odpověď #2 kdy: 20. 02. 2017, 13:55:14 »
Protože ti při různých příležitostech dá kernel stránky, které vůbec nemá, nebo je přes CoW sdílíš s někým jiným. Teprve v okamžiku, kdy je začneš špinit, ti je musí dát a začne růst RSS.

v

Re:linux, memory leak
« Odpověď #3 kdy: 20. 02. 2017, 14:25:12 »
Protože ti při různých příležitostech dá kernel stránky, které vůbec nemá, nebo je přes CoW sdílíš s někým jiným. Teprve v okamžiku, kdy je začneš špinit, ti je musí dát a začne růst RSS.
není rss dirty + clean?

v

Re:linux, memory leak
« Odpověď #4 kdy: 20. 02. 2017, 14:42:01 »
valgrind ?
zatím není k dispozici, ale můžu říct, že nepozoruju volání malloc/free/etc (uneseny přes LD_PRELOAD) i když rss roste


lopata

Re:linux, memory leak
« Odpověď #5 kdy: 20. 02. 2017, 15:12:29 »
Linux dělá memory overcommit, takže ti klidně dá paměť, kterou ve skutečnosti nemá. Stačí, když uděláš fork nebo mmap s MAP_PRIVATE. Když tu paměť potom skutečně chceš použít, tak Linuxu může dojít a zaúřaduje OOM killer. Můžeš si to nastavit: https://www.kernel.org/doc/Documentation/vm/overcommit-accounting

v

Re:linux, memory leak
« Odpověď #6 kdy: 20. 02. 2017, 15:19:18 »
Linux dělá memory overcommit, takže ti klidně dá paměť, kterou ve skutečnosti nemá. Stačí, když uděláš fork nebo mmap s MAP_PRIVATE. Když tu paměť potom skutečně chceš použít, tak Linuxu může dojít a zaúřaduje OOM killer. Můžeš si to nastavit: https://www.kernel.org/doc/Documentation/vm/overcommit-accounting
tohle určitě nemůžu vyvrátit
jak tedy zjistit kolik má program naslibováno? třeba z /proc/PID/status? vmsize?

lopata

Re:linux, memory leak
« Odpověď #7 kdy: 20. 02. 2017, 15:32:14 »
jak tedy zjistit kolik má program naslibováno? třeba z /proc/PID/status? vmsize?
třeba
Kód: [Vybrat]
pmap pid

v

Re:linux, memory leak
« Odpověď #8 kdy: 20. 02. 2017, 15:45:06 »
Kód: [Vybrat]
pmap pid
vidím total cca 47MB na systému s 32MB paměti, asi přihořívá

Lopatlal

Re:linux, memory leak
« Odpověď #9 kdy: 20. 02. 2017, 16:02:56 »
Tady to je detailne rozepsano + par tipu jak se tomu vyhnout

http://www.linuxdevcenter.com/pub/a/linux/2006/11/30/linux-out-of-memory.html?page=2

v

Re:linux, memory leak
« Odpověď #10 kdy: 21. 02. 2017, 11:17:15 »
jak tedy zjistit kolik má program naslibováno? třeba z /proc/PID/status? vmsize?
třeba
Kód: [Vybrat]
pmap pid
děkuji, pmap jsem zatím neznal
existuje nějaký známý způsob jak poznat co je na které [ anon ] adrese?

lopata

Re:linux, memory leak
« Odpověď #11 kdy: 21. 02. 2017, 11:36:02 »
existuje nějaký známý způsob jak poznat co je na které [ anon ] adrese?
Kód: [Vybrat]
cat /proc/PID/maps

v

Re:linux, memory leak
« Odpověď #12 kdy: 21. 02. 2017, 11:42:31 »
existuje nějaký známý způsob jak poznat co je na které [ anon ] adrese?
Kód: [Vybrat]
cat /proc/PID/maps
tam právě není nic, prázdný řetězec, v pmap pak [anon]
mám teď na mysli nějakou instrumentaci v aplikaci, umím si představit heap, stack, nevím co si představit dál

lopata

Re:linux, memory leak
« Odpověď #13 kdy: 21. 02. 2017, 11:46:44 »
mám teď na mysli nějakou instrumentaci v aplikaci, umím si představit heap, stack, nevím co si představit dál
Potom massif (http://valgrind.org/docs/manual/ms-manual.html) ideálně s --pages-as-heap=yes.

v

Re:Linux, memory leak a OOM killer
« Odpověď #14 kdy: 22. 02. 2017, 09:18:31 »
takže overcommit je zřejmě to, co nám podrazilo nohy, teď potřebuju umravnit aplikaci

výběr z pmap :
Address   Kbytes     RSS   Dirty Mode  Mapping
76a1b000   13716   12148   12148 rw---   [ anon ]
RSS roste z cca 4000 po startu aplikace, toto je ze systému se 128M RAM, naneštěstí se musím vypořádat i se systémem s 32MB
mám cca 30 vláken, přes pthread_attr_getstack vím, že v tomto rozsahu se nacházejí (některé) zásobníky, ty jsou ovšem v ulimit nastaveny na 128k (30*128kB je mnohem méně než 12148)

pomoc prosím