[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