๊ณ ์„ฑ๋Šฅ ์ž„๋ฒ ๋””๋“œ DBMS libmdbx 0.10.4, libfpta 0.3.9 ์ถœ์‹œ

libmdbx 0.10.4(MDBX) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ณ ์„ฑ๋Šฅ ์ปดํŒฉํŠธ ์ž„๋ฒ ๋””๋“œ ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌํ˜„๊ณผ ํ•จ๊ป˜ ์ถœ์‹œ๋˜์—ˆ์œผ๋ฉฐ, ๋ณด์กฐ ๋ฐ ๋ณตํ•ฉ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ํ‘œ ํ˜•์‹ ํ‘œํ˜„์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ด€๋ จ libfpta 0.3.9(FPTA) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. MDBX ์œ„์—. ๋‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ชจ๋‘ OSI ์Šน์ธ ๋ผ์ด์„ผ์Šค์— ๋”ฐ๋ผ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ์˜ ๋ชจ๋“  ์šด์˜ ์ฒด์ œ์™€ ์•„ํ‚คํ…์ฒ˜๋Š” ๋ฌผ๋ก  Russian Elbrus 2000๋„ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

์—ญ์‚ฌ์ ์œผ๋กœ libmdbx๋Š” LMDB DBMS๋ฅผ ์‹ฌ์ธต์ ์œผ๋กœ ์žฌ์ž‘์—…ํ•œ ๊ฒƒ์ด๋ฉฐ ์•ˆ์ •์„ฑ, ๊ธฐ๋Šฅ ์„ธํŠธ ๋ฐ ์„ฑ๋Šฅ ๋ฉด์—์„œ ์ด์ „ ๋ฒ„์ „๋ณด๋‹ค ์šฐ์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. LMDB์™€ ๋น„๊ตํ•˜์—ฌ libmdbx๋Š” ์ฝ”๋“œ ํ’ˆ์งˆ, API ์•ˆ์ •์„ฑ, ํ…Œ์ŠคํŠธ ๋ฐ ์ž๋™ํ™”๋œ ๊ฒ€์‚ฌ์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋ณต๊ตฌ ๊ธฐ๋Šฅ๊ณผ ํ•จ๊ป˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

๊ธฐ์ˆ  ์ธก๋ฉด์—์„œ libmdbx๋Š” ACID, ๊ฐ•๋ ฅํ•œ ๋ณ€๊ฒฝ ์ง๋ ฌํ™” ๋ฐ CPU ์ฝ”์–ด ์ „์ฒด์— ๊ฑธ์ณ ์„ ํ˜• ํ™•์žฅ์„ ํ†ตํ•œ ๋น„์ฐจ๋‹จ ์ฝ๊ธฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ž๋™ ์••์ถ•, ์ž๋™ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํฌ๊ธฐ ๊ด€๋ฆฌ, ๋ฒ”์œ„ ์ฟผ๋ฆฌ ์ถ”์ •์ด ์ง€์›๋ฉ๋‹ˆ๋‹ค. 2016๋…„๋ถ€ํ„ฐ ํ”„๋กœ์ ํŠธ๋Š” Positive Technologies์˜ ์ž๊ธˆ ์ง€์›์„ ๋ฐ›์•˜์œผ๋ฉฐ 2017๋…„๋ถ€ํ„ฐ ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๊ฐ€ ํ•ด๋‹น ์ œํ’ˆ์— ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

libmdbx๋Š” C++ API๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋งค๋‹ˆ์•„๊ฐ€ ์ง€์›ํ•˜๋Š” Rust, Haskell, Python, NodeJS, Ruby, Go ๋ฐ Nim์šฉ ์–ธ์–ด ๋ฐ”์ธ๋”ฉ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. libfpta์˜ ๊ฒฝ์šฐ API ์„ค๋ช…๋งŒ C/C++ ํ—ค๋” ํŒŒ์ผ ํ˜•์‹์œผ๋กœ ๊ณต๊ฐœ์ ์œผ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

9์›” XNUMX์ผ ์ด์ „ ๋‰ด์Šค ์ดํ›„ ์ถ”๊ฐ€๋œ ์ฃผ์š” ํ˜์‹ , ๊ฐœ์„  ๋ฐ ์ˆ˜์ • ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ๋นŒ๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ๋งค์šฐ ๋“œ๋ฌผ๊ฒŒ ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹ ์ค‘์— ๋ฃจํ”„/์ •์ง€๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” Positive Tecnologies ์ „๋ฌธ๊ฐ€๋“ค์ด ์ž์ฒด ์ œํ’ˆ์„ ๋‚ด๋ถ€์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋™์•ˆ ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ํŽ˜์ด์ง€ ํŠธ๋ฆฌ์˜ ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋น„๋™ํ˜• ์ƒํƒœ์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ด๋ถ€์˜ GC ์ฝ˜ํ…์ธ ๋ฅผ ํ™•์ธํ•˜๋„๋ก ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐœ์„ ๋˜๊ณ  ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ํ™•์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • C++ API์—์„œ๋Š” ์ถ”๊ฐ€ "noException"์ด ์ˆ˜์ •๋˜์—ˆ๊ณ  "cursor::erase()" ๋ฉ”์„œ๋“œ์— ์ถ”๊ฐ€ ์˜ค๋ฒ„๋กœ๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์œผ๋ฉฐ ๋ฒ„ํผ ๊ตฌํ˜„์—์„œ ์ •๋ ฌ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด "std::string" ์‚ฌ์šฉ์ด ์ƒ๋žต๋˜์—ˆ์Šต๋‹ˆ๋‹ค. (CLANG libstdc++์™€ ๊ด€๋ จ๋จ)
  • ๋Œ€๊ทœ๋ชจ ํŠธ๋žœ์žญ์…˜์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ๋“œ๋ฌผ๊ฒŒ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์˜ค๋ฅ˜ MDBX_PROBLEM์œผ๋กœ ๋‚˜ํƒ€๋‚˜๋Š” ๋”ํ‹ฐ ํŽ˜์ด์ง€ ์œ ์ถœ ์•Œ๊ณ ๋ฆฌ์ฆ˜(๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŽ˜์ด์ง€์˜ ์„ ํƒ์  ๋ฐฐ์ถœ)์˜ ํšŒ๊ท€๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์˜๋„์ ์ธ ์†์ƒ์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๊ฒ€์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋‹จ๊ณ„์  ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์†Œํ•œ ๊ฒฝ๊ณ  UndefineBehaviorSanitizer ๋ฐ Coverity Scan ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ด์ „ ๋ฒ„์ „์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ƒ์„ฑ๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€ ๋‚ด์˜ ์ค‘์ฒฉ ํŽ˜์ด์ง€์—์„œ ์˜ค๋ž˜๋˜์–ด ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋‚ด๋ถ€ ํ”Œ๋ž˜๊ทธ "P_DIRTY"๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • CMake ์Šคํฌ๋ฆฝํŠธ์—์„œ LTO(๋งํฌ ํƒ€์ž„ ์ตœ์ ํ™”)์— ํ•„์š”ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ ๊ตฌ์„ฑ ์š”์†Œ ๊ฒ€์ƒ‰์ด ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ตœ๋Œ€ ๋™์‹œ ๋…์ž ์ˆ˜๊ฐ€ 32767๋ช…์œผ๋กœ ๋Š˜์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค.
  • Valgrind ๋ฐ AddressSanitizer ์‚ฌ์šฉ ์‹œ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • Windows์—์„œ๋Š” MDBX_NOTLS ๋ชจ๋“œ(์Šค๋ ˆ๋“œ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ)์—์„œ ์ž‘์—…ํ•  ๋•Œ SRW ์ž ๊ธˆ์˜ ์žฌ๊ท€ ์‚ฌ์šฉ์ด ์ œ๊ฑฐ๋˜์—ˆ์œผ๋ฉฐ, ์‹œ์Šคํ…œ ์‹œ๊ฐ„์ด ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ bootid ์ƒ์„ฑ์ด ์ˆ˜์ •๋˜์—ˆ์œผ๋ฉฐ, WSL1 ๋ฐ WSL2 ๊ฐ์ง€๊ฐ€ ๊ฐœ์„ ๋˜์—ˆ์œผ๋ฉฐ, DrvFS๋ฅผ ํ†ตํ•ด ๋งˆ์šดํŠธ๋œ Plan 9์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ด๊ธฐ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ „์ฒด์ ์œผ๋กœ 160๊ฐœ ํŒŒ์ผ์— 57๊ฐœ ์ด์ƒ์˜ ๋ณ€๊ฒฝ์ด ์ด๋ฃจ์–ด์กŒ์œผ๋ฉฐ ~5000์ค„์ด ์ถ”๊ฐ€๋˜์—ˆ๊ณ  ~2500์ค„์ด ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํŠนํžˆ ๊ทนํ•œ ์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค ํ…Œ์ŠคํŠธ์— ๋„์›€์„ ์ค€ Erigon ํ”„๋กœ์ ํŠธ ํŒ€(Ethereum ์ƒํƒœ๊ณ„)์— ๊ฐ์‚ฌ์˜ ๋ง์”€์„ ์ „ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. libmdbx v0.10.0์ด ์ถœ์‹œ๋œ ์ดํ›„ 1๊ฐœ์›” ๋™์•ˆ ๊ฐ Erigon ์„ค์น˜์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณผ๋ฅจ์ด 2-7TB(์ด๋”๋ฆฌ์›€ ๋…ธ๋“œ์˜ XNUMX%์—์„œ ์‚ฌ์šฉ๋จ)์ธ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์†์ƒ์— ๋Œ€ํ•œ ๋ณด๊ณ ๊ฐ€ XNUMX๊ฑด๋งŒ ์ ‘์ˆ˜๋˜์—ˆ๋‹ค๋Š” ์ ์€ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹Œ ์™ธ๋ถ€ ์ด์œ ๋กœ ์ธํ•ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ ์›์ธ์€ RAM ์˜ค๋ฅ˜์˜€๊ณ , ์„ธ ๋ฒˆ์งธ๋Š” BTRFS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํ† ๋ฆฌ์ง€ ํ•˜์œ„ ์‹œ์Šคํ…œ์˜ ํŠน์ • ๊ตฌ์„ฑ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์žฌ์„ค์ •ํ•˜๋Š” ๋™์•ˆ ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜์˜€์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€