Libelektra: KeySet ๋‹ซ๊ธฐ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜

์— ๋งŒ๋“  2019๋…„ 11์›” 04์ผ  ยท  32์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: ElektraInitiative/libelektra

์ƒˆ๋กœ์šด elektrad๋ฅผ ๋ฒค์น˜๋งˆํ‚นํ•˜๋Š” ๋™์•ˆ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์ฆ์ƒ์„ ๊ฒฝํ—˜ํ–ˆ์Šต๋‹ˆ๋‹ค.
๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์€ ์ƒˆ ํ•ธ๋“ค์„ ๋งŒ๋“ค๊ณ  kdbGet() ํ˜ธ์ถœ ํ•œ ํ›„์— ์ฆ๊ฐ€ํ•˜์ง€๋งŒ ksClose() ๋ฐ kdbClose() ํ›„์—๋Š” ์ ˆ๋Œ€ ๊ฐ์†Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚ด ์ฒซ ๋ฒˆ์งธ ์˜์‹ฌ์€ mmap ์บ์‹ฑ์ด์—ˆ์Šต๋‹ˆ๋‹ค. mmaped ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ -DPLUGINS="ALL;-cache" ๋กœ ๋นŒ๋“œํ•˜์—ฌ ์บ์‹ฑ์„ ๋น„ํ™œ์„ฑํ™”ํ•ด๋„ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๋Š” ๋‹จ๊ณ„

์ด๋™> = 1.13

go-elektra repo์— ๋‘ ๊ฐœ์˜ ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค 100,000 ๊ฐœ์˜ ํ‚ค๊ฐ€์žˆ๋Š” ํ…Œ์ŠคํŠธ ํ‚ค ์„ธํŠธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

  1. TestKeySetMemory ๋ฃจํ”„์—์„œ ํ•ธ๋“ค๊ณผ kdbGets ํ‚ค ์„ธํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  1 ์ดˆ ๋™์•ˆ ๊ธฐ๋‹ค๋ฆฐ ํ›„-๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ํ‚ค ์„ธํŠธ + ํ•ธ๋“ค์„ ์ฆ‰์‹œ ๋‹ค์‹œ ๋‹ซ์Šต๋‹ˆ๋‹ค.
  2. 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 ํ›„์— ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.

์‹ค์ œ ๊ฒฐ๊ณผ

๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‹œ์Šคํ…œ ์ •๋ณด

  • Elektra ๋ฒ„์ „ : master
  • ์šด์˜ ์ฒด์ œ : Arch Linux
  • ์ตœ์‹  Go-elektra ๋ฒ„์ „
bug urgent work in progress

๋ชจ๋“  32 ๋Œ“๊ธ€

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 ์ด์ „์—๋„ ๋ฐœ์ƒ ํ–ˆ์Šต๋‹ˆ๊นŒ?

3142๊ฐ€ ์ด์ œ ๋ณ‘ํ•ฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. @ raphi011 ๋ฌธ์ œ๊ฐ€ ๊ณ„์† ๋ฐœ์ƒํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ถˆํ–‰ํžˆ๋„ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค

๋‚˜์—๊ฒŒ๋Š” ์ ์–ด๋„ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ / ์™„ํ™”ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด์ œ 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์— ์˜ํ•ด ํ์‡„

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰

๊ด€๋ จ ๋ฌธ์ œ

markus2330 picture markus2330  ยท  4์ฝ”๋ฉ˜ํŠธ

markus2330 picture markus2330  ยท  4์ฝ”๋ฉ˜ํŠธ

dmoisej picture dmoisej  ยท  3์ฝ”๋ฉ˜ํŠธ

sanssecours picture sanssecours  ยท  3์ฝ”๋ฉ˜ํŠธ

e1528532 picture e1528532  ยท  4์ฝ”๋ฉ˜ํŠธ