[DB] WAL Write ์„ฑ๋Šฅ ์‹คํ—˜

WAL ๊ตฌ์กฐ๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•ด๋ณด๋ฉด์„œ ์„ฑ๋Šฅ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๊ฐ€ ์–ด๋А ์ •๋„์ธ์ง€ ๋Œ€์ถฉ ๋ฒค์น˜๋งˆํฌ ๋Œ๋ ค๋ณธ๊ฑธ ์ •๋ฆฌํ•œ ๊ธ€์ด๋‹ค.
์–ธ์–ด๋Š” Rust๋‹ค.




๋””์Šคํฌ sync ์‹œ์ : fsync vs fdatasync

https://blog.naver.com/sssang97/224039042217

fsync. ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ๋””์Šคํฌ ์™„์ „ ๋™๊ธฐํ™”๋Š” ์„ฑ๋Šฅ์— ์–ผ๋งˆ๋‚˜ ํฐ ์˜ํ–ฅ์„ ๋ผ์น ๊นŒ?

์ผ๋‹จ์€ write๋งˆ๋‹ค fsync๋ฅผ ๋‚ ๋ ค๋ดค๋‹ค. ๋ฐ์ดํ„ฐ์…‹์€ 10000๋งŒ๊ฐœ.

ํ™•์‹คํžˆ ๋А๋ฆฌ๊ธด ํ–ˆ๋‹ค. ์ดˆ๋‹น 300๊ฐœ ์–ธ์ €๋ฆฌ๋ฐ–์— ๋„ฃ์ง€ ๋ชปํ–ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด datasync๋Š” ์–ด๋–จ๊นŒ? fsync๊ฐ€ ๋ชจ๋“  ๋ฐ์ดํ„ฐ์™€ ํŒŒ์ผ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ชจ๋‘๋ฅผ ๋””์Šคํฌ์— flushํ•˜๋Š” api๋ผ๋ฉด, datasync๋Š” ํŒŒ์ผ ๋ฐ์ดํ„ฐ๋งŒ flushํ•˜๋Š” API๋‹ค.
๊ทธ๋ž˜์„œ PostgreSQL์˜ ๊ฒฝ์šฐ์—๋„ WAL write์‹œ์— datasync๋งŒ์„ ํ•˜๋Š” ๊ฒƒ์ด ๊ธฐ๋ณธ ์˜ต์…˜์ด๋‹ค.

๊ทผ๋ฐ ์‚ฌ์‹ค, ๋ณ„ ์ฐจ์ด๋Š” ์—†๋”๋ผ. ์ฐจ์ด๊ฐ€ ์žˆ๋”๋ผ๋„ ๋ˆˆ์— ๋„์ง€ ์•Š๋Š” ์ˆ˜์ค€์ธ ๊ฒƒ ๊ฐ™๋‹ค.

๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€, ์•„์˜ˆ ๊ทธ๋ƒฅ fsync๋ฅผ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค.
์ด๋Ÿฌ๋ฉด OS๊ฐ€ ํ•˜๊ณ  ์‹ถ์„๋•Œ๋งŒ disk์— flush๋˜๊ณ , ๋ฐ์ดํ„ฐ ๋‚ด๊ตฌ์„ฑ์€ ์†์‹ค๋  ํ…Œ์ง€๋งŒ ์„ฑ๋Šฅ์€ ํฌ๊ฒŒ ํ–ฅ์ƒ๋  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿผ ํ™•์‹คํžˆ ๋นจ๋ผ์ง€๊ธด ํ•œ๋‹ค. ์ดˆ๋‹น 13000๊ฑด์ด๋‚˜ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค.

CassanrdaDB์˜ ๊ฒฝ์šฐ์—๋Š” write๋งˆ๋‹ค fsync๋ฅผ ํ•˜์ง€ ์•Š๊ณ , 10์ดˆ๋งˆ๋‹ค fsync๋ฅผ ๋ชฐ์•„์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์„ ์ทจํ•œ๋‹ค.

10์ดˆ๋งˆ๋‹ค ํ•˜๋‚˜, ์•„์˜ˆ ์•ˆํ•˜๋‚˜ ๋ณ„ ์ฐจ์ด๋Š” ์—†๋”๋ผ. ์ด ๋ฐฉ๋ฒ•์ด ์ตœ์ ํ™”ํ•˜๊ธฐ ๊ฐ€์žฅ ํŽธํ•œ ๋ฐฉ๋ฒ•์ธ ๊ฒƒ ๊ฐ™๊ธด ํ•˜๋‹ค.
๊ทธ๋ž˜์„œ ๋‚œ ์ด background fsync๋กœ ์„ ํƒํ–ˆ๋‹ค.




์••์ถ• ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํƒ

๋Œ€๋ถ€๋ถ„์˜ ์ฃผ์š” DB๋“ค์€ ์ง์ ‘ ์ปค์Šคํ…€ํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ ์••์ถ• ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค.
๋‚œ ๊ตณ์ด ๊ทธ๋ ‡๊ฒŒ๊นŒ์ง€ ํ•˜๊ณ  ์‹ถ์ง„ ์•Š์•„์„œ, ๊ธฐ์กด ๊ตฌํ˜„์ฒด๋งŒ ๊ฐ€์ ธ๋‹ค๊ฐ€ ๋ญ๊ฐ€ ๋‚ซ๋‚˜ ๋น„๊ตํ•ด๋ดค๋‹ค.

๋ฐ์ดํ„ฐ๋Š” 10๋งŒ๊ฐœ ์ •๋„, ํ‚ค๋Š” uuid, ๊ฐ’์€ ์ ๋‹นํ•œ ํฌ๊ธฐ์˜ ๋ฌธ์ž์—ด

JSON์˜ ๊ฒฝ์šฐ์—๋Š”

์‚ฌ์‹ค payload ํฌ๊ธฐ๊ฐ€ ์—„์ฒญ ํฐ๊ฑด ์•„๋‹ˆ๋ผ์„œ, 10๋งŒ๊ฐœ์”ฉ ๋„ฃ์–ด๋„ ํฌ๊ธฐ๊ฐ€ ๋ณ„๋กœ ํฌ์ง„ ์•Š๋‹ค. ๋А๋ฆฌ์ง€๋„ ์•Š๊ณ 

protobuf๋„ ์จ๋ดค๋‹ค. ๊ตฌํ˜„์ฒด๋Š” rust-protobuf 3.7๋‹ค.
๊ณต์‹ ๊ตฌํ˜„์ฒด๋Š” ์•„๋‹ˆ๋ผ์„œ ์‹ ๋ขฐ์„ฑ์ด ๋†’์ง€ ์•Š๊ธด ํ•œ๋ฐ

์ ๋‹นํžˆ ์ด๋ ‡๊ฒŒ ๋‚˜์™”๋‹ค. ์‚ฌ์‹ค ์‹คํ–‰ ์„ฑ๋Šฅ์—๋Š” ๋ณ„ ์ฐจ์ด๊ฐ€ ์—†์—ˆ๋‹ค.
์–ด์ฐจํ”ผ ํŒŒ์ผ I/O๊ฐ€ ๋Œ€๋ถ€๋ถ„์˜ ๋ณ‘๋ชฉ์ด๋ผ์„œ์ธ ๊ฒƒ ๊ฐ™๋‹ค.

FlatBuffer๋„ ์จ๋ดค๋‹ค. ๊ตฌํ˜„์ฒด๋Š” ๊ณต์‹ ๊ตฌํ˜„์ฒด์ธ flatbuffer-rs๋‹ค.

์ด๊ฒƒ๋„ ๋ณ„ ์ฐจ์ด๋Š” ์—†์—ˆ๋‹ค. ์••์ถ•๋ฅ ์ด ์•„์ฃผ ์ข‹์€๊ฑด ์•„๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ํ…Œ์ŠคํŠธํ•ด๋ณธ๊ฑด bincode๋‹ค. ํ‘œ์ค€ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ฐ™์€๊ฑด ์•„๋‹ˆ๊ณ ,
Rust์—๋งŒ ๊ตฌํ˜„์ฒด๊ฐ€ ์žˆ๋‹ค. ๊ฐ€์žฅ ์ž˜ ๊ตฌํ˜„๋œ ํŽธ์ด๋ผ๊ณ  ํ•ด์„œ ์จ๋ดค๋‹ค.

์ €์žฅ๊ณต๊ฐ„ ํšจ์œจ์„ฑ์€ protobuf์™€ ๋Œ€๋“ฑํ•˜๊ณ , max latency๊ฐ€ ์ข€ ๋” ๋‚˜์•˜๋‹ค. ์˜๋ฏธ์žˆ๋Š” ์ˆ˜์ค€์€ ์•„๋‹ˆ์ง€๋งŒ.
๊ทธ๋ž˜๋„ ๊ฐœ์ค‘์—๋Š” ์„ฑ๋Šฅ/์‚ฌ์šฉ์„ฑ ์ธก๋ฉด์—์„œ๋Š” ์ œ์ผ ๋‚˜์€๊ฑฐ๊ฐ™์•„์„œ bincode๋กœ ๊ฐ”๋‹ค.




file write ์‹œ์Šคํ…œ์ฝœ ์ค„์ด๊ธฐ

์‚ฌ์‹ค ํ˜„์‹ค์ ์ธ ๋ณ‘๋ชฉ์€ write ์ž์ฒด๊ฐ€ ๋งŽ๋‹ค๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํฌ๋‹ค.
์•„๋ฌด๋ฆฌ ๋‹ค๋ฅธ๊ฑธ ์ตœ์ ํ™”ํ•ด๋„ OS์— write๋ฅผ ๋‚ ๋ฆฌ๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ํ—ค๋น„ํ•œ ์ž‘์—…์ด๋ผ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค.

์ผ๋‹จ write ์ž์ฒด๋ฅผ ์ค„์—ฌ๋ณด์ž.

๊ธฐ์กด์—๋Š” ์ข€ ๋ฌด์‹ํ•˜๊ฒŒ write๋ฅผ ์ฒ˜๋ฆฌํ–ˆ์—ˆ๋‹ค. ํฌ๊ธฐ ํ—ค๋”๊ฐ€ ์žˆ๊ณ , ๋ณธ๋ฌธ์ด ์žˆ๋Š”๋ฐ, ์ €๊ฑธ ๋”ฐ๋กœ ๋‚ ๋ ธ๋‹ค.

์ €๊ฑธ ๊ทธ๋ƒฅ ์ฝ”๋“œ์—์„œ ํ•ฉ์ณ์„œ ๋ณด๋‚ด๊ธฐ๋งŒ ํ•ด๋„ write ํ˜ธ์ถœ์ด ํ•œ๋ฒˆ ์ค„์–ด๋“ ๋‹ค.
๊ทธ๋ ‡๊ฒŒ ๋Œ๋ ค๋ณด๋ฉด

์œ ์˜๋ฏธํ•œ ์„ฑ๋Šฅ ํ–ฅ์ƒ์ด ๋ณด์ธ๋‹ค.

๋ญ”๊ฐ€ ๋” ์ค„์ผ ์ˆ˜๋Š” ์—†์„๊นŒ?
์ง€๊ธˆ ์ƒํƒœ์—์„œ๋Š” append๋‹น 2๋ฒˆ์˜ write ํ˜ธ์ถœ์ด ์žˆ๋‹ค.

save_state๋Š”, ํ˜„์žฌ ์„ธ๊ทธ๋จผํŠธ ํŒŒ์ผ์˜ ์ •๋ณด์™€ ์ตœ์‹  record_id์˜ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ์ƒํƒœ ํŒŒ์ผ์ด๋‹ค.
์ƒํƒœ ๊ด€๋ฆฌ์šฉ ํŒŒ์ผ์ด ๋”ฐ๋กœ ์žˆ๋Š”๊ฒŒ ๋Œ€์ถฉ ์งœ๊ธฐ ํŽธํ•ด์„œ ๋’€๋Š”๋ฐ, ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ด๋Ÿฐ ๊ฒƒ๋„ ์ตœ์‹  ํŒŒ์ผ์„ ๋๊นŒ์ง€ ์ฝ์œผ๋ฉด ๋‹ค ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๋‹ค.
์‹คํ–‰ ์ค‘์—๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ๋งŒ ์ˆ˜์ •ํ•˜๊ณ , ์žฌ์‹œ์ž‘ํ• ๋•Œ๋Š” ์„ธ๊ทธ๋จผํŠธ ํŒŒ์ผ์„ ์ฝ์–ด์„œ recoverํ•˜๋Š” ์‹์œผ๋กœ ํ•ด๋ณด์ž.

๊ทธ๋Ÿฌ๋ฉด

๋ˆˆ์— ๋Œ ์ •๋„๋กœ ์ตœ์ ํ™”๊ฐ€ ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.




์„ธ๊ทธ๋จผํŠธ ํŒŒ์ผ ํฌ๊ธฐ

๊ทธ๋Ÿฌ๋ฉด ์„ธ๊ทธ๋จผํŠธ์˜ ํŒŒ์ผ ํฌ๊ธฐ๋Š” ์„ฑ๋Šฅ์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น ๊นŒ?
์ผ๋‹จ ๋‚ด ๊ฒฝ์šฐ์—๋Š” PostgreSQL์˜ ๊ฒฝ์šฐ๋ฅผ ๋”ฐ๋ผ์„œ 16MB๋กœ ๋งž์ถฐ๋†“์€ ์ƒํƒœ์˜€๋‹ค.

์ด๊ฑด ์™„๋ฒฝํ•œ ์ •๋‹ต์ด๋ผ๊ณ ๋Š” ํ•  ์ˆ˜ ์—†๋Š”๋ฐ, OS ํŽ˜์ด์ง€ ์บ์‹œ ๋‹จ์œ„์™€ ๋ฐ€์ ‘ํ•œ ์—ฐ๊ด€์ด ์žˆ๋‹ค.
๊ทธ๋ž˜์„œ ์ด๊ฑด DB๋งˆ๋‹ค ์กฐ๊ธˆ์”ฉ ๋‹ค๋ฅด๋‹ค.

CassandraDB์˜ ๊ฒฝ์šฐ์—๋Š” ์„ธ๊ทธ๋จผํŠธ ํฌ๊ธฐ๊ฐ€ 32MB๊ธธ๋ž˜, ๋™์ผํ•˜๊ฒŒ ๋งž์ถฐ๋ดค๋‹ค.

๊ทธ๋žฌ๋”๋‹ˆ ๊ทผ์†Œํ•œ ํ–ฅ์ƒ์ด ์žˆ์—ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๊ณ  ๋” ๋Š˜๋ฆฌ๋ฉด ์˜คํžˆ๋ ค ๋А๋ ค์กŒ๋‹ค.

๋‚ด ์žฅ๋น„์˜ ๊ฒฝ์šฐ์—๋Š” 32MB ์ •๋„๊ฐ€ ๋”ฑ ์ ๋‹นํ•œ๊ฐ€๋ณด๋‹ค.

๊ทธ๋ž˜์„œ ๊ทธ๋ƒฅ 32MB๋กœ ์ •ํ–ˆ๋‹ค.




๋ฒ„ํผ๋ง

Vector ํ• ๋‹น์„ ์ข€ ์ค„์—ฌ๋ณผ๊นŒ ํ–ˆ๋‹ค. ๊ธฐ์กด์—๋Š” ๋งค append ํ˜ธ์ถœ๋งˆ๋‹ค ๋ฒ„ํผ๋ฅผ ์ดˆ๊ธฐํ™”ํ–ˆ๋Š”๋ฐ

๊ทธ๋ƒฅ ๊ธ€๋กœ๋ฒŒ ๋ฒ„ํผ ํ•˜๋‚˜ ๋‘๊ณ ์„œ

๊ณ„์† ๋Œ๋ ค์“ฐ๋ฉด์„œ ๋„ฃ๊ฒŒ ํ–ˆ๋‹ค.


๋ญ”๊ฐ€ ๋นจ๋ผ์ง„ ๋А๋‚Œ์ด ๋“ค๊ธด ํ•˜๋Š”๋ฐ, ์˜ค์ฐจ๊ฐ€ ์ข€ ์žˆ์–ด์„œ ํฌ๊ฒŒ ๋นจ๋ผ์กŒ๋‹ค๋Š” ํ™•์‹ ์€ ๋“ค์ง€ ์•Š์•˜๋‹ค.




Allocator?

๋‚˜๋ฆ„ ๋‚ด๋ถ€ ํ• ๋‹น์ด ๊ฝค ์žˆ์„๋งŒํ•œ ์ฝ”๋“œ๋‹ˆ๊นŒ, allocator๋ฅผ ์ปค์Šคํ…€ํ•˜๋ฉด ์ข€ ๋นจ๋ผ์ง€์ง€ ์•Š์„๊นŒ ๊ธฐ๋Œ€๋ฅผ ํ–ˆ๋‹ค.
๊ทธ๋ž˜์„œ jemalloc์„ ๋ถ™์—ฌ๋ดค๋Š”๋ฐ

์ด๊ฒƒ๋„ ์‚ฌ์‹ค ๋ณ„ ์ฐจ์ด๋Š” ์—†์—ˆ๋‹ค.




์ปดํŒŒ์ผ๋Ÿฌ ์ตœ์ ํ™” ์˜ต์…˜

Rust๋Š” ์ถ”๊ฐ€์ ์ธ ์ตœ์ ํ™” ์˜ต์…˜์„ ๋ช‡๊ฐ€์ง€ ์ œ๊ณตํ•˜๋Š” ํŽธ์ด๋‹ค.
https://blog.naver.com/sssang97/223216318146

์ด ์ค‘์—์„œ lto, strip, native ์ปดํŒŒ์ผ ์˜ต์…˜์„ ์ค˜๋ดค๋‹ค.

codegen unit ์กฐ์ •์€ ์ปดํŒŒ์ผ์ด ๋„ˆ๋ฌด ๋А๋ ค์ง€๋Š”๋ฐ ๋ฐ˜ํ•ด ํšจ๊ณผ๋„ ์ž˜ ์•ˆ๋ณด์—ฌ์„œ ๋บ๋‹ค.


๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ๊ฝค ๋นจ๋ผ์ง€๊ธด ํ•˜๋”๋ผ. TPS๊ฐ€ 53000-54000 ์ •๋„๊นŒ์ง€ ์˜ฌ๋ž๋‹ค.

PGO๋„ ๋Œ๋ ค๋ดค๋‹ค.

์ด๊ฒƒ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์œ ์˜๋ฏธํ•œ ํ–ฅ์ƒ์€ ์—†์—ˆ๋‹ค.




Memory Map (mmap)

์™œ์ด๋ฆฌ ๋А๋ฆด๊นŒ ํ•ด์„œ CassadraDB ์ฝ”๋“œ๋ฅผ ๋œฏ์–ด๋ณด๋‹ค๋ณด๋‹ˆ๊นŒ, ๊ธฐ๋ณธ ์„ค์ •์ด mmap์„ ์“ฐ๋Š” ๊ฑฐ๋ผ๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ๊ฒŒ ๋๋‹ค.
๊ทธ๋ž˜์„œ file write๋ฅผ ์“ฐ์ง€ ์•Š๊ณ  mmap ๊ธฐ๋ฐ˜์œผ๋กœ ์“ฐ๊ธฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๋ฐ”๊ฟจ๋‹ค.

๊ทธ๋žฌ๋”๋‹ˆ

์ƒ๋‹นํžˆ, ๋งค์šฐ ๋นจ๋ผ์กŒ๋‹ค.
๋” ์ตœ์ ํ™”ํ•  ์—ฌ์ง€๊ฐ€ ์žˆ๊ธด ํ•  ๊ฒƒ ๊ฐ™๊ธด ํ•œ๋ฐ, ์ด ์ •๋„๋งŒ ํ•ด๋„ ์ถฉ๋ถ„ํžˆ ๋น ๋ฅด๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.




Zero Copy

๊ทธ๋ž˜๋„ ์—ฌ์ „ํžˆ ์ตœ์ ํ™”์˜ ์—ฌ์ง€๋Š” ๋‚จ์•„์žˆ์—ˆ๋‹ค.
์œ„ ๋ฒ„์ „์—์„œ๋Š” mmap์„ ํ†ตํ•ด ๊ฐœ์„ ์ด ๋˜๊ธด ํ–ˆ๋Š”๋ฐ, ์ธ์ฝ”๋”ฉ๋œ ๊ฐ’์„ buffer์— ๋‘” ๋‹ค์Œ์— ๊ทธ๊ฑธ ๋‹ค์‹œ mmap์— ๋„ฃ๋Š” ๋ฐฉ์‹์„ ์ทจํ–ˆ๋‹ค. ์ด๊ฒƒ๋„ ์‚ฌ์‹ค ๋ถˆํ•„์š”ํ•œ ๋ณต์‚ฌ๋‚˜ ๋‹ค๋ฆ„์—†๋‹ค.

๊ทธ๋ž˜์„œ mmap์— ์ธ์ฝ”๋”ฉ๋œ ๊ฐ’์„ ๋ฐ”๋กœ writeํ•˜๋„๋ก ์ˆ˜์ •ํ–ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‹ˆ ๋“œ๋””์–ด 70000 tps์˜ ๋ฒฝ์„ ๋„˜์—ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋งŒ์กฑํ•˜๊ณ  ์‹คํ—˜์€ ๋งˆ๋ฌด๋ฆฌํ–ˆ๋‹ค. ์ด ์ด์ƒ์€ ํ•˜๋“œ์›จ์–ด ํ•œ๊ณ„์— ๊ฐ€๊นŒ์šด ๊ฒƒ ๊ฐ™๋‹ค.



์„œ๋ฒ„ ์ฝ”๋“œ
https://github.com/myyrakle/barus

๋ฒค์น˜๋งˆํฌ ์ฝ”๋“œ
https://github.com/myyrakle/benchmarks/tree/master/database_write_performance