[Optimization] zero-copy
zero-copy๋ ๊ทน๋จ์ ์ธ ์ต์ ํ๊ฐ ํ์ํ ๋ ์ฌ์ฉ๋๋ ํ
ํฌ๋ ์ค ํ๋๋ค.
์ฝ๊ฒ ๋งํด์ ๋ณต์ฌ(copy) ํ์๋ฅผ ์ต์ํํ ์ฑ๋ก ์ต์ ํ๋ฅผ ํ๋ค๋ ๋ง์ด๋ค.
zero-copy๊ฐ ์ ์ฉ๋๋ ๋ฐฉ์์ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ง๋ง, ํต์์ ์ผ๋ก I/O ์ง์ฝ์ ์ธ ๋ถ๋ถ์์ I/O๊ฐ ์ฐ์์ ์ผ๋ก ์คํ๋ ๋ ๊ทธ ์ฌ์ด์ ๋ถํ์ํ ๋ณต์ฌ๋ฅผ ๋ฐฉ์งํ๋ ๊ฒ์ ์์ฃผ๋ก ํ๋ค.
์์ : ํ์ผ ์ฝ๊ณ ์ ์กํ๊ธฐ
๊ฐ๋จํ ์์ ๋ฅผ ๋ง๋ค๊ณ ํ๋์ฉ ๋ถ์ํด๋ณด์.
๊ทธ๋ฅ ๋ก์ปฌ์ ์๋ ํ์ผ ํ๋๋ฅผ ์ฝ์ด์ ๊ทธ๊ฑธ HTTP๋ TCP๋ ์ ์กํ๋ค๊ณ ์น์.
๋ณ๋ก ์ ๊ฒฝ์ฐ์ง ์๊ณ ํ๋ก๊ทธ๋จ์ ๊ตฌํํ๋ค๋ฉด ๋ณดํต ์ด๋ฐ ์์ผ๋ก I/O ์ฒด์ธ์ด ๋ฐ์ํ ๊ฒ์ด๋ค.
DMA๊ฐ ์ปค๋ ๋ฉ๋ชจ๋ฆฌ์ ํ์ผ ๋ด์ฉ์ ์ ์ฌํ๋ฉด, ๊ทธ๊ฑธ ๋ค์ ํ๋ก์ธ์ค ๋ฉ๋ชจ๋ฆฌ๋ก ๋ณต์ฌํ๋ค.
๊ทธ๋ฌ๋ฉด ํ๋ก๊ทธ๋จ์ ํ๋ก์ธ์ค ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ๋ ํ์ผ ๋ด์ฉ์ ์ฌ์ฉํ ์ ์๋ค. ๋ณ์์ ๋ก๋๋ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ฉด ๋ค์ ํ์ผ ๋ด์ฉ์ ์ ์กํด์ผ ํ๋๋ฐ, ๊ตฌํํ๊ธฐ์ ๋ฐ๋ผ์ 4๋ฒ์ฒ๋ผ ์ ์ก์ฉ ๋ฉ๋ชจ๋ฆฌ ๋ณต์ฌ๊ฐ ๋ฐ์ํ ์๋ ์๋ค.
๊ทธ ๋ค์์๋ ๋คํธ์ํฌ์ ์ ์กํ๊ธฐ ์ํด ํ์ผ ๋ด์ฉ์ ๋ค์ ์ปค๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌํ๊ณ , Network Interface๋ฅผ ํตํด ์ค์ ๋ฐ๊นฅ ์ธ์์ผ๋ก ๋๊ฐ๊ฒ ๋๋ค.
์ปค๋ ๋ฉ๋ชจ๋ฆฌ์ Disk/Network์ ์ํธ ํต์ ์ DMA์ ์ํด ์ด๋ฃจ์ด์ง๋ ๋ณต์ฌ๊ณ , ๋๋จธ์ง๋ ์ ๋ถ CPU์ ์ํ ๋ณต์ฌ๋ค.
A. ๋ถํ์ํ ์ฝ๋ ์์ค ๋ณต์ฌ ์ ๊ฑฐ
์ผ๋จ ๊ทธ๋ฅ ๋จ์ํ ์ฝ๋ ์์ค์์ ๋ถํ์ํ ๋ณต์ฌ๊ฐ ์๋์ง๋ถํฐ ๋ณด๋๊ฒ ์ค์ํ๋ค.
๋น์ฐํ ์ ๊ธฐ์ 4๋ฒ ๋ณต์ฌ๋ ์์จ ์ ์์ง ์๊ฒ ๋๊ฐ?
์ด๊ฑด ์ธ์ด๋ง๋ค ๋ค๋ฅผํ
์ง๋ง, ๋ฐฉ๋ฒ์ ๋ค ๋๋์์ดํ ๊ฒ์ด๋ค.
B. Direct Memory Access ์ ์ด
ํ๋ก์ธ์ค์์ I/O๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ปค๋๋ฉ๋ชจ๋ฆฌ>ํ๋ก์ธ์ค๋ฉ๋ชจ๋ฆฌ ์์ผ๋ก ์ ์ด๊ฐ ๋๋ค.
์ผ๋จ ์ด๋ค ๊ฒ์ด๋ ๊ฐ์ ์ปค๋๋ฉ๋ชจ๋ฆฌ๋ฅผ ํตํด write/read๊ฐ ๋ฐ์ํ๊ณ , ๊ทธ๊ฑธ ํ๋ก์ธ์ค ๋ฉ๋ชจ๋ฆฌ๋ผ๋ ๊ฒฉ๋ฆฌ๋ ์์ญ ์์ ๋งคํ์ํค๋ ๊ฒ์ด๋ค.
ํ์ง๋ง ์ด๊ฒ๋ ํน์ํ syscall๋ค์ ์ฌ์ฉํ๋ฉด ๋ถํ์ํ ๋ฉ๋ชจ๋ฆฌ ๋ณต์ฌ ์์ด ์ปค๋๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ค.
๊ทธ ๋ํ์ ์ธ ๋ฐฉ๋ฒ ์ค ํ๋๊ฐ memory map์ด๋ค.
https://blog.naver.com/sssang97/223479875946
์ด๊ฑธ ์ ์์ฉํ๋ค๋ฉด, ํ๋ก์ธ์ค ๋ฉ๋ชจ๋ฆฌ๋ก์ ๋ถํ์ํ ๋ณต์ฌ๋ฅผ ๋ง์ ์ ์๋ค. ๋ 2๋ฒ์ ๋ณต์ฌ๋ฅผ ์ค์ผ ์ ์๋ ๊ฒ์ด๋ค.
๋ค์ ์ด๋ ๊ฒ ์ ๋ฆฌ๊ฐ ๋๋ค.
์ด์ ๋ ์ด 3๋ฒ์ ๋ณต์ฌ๋ง์ผ๋ก ํ์ผ์ ์ฝ์ด์ ์ ์กํ ์ ์๊ฒ ๋์๋ค.
C. mode switching ๋น์ฉ ์ ์ฝํ๊ธฐ
์ผ๋ฐ์ ์ผ๋ก ๊ฐ๊ณผํ๊ธฐ ์ฌ์ด ๋ถ๋ถ ์ค ํ๋์ง๋ง, ์ฌ์ค ๋ณต์ฌ๋ฟ๋ง ์๋๋ผ ์์คํ ํธ์ถ(syscall) ๋ํ ๊ฝค ๋ฌด๊ฑฐ์ด ์์ ์ค์ ํ๋๋ค.
Linux์์ write๋ read ๊ฐ์ ์ปค๋ ๊ธฐ๋ฅ์ ํธ์ถํ๊ฒ ๋๋ฉด ํ๋ก๊ทธ๋จ์ ์ฌ์ฉ์ ๋ชจ๋์์ "์ปค๋ ๋ชจ๋"๋ก ์ ํํ๊ฒ ๋๋๋ฐ, ์ด๋ฌ๋ฉด ์ปค๋ ๋ชจ๋๋ก ์ปจํ
์คํธ๋ฅผ ์ ํํ๋ ๋์ค์ ๋ง์ ์ฑ๋ฅ ์์ค์ด ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด ์ปจํ
์คํธ ์ค์์นญ์ ๋ ์ง์คํฐ, ์คํํฌ์ธํฐ, ํ๋ก๊ทธ๋จ ์นด์ดํฐ์ ์ํ๋ฅผ ๊ฑด๋๋ฆฌ๊ณ , CPU ์บ์๋ ์๊ฐ์ ์ผ๋ก ๋ป๋ ์ ์๋ค. ๊ทธ๋์ ์์คํ
ํธ์ถ์ ์ต์ํํ ์ ์๋ค๋ฉด ์ต์ํํ๋๊ฒ ๋ฐ๋์งํ๋ค.
๊ทธ๋์ ์ฌ์ค ์์ ์ต์ ํ ์ฌ๋ก๋ ์ ๋ฏ์ด๋ณด๋ฉด

์ปจํ ์คํธ ์ค์์นญ์ด 4๋ฒ์ด๋ ์ผ์ด๋๋ ์ ์ด๋ค.
mmap์ผ๋ก ์ฝ์๋ ํ๋ฒ, ๋ค์ ๋์์ฌ๋ ํ๋ฒ, ๋คํธ์ํฌ ์ฐ๊ธฐ๋ชจ๋๋ก ์ ํํ ๋ ํ๋ฒ, ๋ค์ ๋์์ฌ๋ ํ๋ฒ.
๊ทธ๋ฌ๋ฉด ์ ๊ฑธ ํ๋ฒ์ ๋ชจ์์ ํ ์๋ ์๋๊ฑธ๊น?
์๋ค!
Linux๋ sendfile์ด๋ผ๋ syscall์ ์ง์ํ๋๋ฐ, ์ด๊ฒ ๋ฐ๋ก ํ์ผ์ ์ฝ์ด์ ๋คํธ์ํฌ๋ก ์๋๊ฒ๊น์ง๋ฅผ ํ๋๋ก ๋ญ์ณ๋์ ์์คํ ๋ช ๋ น์ด๋ค.
์ด๋ฌ๋ฉด ์ด์ mode switching์ด 2๋ฒ์ผ๋ก ์ค์ด๋ค์๋ค.
D. ์ปค๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ณต์ฌ๋น์ฉ ์ ์ฝํ๊ธฐ
๊ทผ๋ฐ ์ ๊ฑธ ๋ณด๋ค๋ณด๋ฉด ๋ ์๊ตฌ์ฌ์ด ๋ค ์ ์๋ค.
2๋ฒ์์ ๋ฐ์ํ๋ ๋น์ฉ์ ์ค์ผ ์ ์๋๊ฑธ๊น? ์ด์จ๋ ๋๋ค ์ค์ ๋ฉ๋ชจ๋ฆฌ์ธ๋ฐ ๋ง์ด๋ค.
์ด๊ฒ๋ ๋น์ฐํ ํ ์ ์๋ค!
DMA Gather๋ผ๋ ์ต์
์ sendfile๊ณผ ํจ๊ป ์ฌ์ฉํ๋ฉด ๋๋ค.
๊ทธ๋ฌ๋ฉด DMA๊ฐ ๋์คํฌ์์ ํ์ผ์ ์ฝ์๋, ๊ทธ๊ฑฐ๋ฅผ Socket ์ ์ก์ ์ํ ์ปค๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ๋ก ์ ์ฌํ๊ณ ์ ์ก๊น์ง ํด์ค ์ ์๋ค.
์ด๋ฌ๋ฉด ์ต์ข ์ ์ผ๋ก 2๋ฒ์ mode switching, ํ๋ฒ์ copy๋ง์ผ๋ก ํ์ผ->๋คํธ์ํฌ ์ ์ก์ ๋ฌ์ฑํ ์ ์๋ค.
์์ฉ ์ฌ๋ก
Kafka๋ zero copy ๋ฐฉ๋ฒ๋ก ์ ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉํ ๊ธฐ๋ฐ์์คํ
์ค ํ๋๋ค.
์์์ ์ธ๊ธํ๋ sendfile๊ณผ DMA gather ๊ธฐ๋ฅ์ ์์ฉํด์ ๋น ๋ฅด๊ณ ๋ถํ๊ฐ ์ ์ ์ ์ก ๊ตฌ์กฐ๋ฅผ ๊ตฌํํ๋ค.
๊ทธ ์ธ์๋ Cassandra Streaming, Ceph, Apache Arrow ๊ฐ์ ๋ง์ ์์คํ ๋ค์ด ์ด๋ฅผ ํตํ ์ต์ ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
์ฐธ์กฐ
https://www.reddit.com/r/rust/comments/18cian3/i_dont_understand_zero_copy/
https://medium.com/@kaixin667689/zero-copy-principle-and-implementation-9a5220a62ffd
https://stackoverflow.com/questions/1860253/what-is-the-overhead-involved-in-a-mode-switch