ํฐ์คํ ๋ฆฌ ๋ทฐ
์ฝ๋๋ ๋ฒจ์์ ํ์ผ ์ ์ก ๋ฑ local storage(e.g. disk)์์ ํ์ผ์ ์ฝ์ด์ ์ธ๋ถ๋ก ๋ณด๋ด๋ ๋ก์ง์ ๊ตฌ์ฑํ๋ค๋ฉด ์ด๋ค ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋ ๊น์?
๋ณดํต ํฌ๊ฒ๋ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๋๊ฒ ๋ฉ๋๋ค.
1. OS kernel context์์ local storage์ ์๋ ํ์ผ์ ์ฝ์ด Read Buffer์ ๋ด๊ณ
2. Application context์์ ํ์ผ ๋ฐ์ดํฐ๋ฅผ Application Buffer์ ์ฌ๋ฆฌ๊ณ ๋ค์ kernel context์ Socket Buffer๋ก ์ ๋ฌ
3. NIC Buffer๋ฅผ ํตํด ์ธ๋ถ๋ก ์ ์ก
์ฌ๊ธฐ์ Buffer ๊ฐ ์ฐ๊ฒฐ์ ์ฃผ๋ชฉํด๋ณผ๊น์?
์์ ํฌ์ปค์คํ ๋ถ๋ถ์ ์ดํด๋ณด๋ฉด Application Buffer์ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ ๋ ๋ณต์ ํ๋ ๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
๊ทผ๋ฐ ์ด ๋ถ๋ถ ๋ญ๋น๊ฐ์๋ฐ ์ข ํจ์จํํด๋ณผ ์ ์์๊น? ๋ผ๋ ๊ด์ ์์ ๋ฐ์ ๋ ๊ฒ ๋ฐ๋ก Zero Copy ์
๋๋ค.
Zero Copy์ ๋ํด ๋ณธ๊ฒฉ์ ์ผ๋ก ์์๋ณด๊ธฐ ์ ์ DMA copy์ CPU copy์ ์ฐจ์ด์ ๋ํด์ ์งง๊ฒ ์์๋ณด๊ฒ ์ต๋๋ค.
DMA(Direct Memory Access) copy vs CPU copy
DMA(Direct Memory Access)๋ CPU์ ๊ฐ์ ์์ด ์ฃผ๋ณ์ฅ์น์ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ด์ ์ง์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ์ ์๊ฒ ํด์ฃผ๋ ์ปดํจํฐ ์์คํ ์ ๊ธฐ๋ฅ์ ๋งํฉ๋๋ค.
์ฌ๊ธฐ์ DMA์ ์ฃผ์ ํน์ง์ CPU๋ฅผ ๊ฑฐ์น์ง ์๋๋ค๋ ์ ์
๋๋ค.
์ด๋ DMA๊ฐ ๋์ํ๋ ๋์ CPU๋ ๋ค๋ฅธ ์์
์ ๋ณํํ ์ ์์์ ์๋ฏธํ๋๋ฐ, DMA๋ฅผ ์ฌ์ฉํ๋ฉด CPU์ ๋ถ๋ด์ ์ฃผ์ง ์๊ณ ์์คํ
๋ฉ๋ชจ๋ฆฌ์ ์ง์ ์ ๊ทผํ๋ฉด์ ๋ฐ์ดํฐ ์ ์ก์ ํจ์จ์ฑ์ ๋์ด๊ฒ ๋ฉ๋๋ค.
๋ฐ๋ฉด์ CPU copy๋ CPU๋ฅผ ์ ์ ํด์ผ ํ๋ฏ๋ก ์ฌ๊ธฐ์ ์ค๋ ์ฐจ์ด์ ์ ์๊ฐํด๋ณผ ์ ์์ ๊ฒ๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก DMA๋ ํนํ ์ฒ๋ฆฌ๋์ด ๋ง์ ํ๋ ์ปดํจํฐ ์์คํ
์์ ๊ฝค ์ค์ํ ์ญํ ์ ํ๊ณ ๋ฐ์ดํฐ ์ง์ฝ์ ์ธ ์์
๊ณผ ์
์ถ๋ ฅ์ด ๋ง์ ์์คํ
์์๋ ๋์ฑ๋ ์ค์ํ๋ค๋ ๊ฑธ ์ดํดํด๋ณผ ์ ์์ต๋๋ค.
์ ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก Zero Copy์ ๋ํด์ ์์๋ณผ๊น์?
Zero Copy
Zero Copy๋ ๋ง ๊ทธ๋๋ก application buffer๋ก copyํ ํ์ ์์ด kernel context์์ ๋ฐ๋ก Socket Buffer์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
Zero Copy๋ฅผ ์ ์ฉํ๋ฉด ํฌ๊ฒ๋ ์๋์ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๋๊ฒ ๋ฉ๋๋ค.
์๋ ๋ค์ด์ด๊ทธ๋จ์์ application context์ buffer๋ฅผ ์ฌ์ฉํ์ง ์๊ณ kernel context์์๋ง ๋ฐ์ดํฐ๊ฐ ์ด๋ํ๋ ๊ฑธ ํ์ธํด๋ณด์ธ์.
(transferTo()๋ ๋จ์ํ ํํ์ ์ํด Java methed name๋ฅผ ๊ธฐ๋กํ์ต๋๋ค)
Context Switch์ Zero Copy
์์์ ์ดํด๋ณธ ๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด ์์ฐ์ค๋ฝ๊ฒ ๋ฆฌ์์ค ์ธก๋ฉด์์ ์ด์ ์ด ์์ ๊ฑฐ๋ผ๋ ์์ธก์ด ๊ฐ๋ฅํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฐ ๊ตฌ์กฐ๋ OS์ ์ปจํ
์คํธ ์ค์์นญ ๊ณผ์ ์์๋ ์ด์ ์ ๊ฐ์ ธ์ต๋๋ค.
์ ํต์ ์ธ ๋ฐฉ์์ ํ์ผ ์ ์ก์์๋ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ก ์ปจํ ์คํธ ์ค์์นญ์ด ์ผ์ด๋ฉ๋๋ค.
์ ๋ค์ด์ด๊ทธ๋จ์์ user mode์ kenel mode๋ฅผ ์ค๊ฐ๋ ์ค์์นญ ํ์๋ฅผ ์ฃผ๋ชฉํด๋ณด๋ฉด,
์ด 4๋ฒ์ ์ปจํ
์คํธ ์ค์์นญ์ด ๋ฐ์ํ๋ ๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด Zero Copy์ ๊ฒฝ์ฐ๋ ์ด๋จ๊น์?
์ ๋ค์ด์ด๊ทธ๋จ์ ๋ณด๋ฉด Kernel mode์์ ๋ฐ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ธฐ ๋๋ฌธ์ ์ปจํ
์คํธ ์ค์์นญ์ด 2๋ฒ๋ง ์ผ์ด๋๋ ๊ฑธ ๋ณผ ์ ์์ต๋๋ค.
์ด๋ ๋ฏ Zero Copy๋ฅผ ์ฌ์ฉํ๋ฉด ์ปจํ
์คํธ ์ค์์นญ์ด ์ค์ด๋ค๋ฉด์ ์์คํ
์๋ ํฅ์์ ํจ๊ณผ๋ ๊ฐ์ ธ๊ฐ ์ ์์ต๋๋ค.
Zero Copy์ ๋จ์
Zero Copy๋ ์ฑ๋ฅ์ ์ด์ ์ ๊ฐ์ ธ์ค๋ ๊ฑด ๋ถ๋ช ํ์ง๋ฉด ํน์ ์๊ตฌ์ฌํญ์์๋ง ์ ํจํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ์ค๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์์ ํด์ผ ํ๋ ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ์ ๊ฒฝ์ฐ๋ ์ด๋จ๊น์?
๋ฐ์ดํฐ ์์ ์ ์ํด application memory์ ๋ฐ์ดํฐ๋ฅผ ์ฎ๊ฒจ์ผํ๋ฏ๋ก application context์ buffer๋ก copy๊ฐ ํ์ํฉ๋๋ค.
ํ์ง๋ง zero copy๋ kernel context์ buffer์์๋ง ๋ฐ์ดํฐ๋ฅผ ์ฎ๊ธฐ๋ฏ๋ก ๋ฐ์ดํฐ ์์ ์ด ๋ถ๊ฐ๋ฅํ ๋จ์ ์ด ์์ต๋๋ค.
์ด๋ ์ํธํ, ์์ถ ๋ฑ์ ๋ก์ง์ ์ํํ ์ ์๋ค๋ ๊ฑธ ์๋ฏธํฉ๋๋ค.
๋ํ, ์์ ๋ฐ์ดํฐ์ ๋ํด์๋ ์คํ๋ ค ์ค๋ฒํค๋๊ฐ ์๊ธธ ์ ์๊ณ ๋นํจ์จ์ ์ผ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ NIC(Network Interface Card)๋ฑ ํ๋์จ์ด ์ง์์ ํฌ๊ฒ ์์กดํฉ๋๋ค.
์๋ฅผ ๋ค์ด NIC๊ฐ ์ฒดํฌ์ฌ ์์ฑ์ ์ง์ํ์ง ์๋ ๊ฒฝ์ฐ ์ปค๋์ด ๋ฐ์ดํฐ๋ฅผ ์ง์ ์ฒ๋ฆฌํด์ผ ํด์ ์ ๋ก ์นดํผ์ ์ด์ ์ด ์ฌ๋ผ์ง ์ ์์ต๋๋ค.
(*์ฒดํฌ์ฌ: ๋ฐ์ดํฐ์ ๋ฌด๊ฒฐ์ฑ์ ๋ณดํธํ๊ณ ์ค๋ฅ๋ฅผ ๊ฒ์ถํ๊ธฐ ์ํ ๋ฐฉ๋ฒ)
Zero Copy์ ํ์ฉ ์ฌ๋ก
Zero Copy๋ ์ฃผ๋ก ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ณ ๋น ๋ฅด๊ฒ ๋ค๋ฃจ๊ธฐ ์ํ ๊ณ ๋ฏผ๋ค์ ํ๋ ๋ฐ์ดํฐ ์์ง๋์ด๋ง ๋ถ์ผ์์ ์ฃผ๋ก ํ์ฉ๋ฉ๋๋ค.
๋ํ์ ์ผ๋ก kafka์์๋ zero copy๋ฅผ ํ์ฉํด ๋ฉ์์ง ์ ์ก์ ํจ์จํํฉ๋๋ค.
Kotlin S3 upload์ zero copy ์ ์ฉํ๊ธฐ?
์ฌ์ค ํ ์์ ์์ AWS Java/Kotlin SDK๋ zero copy๋ฅผ ์ง์ํ์ง ์์ต๋๋ค.
Java/Kotlin์์ zero copy๋ฅผ ํ์ฉํ๊ธฐ ์ํด์๋ java.nio.channels ํจํค์ง๋ฅผ ํ์ฉํด์ผ ํ๋๋ฐ, AWS Java/Kotlin SDK์์๋ ์์ง ํด๋น ํจํค์ง๋ฅผ ์ง์ํ์ง ์๋ ๊ฑธ๋ก ๋ณด์
๋๋ค.
๊ด๋ จ ๋ด์ฉ์ด ์ข ๋ ๊ถ๊ธํ์ ๋ถ๋ค์ https://github.com/aws/aws-sdk-java-v2/issues/3928 ๋ฅผ ์ฐธ๊ณ ํด ๋ณด์๋ ๊ฑธ ์ถ์ฒํฉ๋๋ค.
๋์ AWS Java/Kotlin SDK๋ ๋ฉํฐํํธ ์ ๋ก๋๋ฅผ ์ง์ํด์ ๋๋ฆ์ ์ต์ ํ๊ฐ ๋์ด์๋ค๊ณ ํ๋ ๋ฏฟ๊ณ ์ฌ์ฉํด๋ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค :)
๋ง๋ฌด๋ฆฌํ๋ฉฐ
์ฌ๊ธฐ๊น์ง zero copy์ ๋ํด์ ์์๋ดค์ต๋๋ค.
์ ๋ ์ฃผ๋ก ์๋ฒ ๊ฐ๋ฐ์ ํ๊ณ ์์ง๋ง ์ต๊ทผ์ ๋ฐ์ดํฐ ์์ง๋์ด๋ง, AI ๋ถ์ผ๋ฅผ ๊ณต๋ถํ๋ฉด์ ์ฌ๋ฌ ์ธ์ฌ์ดํธ๋ฅผ ์ป๊ณ ์์ต๋๋ค.
์ด ๊ณผ์ ์์ ์ ๊ธฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋๋ ๊ฒ๋ค์ด ๋ณด์ด๊ณ ์ข ๋ ์ข์ ์ํํธ์จ์ด๋ฅผ ์ค๊ณํ๊ธฐ ์ํ ๊ด์ ๋ค์ ์ตํ๊ฐ๋ ๊ฒ ๊ฐ์์.
์ฌ๋ฌ๋ถ๋ค๋ ๋ด๊ฐ ์ ๋ชจ๋ฅด๋ ๋ถ์ผ๋ ์์๋ณด๋ฉด์ ์ธ์์ ๋ณด๋ ๊ด์ ์ ํ๋ถํ๊ฒ ๋ง๋ค์ด๋ณด์๋ ๊ฑด ์ด๋จ๊น์?
์ง๊ธ๊น์ง ๊ธด ๊ธ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค :)
Reference
'BackEnd' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ฐ๋ฆฌ ์๋ฒ์ OOMKilled ์ฅ์ ๊ฐ ๋ฐ์ํ์ด์ - ํ๊ณ ํธ (0) | 2024.11.10 |
---|---|
MySQL ์คํ ๊ณํ ํบ์๋ณด๊ธฐ (1) | 2024.04.28 |
ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค(isolation level)์ด๋? (0) | 2024.03.03 |
AWS Elastic Beanstalk ๋จ์ผ ์ธ์คํด์ค ๋ฌด์ค๋จ ๋ฐฐํฌํ๊ธฐ (0) | 2023.10.08 |
์์ฆ ๋ ์ค๋ฅด๋ gRPC ํบ์๋ณด๊ธฐ (2) | 2022.12.04 |
- Total
- Today
- Yesterday
- mysql ์คํ ๊ณํ
- Aws Reinvent 2023
- ๊น์ด/๋๋น ์ฐ์ ํ์(DFS/BFS)
- mysql
- ์ข์ ์์ง๋์ด
- ํ(Heap)
- 2๋ ์ฐจ ์๋ฒ ๊ฐ๋ฐ์
- rate limit
- 2023 ํ๊ณ
- ์ถ์ ์ง๋
- ์ข์ ๊ฐ๋ฐ์ ๋๊ธฐ
- Go
- ๋ฑ ํฌ์๋ฌ๋ ๊ฐ๋ฐ์
- ์ข์ ์ฝ๋๋ ๋ฌด์์ธ๊ฐ?
- Golang
- kotlin s3 upload
- golang oomkilled
- ํด์
- grpc client
- ์๊ณ ๋ฆฌ์ฆ
- HTTP
- AWS re:Invent 2023
- ํ๋ก๊ทธ๋๋จธ์ค
- 2023 ๊ฐ๋ฐ์ ํ๊ณ
- ์ข์ ๊ฐ๋ฐ์
- ์ฅ์ ํ๊ณ
- ์คํ/ํ
- ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค
- ๋ฐฑ์ค
- ์ฝ๋ฉํ ์คํธ
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |