์๋ก์ด elektrad๋ฅผ ๋ฒค์น๋งํนํ๋ ๋์ ๋ฉ๋ชจ๋ฆฌ ๋์ ์ฆ์์ ๊ฒฝํํ์ต๋๋ค.
๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ ํธ๋ค์ ๋ง๋ค๊ณ kdbGet()
ํธ์ถ ํ ํ์ ์ฆ๊ฐํ์ง๋ง ksClose()
๋ฐ kdbClose()
ํ์๋ ์ ๋ ๊ฐ์ํ์ง ์์ต๋๋ค.
๋ด ์ฒซ ๋ฒ์งธ ์์ฌ์ mmap ์บ์ฑ์ด์์ต๋๋ค. mmaped ๋ฉ๋ชจ๋ฆฌ๊ฐ ํด์ ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ ์๋ ์์ต๋๋ค.ํ์ง๋ง -DPLUGINS="ALL;-cache"
๋ก ๋น๋ํ์ฌ ์บ์ฑ์ ๋นํ์ฑํํด๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์์์ต๋๋ค.
์ด๋> = 1.13
go-elektra repo์ ๋ ๊ฐ์ ํ ์คํธ๋ฅผ ๋ง๋ค์์ต๋๋ค. ๋ ๋ค 100,000 ๊ฐ์ ํค๊ฐ์๋ ํ ์คํธ ํค ์ธํธ๋ฅผ ๋ง๋ญ๋๋ค.
TestKeySetMemory
๋ฃจํ์์ ํธ๋ค๊ณผ kdbGets
ํค ์ธํธ๋ฅผ ๋ง๋ค๊ณ 1 ์ด ๋์ ๊ธฐ๋ค๋ฆฐ ํ-๋ค์ ์์ํ๊ธฐ ์ ์ ํค ์ธํธ + ํธ๋ค์ ์ฆ์ ๋ค์ ๋ซ์ต๋๋ค.TestKeySetMemoryWithDelayedClose
๋ ํธ๋ค์ ๋ง๋ค๊ณ ํค ์ธํธ๋ฅผ kdbGets
์ฑ ์๋๋ค. ๊ทธ๋ฌ๋ 20 ๊ฐ์ ํค ์ธํธ๊ฐ ๋ชจ๋๋ก๋ ๋ ๋๊น์ง ํธ๋ค๊ณผ ํค ์ธํธ ๋ซ๊ธฐ๋ฅผ ์ง์ฐํฉ๋๋ค. ์ด๊ฒ์ elektrad ์น ์๋ฒ์ ๋์์ ๋ชจ๋ฐฉํฉ๋๋ค.๋ ํ
์คํธ ๋ชจ๋ ์ข
๋ฃ ํ 20 ์ด ๋์ ๋๊ธฐํ์ฌ ํ
์คํฐ๊ฐ htop
๋๋ ์ ์ฌํ ๋๊ตฌ๋ฅผ ํตํด ํ
์คํธ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ํ์ธํ ์ ์์ต๋๋ค.
ํธ๋ค๊ณผ ํค์ ์ ์ฆ์ ๋ซ๋ ์ฒซ ๋ฒ์งธ ํ ์คํธ๋ ํ ์คํธ ๊ธฐ๊ฐ ๋์ ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ์งํฉ๋๋ค.
๋ชจ๋ ํค ์งํฉ์ด '๋ก๋'๋ ํ์ ๋ง โโํธ๋ค๊ณผ ํค ์งํฉ์ ๋ซ๊ธฐ ์์ํ๋ ๋ ๋ฒ์งธ ํ ์คํธ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ์ง ์์ต๋๋ค. ๊ฐ๋น์ง ์์ง์ ๊ฐ์ ํ๊ณ 20 ์ด ๋์ ๊ธฐ๋ค๋ฆฐ ํ์๋.
ํ์ฌ๋ก์๋ ์ด๋ฌํ ํ ์คํธ์ ๋์์ด ๋ค๋ฅธ ์ด์ ๋ฅผ ์ ์ ์์ต๋๋ค.
go-elektra
์ ์ฅ์๋ฅผ ๋ณต์ ํ๊ณ ./kdb
ํ์ ๋๋ ํฐ๋ฆฌ์์ ๋ค์ ๋ ๋ช
๋ น์ ์คํํ์ฌ ํ
์คํธ๋ฅผ ์คํํ ์ ์์ต๋๋ค.
PKG_CONFIG_PATH=<PATH TO elektra.pc FILE> go test -run "^(TestKeySetMemory)\$"
PKG_CONFIG_PATH=<PATH TO elektra.pc FILE> go test -run "^(TestKeySetMemoryWithDelayedClose)\$"
kdbClose
๋ฐ ksClose
ํ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํด์ ๋ฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ๊ฐ ํด์ ๋์ง ์์ต๋๋ค.
valgrind ๋ฐ ASAN ํ ์คํธ์์ ์ด์ ๊ฐ์ ๊ฒ์ด ์คํจ ํ ๊ฒ ๊ฐ์ง๋ ์์ต๋๋ค. ๋๋ C์์ ์ ์ฌํ ๋ฒค์น ๋งํฌ๋ฅผ ์คํ ํด ์๊ณ ๋์ผํ ๊ฒ์ ๊ด์ฐฐ ํ ์ ์์๋ค. mmap์ ์ฌ์ฉํด๋ ๋น์ทํ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ๋ฐฐ์ ํ์ง ์์ต๋๋ค.
๋ฐ์ธ๋ฉ์ด ์ด๋๊ฐ์ ๋์ถ๋์ง ์๋ ๊ฒ์ด ํ์คํฉ๋๊น?
์, ํ์คํฉ๋๋ค. ๋ฐํ์ ์ค์ go ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๊ฒ์ฌ ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ํต๊ณ์๋ C ์ฝ๋์ ์ํ ํ ๋น์ด ํฌํจ๋์ด ์์ง ์์ผ๋ฉฐ ์ ํ๋ฆฌ์ผ์ด์ / ํ ์คํธ์ ์ด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๊ฐ๊น์ง ์์ต๋๋ค. ๋๋์ ๋ฉ๋ชจ๋ฆฌ๊ฐ C์ ํ ๋น๋ฉ๋๋ค.
๋ด ์์ฌ์ ref ์นด์ดํฐ๊ฐ != 0
์ด์ด์ผํ์ง๋ง 0
์ด๋ฏ๋ก ํค๊ฐ ํด์ ๋์ง ์๋๋ค๋ ๊ฒ์
๋๋ค.
์ฆ, ๋ฐ์ธ๋ฉ์์ด memleak์ ํธ๋ฆฌ๊ฑฐํ๋ ๋ฐฉ์์ผ๋ก C API๋ฅผ ํธ์ถํฉ๋๋ค. ๋ถํํ๋ ๋๋ ์ด๋์ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ์ ์ด๋ฐ ์ผ์ด ๋ฐ์ํ๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋์ถ์ ์ ๋ฐํ๋ ์์ C ์์ ๋ฅผ ์ถ์ถ ํ ์ ์์ต๋๊น? ์ ๋ benchmarks/kdb.c
์์ ๋งค์ฐ ์ ์ฌํ ์์
์ ์ํํ๊ณ ๊ฑฐ๊ธฐ์ ๋์ถ์ด ์์ผ๋ฏ๋ก ๋์ถ์ ์ ๋ฐํ๊ธฐ ์ํด ๋ฒค์น ๋งํฌ๊ฐ ์ํํ๋ ์์
์ ์ ํํ ์ํํด์ผํฉ๋๋ค.
๋ฌธ์ ๋ฅผ ์ ๊ณ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
๋๋ ์ฌ๊ธฐ์ @mpranj์ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋ฌธ์ ๋ฅผ ์ต์ํ์ ๊ฒ์ผ๋ก ์ค์ฌ์ผํฉ๋๋ค. ์ฌ๋ฌ ์ธ์ด๊ฐ ๊ด๋ จ๋์ด์์ด์ ์๋ฌด๊ฒ๋ ์ฐพ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค.
go ๋ฐ์ธ๋ฉ์์ ๋ฐํ ๋ ํธ์ถ ์์๋ฅผ ์ฌํํ๋ C ํ๋ก๊ทธ๋จ์ ์์ฑํ ์ ์์ต๋๊น? ์ผ๋จ ์ฐ๋ฆฌ๋ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ํด C ํ๋ก๊ทธ๋จ์ ์ต์ํ ํ ์ ์์ต๋๋ค.
Btw. ์์ ๋ช ๋ น์ ์คํํ๋ ค๊ณ ํ๋ฉด ์์ฃผ ์ผ์ฐ ์คํจํ์ต๋๋ค. # 3159
๋ด์ผ๊น์ง C๋ก ์ฌํ ํด ๋ณผ๊ฒ์
์ด ๋ฌธ์ ๋ฅผ ์ฌ๊ธฐ์์ ์ฑ๊ณต์ ์ผ๋ก ์ฌํํ์ต๋๋ค. benchmarks/memoryleak.c
๋ฒค์น ๋งํฌ๋ฅผ ์คํํ๊ณ ํค ์ธํธ๋ฅผ ๊ฐ์ ธ ์ค๋ ๋์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ฆ๊ฐํ๋์ง ํ์ธํ๊ณ ํด์ ํ ๋ ๊ฐ์ ํ์ง ์๋์ง ํ์ธํฉ๋๋ค.
DB์ ๋์ ๋๋ ์์ ํค๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค. .. ์ ๋ 10 ๋ง ๊ฐ์ ํค๋ก ํ ์คํธํ์ต๋๋ค.
์์ ๋ฅผ ๋ง๋ค์ด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! ๋ด๊ฐ ์ดํด๋ณผ ๊ฒ.
์ธ๋ป๋ณด๊ธฐ์ ์ ํํ ํ๋์ ์ง์ ๋์ถ์ด ์์ผ๋ฉฐ parentKey๋ฅผ ํด์ ํด์ผํฉ๋๋ค.
https://github.com/raphi011/libelektra/blob/afcbcf5c8138be8de6ba9b1a9e559bc673ff887f/benchmarks/memoryleak.c#L22
์ด ์์ ๋์ถ์ ์๋ง๋ ๋น์ ์ด ๊ด์ฐฐ ํ ์ด์ ๊ฐ ์๋ ๊ฒ์ ๋๋ค.
์ฌ์ด๋ ์ฐธ๊ณ ๋ก ๋ค์์ mmap ์บ์๋ฅผ ์ฌ์ฉํ์ฌ, ๋๋ ์บ์ํ์ง ์๊ณ ๋ณด๋ค ๋ ์ ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ํ์ธํ ์ ์์ต๋๋ค. ์๋ง ๋๋ ์ด๊ฒ์ ๋ด ๋ ผ๋ฌธ์ ์ถ๊ฐํด์ผ ํ ๊ฒ์ ๋๋ค : smile :. (์บ์ : ~ 200M vs. ์บ์ ์์ : ~ 600M)
dlopen() / dlclose()
๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ "๋์"ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ค์์ kdb
ํ์ง๋ง kdb-static
์ฌ์ฉํ์ง ์์ผ๋ฉด ๊ด์ฐฐ ํ ์ ์์ต๋๋ค (๋ฐ์ท).
valgrind --leak-check=full --show-leak-kinds=all ./bin/kdb ls user
[...]
==48451== 1,192 bytes in 1 blocks are still reachable in loss record 6 of 6
==48451== at 0x483AB1A: calloc (vg_replace_malloc.c:762)
==48451== by 0x400BB11: _dl_new_object (in /usr/lib64/ld-2.30.so)
==48451== by 0x400642F: _dl_map_object_from_fd (in /usr/lib64/ld-2.30.so)
==48451== by 0x4009315: _dl_map_object (in /usr/lib64/ld-2.30.so)
==48451== by 0x400DB24: openaux (in /usr/lib64/ld-2.30.so)
==48451== by 0x4DFE8C8: _dl_catch_exception (in /usr/lib64/libc-2.30.so)
==48451== by 0x400DF6A: _dl_map_object_deps (in /usr/lib64/ld-2.30.so)
==48451== by 0x4013AC3: dl_open_worker (in /usr/lib64/ld-2.30.so)
==48451== by 0x4DFE8C8: _dl_catch_exception (in /usr/lib64/libc-2.30.so)
==48451== by 0x401363D: _dl_open (in /usr/lib64/ld-2.30.so)
==48451== by 0x496139B: dlopen_doit (in /usr/lib64/libdl-2.30.so)
==48451== by 0x4DFE8C8: _dl_catch_exception (in /usr/lib64/libc-2.30.so)
[...]
๊ทํ์ ์์ ๋ ๋ง์ ํธ๋ค์ ๋ ๋ง์ด ์ด๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ ๋๋ค.
==48735== 72,704 bytes in 1 blocks are still reachable in loss record 8 of 8
==48735== at 0x483880B: malloc (vg_replace_malloc.c:309)
==48735== by 0x4F860A9: ??? (in /usr/lib64/libstdc++.so.6.0.27)
==48735== by 0x400FD59: call_init.part.0 (in /usr/lib64/ld-2.30.so)
==48735== by 0x400FE60: _dl_init (in /usr/lib64/ld-2.30.so)
==48735== by 0x4013DBD: dl_open_worker (in /usr/lib64/ld-2.30.so)
==48735== by 0x4A088C8: _dl_catch_exception (in /usr/lib64/libc-2.30.so)
==48735== by 0x401363D: _dl_open (in /usr/lib64/ld-2.30.so)
==48735== by 0x48C739B: dlopen_doit (in /usr/lib64/libdl-2.30.so)
==48735== by 0x4A088C8: _dl_catch_exception (in /usr/lib64/libc-2.30.so)
==48735== by 0x4A08962: _dl_catch_error (in /usr/lib64/libc-2.30.so)
==48735== by 0x48C7B08: _dlerror_run (in /usr/lib64/libdl-2.30.so)
==48735== by 0x48C7429: dlopen@@GLIBC_2.2.5 (in /usr/lib64/libdl-2.30.so)
์ด ์์์๋ ๋ง์ KDB ํธ๋ค์ ์ด์ด์ด ํจ๊ณผ๊ฐ ์ถ๊ฐ๋์ด ์๋นํ ๋ฉ๋ชจ๋ฆฌ ์๋น๊ฐ ๋ฐ์ํฉ๋๋ค. ํธ๋ค์ ํ๋๋ง ์ด๋ฉด ๋ ์์์ผํฉ๋๋ค. @ raphi011 ๋ฒค์น ๋งํฌ์ kdb-static
๋ฅผ ์ฌ์ฉํ ์ ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ฒค์น ๋งํฌ๋ฅผ elektra-static
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฐ๊ฒฐํ ๋ ๋ ์ด์ ๋์ผํ ๊ฒ์ ๊ด์ฐฐ ํ ์ ์์ต๋๋ค.
==54836== HEAP SUMMARY:
==54836== in use at exit: 0 bytes in 0 blocks
==54836== total heap usage: 6,456,631 allocs, 6,456,631 frees, 272,753,180 bytes allocated
==54836==
==54836== All heap blocks were freed -- no leaks are possible
==54836==
==54836== For lists of detected and suppressed errors, rerun with: -s
==54836== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
ํ์ฌ dlopen()
๋ฌธ์ ์ ๋ํด ๋ฌด์์ ํ ์ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ด๊ฒ์ ์๋ก์ด elektrad
์๋ฒ์ ๋จ์ํ ๋ ์๋ฎฌ๋ ์ด์
์
๋๋ค. ๋์์ ์์คํ
์ ๊ตฌ์ฑํ๋ ์ฌ๋ฌ ์ฌ์ฉ์๋ฅผ ์ง์ํ๊ธฐ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์ ๋ค์ค ํธ๋ค (์ถฉ๋ ์ฒ๋ฆฌ ๋ฑ)์ ์ง์ํด์ผํฉ๋๋ค.
๋๋ ์ฌ์ ํ ์ด๊ฒ์ด ๋ฌธ์ ์ ๊ทผ์์ด ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ฌธ์ ๋ ํค / ํค ์ธํธ๊ฐ ํด์ ๋์ง ์๋๋ค๋ ๊ฒ์
๋๋ค. ์์ ํค๋ฅผ ํจ์ฌ ์ ์ ํค๊ฐ์๋ "system"
๋ณ๊ฒฝํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์๋น๊ฐ ํจ์ฌ ๋ฎ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
@ markus2330 ์ด๋ป๊ฒ ์๊ฐํ์ธ์?
ํธ์ง : ์ด๊ฒ์ ์์ผ์ญ์์ค.
๋๋ ์ฐ๋ฆฌ๊ฐ ๊ฑฐ๊ธฐ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋์ถํ๊ณ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
https://gist.github.com/mpranj/bbdf00af308ed3f5b3f0f35bc832756f~~
์ ์์ ์ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ HTOP ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ผ๋ก ์ค๋ช
ํ๋ ๊ฒ๊ณผ ๋์ผํ ๊ฒ์ ๊ด์ฐฐ ํ ์ ์์ต๋๋ค.
๊ทธ๋์ ๋น์ ์ elektra์ ๋ฉ๋ชจ๋ฆฌ ์๋น๊ฐ ๊ฒฐ์ฝ ์ค์ด๋ค์ง ์๋ ๊ฒ์ด ์ ๋์ ์ผ๋ก ์ ์์ด๋ผ๊ณ ๋งํ๊ณ ์์ต๋๊น?
๊ทธ๋์ ๋น์ ์ elektra์ ๋ฉ๋ชจ๋ฆฌ ์๋น๊ฐ ๊ฒฐ์ฝ ์ค์ด๋ค์ง ์๋ ๊ฒ์ด ์ ๋์ ์ผ๋ก ์ ์์ด๋ผ๊ณ ๋งํ๊ณ ์์ต๋๊น?
๋๋ ๊ทธ๋ ๊ฒ ๋งํ๋ ๊ฒ์ด ์๋๋๋ค. ๋๋ elektra์ ๊ด๊ณ์์ด ๋๊ฐ์ด ๊ด์ฐฐํ๋ค๋ ๊ฒ์ ๋งํ๋ค. ๋ฐฉ๊ธ ๋ด ๊ด์ฐฐ์ด valgrind๋ก ์คํํ ๋๋ง ์ฌ์ค์ด๋ผ๋ ๊ฒ์ ์์์ผ๋ฏ๋ก valgrind๋ ๋ค๋ฅธ ์ด์ ๋ก ๋๊น์ง free () ing๋์ง ์์ ์ ์์ต๋๋ค.
https://stackoverflow.com/questions/40917024/memory-leak-after-using-calloc-and-free
ํฌ์ธํฐ๋ฅผ ํด์ ํ๊ธฐ ์ ์ ํฌ์ธํฐ๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
ํฌ์ธํฐ๋ฅผ ํด์ ํ๊ธฐ ์ ์ ํฌ์ธํฐ๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
๋๋ ๊ทธ๋ ๊ฒํ์ง ์๊ณ valgrind๋ ์์ ์ ์ฝ๋์ ๋ํ ๋์ถ์ ๋ณด์ฌ์ฃผ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์์ ๋ฅผ ์์ผ์ญ์์ค. valgrind ๋ด๋ถ์์ ์คํ๋ ๋ ์ฆ์ ํด์ ๋์ง ์๊ธฐ ๋๋ฌธ์ ๊ด๋ จ์ฑ์ด ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ๊ฐ ๊ฑฐ์ ์ฆ์ ํด์ ๋ฉ๋๋ค.
๋ ๊ด๋ จ์ฑ์๋ ์ : KDB๋ฅผ ์ ํ ์ฌ์ฉํ์ง ์๋ benchmark_createkeys
๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ณ ๋ด์ฉ์ ๊ด์ฐฐํ์ต๋๋ค. ๋ฆฌ์์ค๋ ์ฆ์ free () d๊ฐ ์๋์ง๋ง valgrind๋ ๋์๊ฐ ์ ํ ์์์ ๋ณด์ฌ์ค๋๋ค. ๋๋ ๋นํฉํฉ๋๋ค.
@ markus2330 ์ด๋ป๊ฒ ์๊ฐํ์ธ์?
KeySet๋ง์ผ๋ก๋ ํ์คํ ๋์๊ฐ ์์ด์ผํฉ๋๋ค. (KDB์์๋ ํ๋ฌ๊ทธ์ธ์ด ๋์ถ๋๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ๋ก๋ ํ ์ ์์ผ๋ฏ๋ก ๋ชจ๋ ๊ฒ์ ์์ ํ ์ ์ด ํ ์ ์์ต๋๋ค.)
@ raphi011 PR์ ๋ง๋ค๊ฑฐ๋ ๋ฌธ์ ๋ฅผ ์ฌํํ๋ ์ต์ํ์ ์๋ฅผ
https://github.com/raphi011/libelektra/tree/memoryleak ์ฌ๊ธฐ ์์ต๋๋ค. ํค ์ฐธ์กฐ > 0
์ธํด ksDel
ํด์ ๋์ง ์์ ํค ์๋ฅผ ์ธ์ํ์ฌ ์ด์ ์์ ๋ฅผ ํ์ฅํ์ต๋๋ค.
valgrind ์์ด ๋ฒค์น ๋งํฌ๋ฅผ ์คํํ๋ฉด ํค๊ฐ ํด์ ๋์ง ์์ ์์ ์ ์ ์์ต๋๋ค.
์ด ์ ์ฅ์๋ฅผ ์ปดํ์ผ ํ ์ ์์ต๋๋ค. ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
CMake Error: Error processing file: /home/markus/Projekte/Elektra/repos/libelektra/scripts/cmake/ElektraManpage.cmake
make[2]: *** [src/bindings/intercept/env/CMakeFiles/man-kdb-elektrify-getenv.dir/build.make:61: ../doc/man/man1/kdb-elektrify-getenv.1] Fehler 1
make[1]: *** [CMakeFiles/Makefile2:17236: src/bindings/intercept/env/CMakeFiles/man-kdb-elektrify-getenv.dir/all] Fehler 2
๋ฉ์ธ ๋ง์คํฐ๋ก ๋ฆฌ๋ฒ ์ด์ค ํ ์ ์์ต๋๊น?
๊ทธ๋ฆฌ๊ณ PR์ ํด์ฃผ์๋ฉด ๋ณ๊ฒฝ ์ฌํญ์ ํ์ธํ๋ ๊ฒ์ด ํจ์ฌ ์ฝ์ต๋๋ค.
valgrind์์ด ๋ฒค์น ๋งํฌ๋ฅผ ์คํํ๋ฉด ํค๊ฐ ํด์ ๋์ง ์์ ์์ ์ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ณต์ฌ ํ ์ ์์ต๋๊น?
KDB๋ฅผ ์ ํ ์ฌ์ฉํ์ง ์๋ bench_createkeys๋ฅผ ์ฌ์ฉํ์ฌ๋ณด๊ณ ํ๋ ๋ด์ฉ์ ๊ด์ฐฐํ์ต๋๋ค. ๋ฆฌ์์ค๋ ์ฆ์ free () d๊ฐ ์๋์ง๋ง valgrind๋ ๋์๊ฐ ์ ํ ์์์ ๋ณด์ฌ์ค๋๋ค. ๋๋ ๋นํฉํฉ๋๋ค.
KeySet ๋ง ์์ผ๋ฉด ์ดํดํ๊ธฐ ํจ์ฌ ์ฝ๊ธฐ ๋๋ฌธ์ ๋จผ์ ์ด ์ถ์ ์ ๋ฐ๋ผ์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
valgrind์ ์๋ชป๋ ์ต์ ๋ฅผ ์ถ๊ฐํ์๊น์?
์ฐธ๊ณ ๋ก mmap ์บ์๋ฅผ ์ฌ์ฉํ๋ฉด ์บ์๊ฐ ์์ ๋๋ณด ๋ค ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ๋ ผ๋ฌธ์ ๋ฏธ์์ ์ด๊ฒ์ ์ถ๊ฐํด์ผ ํ ์๋ ์์ต๋๋ค. (์บ์ : ~ 200M vs. ์บ์ ์์ : ~ 600M)
์ด๊ฒ์ ํ์คํ ์ข์ ์์์ ๋๋ค.
์ฌ๊ธฐ ์์ต๋๋ค : https://github.com/ElektraInitiative/libelektra/pull/3172
valgrind์ ์๋ชป๋ ์ต์ ๋ฅผ ์ถ๊ฐํ์๊น์?
Valgrind๋ ํ ์คํธ๋ฅผ ์คํํ ๋ ์ต์ ๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๊ณ ๋ณด๊ณ ํ์ง๋ง ๊ทํ์ ๋ง์ผ๋ฆฌ์ง๋ ๋ค๋ฆ ๋๋ค.
๋ฒค์น ๋งํฌ์์ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌ ํ ๊ฒ ๊ฐ์ต๋๋ค. ๋์๊ฒ ๋ฌธ์ ๋ ๊ฐ ํค์ ๋ํ ๋ฉํ ํค ์ธํธ๋ฅผ ์ด์ฌํ ํ ๋นํ๋ ๊ฒ์ ๋๋ค. ๋ด ๋ธ๋์น์์ ๋ํฐ ํ ์คํธ๋ฅผ ํ ํ ์ด๋งํ๋ ๋ฉํ KeySet ํ ๋น์ ์ ๊ฑฐํ๋ฉด ksDel () ํ์ ๋ฉ๋ชจ๋ฆฌ ์๋น๊ฐ ๋น ๋ฅด๊ฒ ๊ฐ์ํฉ๋๋ค. ๋ด๊ฐ ๋งํ๋ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์ # 3142์ ์ํด ์์ ๋์์ ์ ์์ต๋๋ค.
์, ๊ทธ๋ผ # 3142๊ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋์ง ๋ด ์๋ค!
@ raphi011 ๋ฌธ์ ๊ฐ # 3081 ์ด์ ์๋ ๋ฐ์ ํ์ต๋๊น?
๋ถํํ๋ ๊ทธ๋ ์ต๋๋ค
๋์๊ฒ๋ ์ ์ด๋ ๋ช ๊ฐ์ง ๋ฌธ์ ๋ฅผ ํด๊ฒฐ / ์ํํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด์ 2GB ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ์๋ฐฑ๋ง ๊ฐ์ ํค๋ก ๋ฒค์น ๋งํฌ๋ฅผ ์คํํ ์ ์์ง๋ง ์ด์ ์๋ ๋์ผํ ๋ฒค์น ๋งํฌ์ ๋ํด 20GB ์ด์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ถฉ๋์ด ๋ฐ์ํ์ต๋๋ค.
๋์๊ฒ๋ ์ ์ด๋ ๋ช ๊ฐ์ง ๋ฌธ์ ๋ฅผ ํด๊ฒฐ / ์ํํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด์ 2GB ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ์๋ฐฑ๋ง ๊ฐ์ ํค๋ก ๋ฒค์น ๋งํฌ๋ฅผ ์คํํ ์ ์์ง๋ง ์ด์ ์๋ ๋์ผํ ๋ฒค์น ๋งํฌ์ ๋ํด 20GB ์ด์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ถฉ๋์ด ๋ฐ์ํ์ต๋๋ค.
์์ง ์ด์ ๋ฒ์ ๊ณผ ๋น๊ตํ์ง๋ ์์์ง๋ง ์ด์ ๋ณด๋ค ์ ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํ์ ํฉ๋๋ค. ์ค๋ ํ์ธํ๊ฒ ์ต๋๋ค!
๊ทธ๋๋ ๋ฉ๋ชจ๋ฆฌ๋ ์ฌ์ ํ ํด์ ๋์ง ์์ต๋๋ค.
free
๋ง๋ค malloc_trim(0)
๋ก ์ ํํด์ผํฉ๋๋ค (์ฝ๊ธฐ : ksDel
). ์ด๋ ๊ฒํ๋ฉด glibc๊ฐ ์ฆ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ OS์ ๋ฐํํฉ๋๋ค. ์ด๊ฒ์ ์ฌ๋ฌ๋ถ์ด๋ณด๊ณ ์๋ "์ด์ํ ํ๋"์ ๊ณ ์น ๊ฒ์
๋๋ค. ์ค, ์ฌ๋ฏธ์๊ฒ ์ฝ๊ณ glibc๋ฅผ ํํค ์น์ธ์ :-)
์ถ๊ฐ ํ ์คํธ / ์์ ์ ์ํด # 3183์ ๋ง๋ค์์ต๋๋ค.
ํ๋์ memleak์ ์ฐพ์์ต๋๋ค (kdbGet์์ ๋ฆฌํด ํค๊ฐ ํด์ ๋์ง ์์์ต๋๋ค).
๊ทธ๋ฌ๋ "ksClose๊ฐ 532 ๊ฐ์ ํค๋ฅผ ํด์ ํ์ง ์์"์ ์ฆ๊ฐ๋ ์๋ง๋ parentKey์ ์์ง ๋ ๊ฒฝ๊ณ ์ผ๋ฟ์ ๋๋ค. ์๋ฅผ ๋ค์ด 100 ๊ฐ์ฒ๋ผ NUM_RUNS ๊ฐ๋ฅผ ๋ ์ฌ๋ฆฌ๋ฉด ๊ฒฝ๊ณ ํ์๊ฐ 100 ๊ฐ๋ก ์ ํ๋์ด์์ด ์ด๋ ์์ ์์ ์ ์ฒด๋ฉ๋๋ค. "ksClose๋ 901 ๊ฐ์ ํค๋ฅผ ํด์ ํ์ง ์์์ต๋๋ค." ํธ๋ค ๋น parentKey๊ฐ ์์ผ๋ฉด์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
# 3183์ ์ํด ํ์