[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