Zero Copy
2026. 8. 24.
Zero Copy
Kafka 는 Zero Copy 를 통해 성능적 향상을 했다고들 흔히 말한다.
기존 Application 단에서 읽고 전송하는것과 뭔 차이가 있을까?
애플리케이션에서 파일 데이터를 읽어 네트워크로 전송
대부분의 경우 코드에서 사용하는 형태이다.
byte[] applicationBuffer = new byte[1024];
read(fileFd, applicationBuffer, len);
send(socketFd, applicationBuffer, len);- Buffer 를 할당 받고, 디스크에서 파일을 버퍼로 읽고 다시 소켓으로 전송하는 형태

read호출해 Disk 에 존재하는 파일을Read Buffer로 이동Application Buffer에Read Bufffer내용 복사후 함수 호출부에서 returnRead Buffer가 Kernel 주소 공간에 위치하므로, 사용자는 접근 불가능
send호출해Socket Buffer에Application Buffer내용 복사Socket Buffer에 있는 데이터를 실제 네트워크로 전송하기 위해NIC Buffer에 복사
- Buffer 에 동일한 데이터 복사하는 과정은 cpu 자원 소모
Kernel -> Application,Application -> Socket으로 보낼 떄 CPU 가 메모리 복사 수행
zero-copy
linux 2.2 sendfile()system call 을 사용한다.
#include <sys/sendfile.h>
ssize_t sendfile(int out_fd, int in_fd, off_t * offset ", size_t" " count" );- Java 에서 래핑
public void transferTo(long position, long count, WritableByteChannel target);
public abstract long transferFrom(ReadableByteChannel src, long position, long count);- transferTo :
FileChannel의 파일을 읽어target채널로 보낸다. - transferFrom :
src채널에서 데이터를 읽어FileChannel에 쓴다.
즉, transferTo 는 파일 전송 요청인 read - send 가 합쳐진 System Call 이다.
Kafka 는 transferTo 를 사용한다.
- Application Buffer 에 데이터를 복사하지 않는다.

- DMA 엔진이 디스크에서 파일을 읽어
Read Buffer로 복사 - Kernel 모드에서 바로
Socket Buffer로 복사 Socket Buffer에서 복사된 데이터NIC Buffer로 복사- 메소드 리턴
- 복사가 3번 발생한다.
zero-copy with Scatter-Gather DMA
READ -> Socket -> NIC 가 아니라, READ -> NIC 가 된다면??
좀 더 개선을 할 수 있다.

- DMA 엔진이 디스크에서 파일 읽어
Read Buffer로 복사 transferTo메소드 통해Socket Buffer에 descriptor 생성Read Buffer에서 NIC Buffer 의 데이터 복사 진행
그렇다고, Zero Copy 가 꼭 장점만 있는건 아니다.
단점
- 데이터 변환이 어려울 수 있다.
파일 데이터를 그대로 네트워크로 전달할 때 효과적이다.
중간에 데이터 읽고 변환해야 한다면, 사용자 공간 버퍼를 사용할 수 밖에 없다.
- SSL/TLS 와 맞지 않다.
TLS 는 평문 데이터를 암호문으로 바꾼다.
TLS : Transport Layer Security, 인터넷 주고받는 데이터를 안전하게 암호화하는 보안 프로토콜
데이터 내용을 읽어야만 바꿀수 있고, 그대로 넘기기 어려울 수 있다.
- 전송 도중 원본 파일이 변경되면 문제가 발생할 수 있다.
Kernel 이나 NIC 가 파일 영역을 읽고 있을수 있다.
-> 전송 중인 파일의 해당 영역을 수정하거나 삭제하면 문제가 생길수 있다.
Kafka 는 Append-Only, 전송 중 파일 영역을 수정하지 않게 설계되어 있다.
- 로깅 및 추적이 어렵다.
결국, 애플리케이션 레벨이 아닌 로우 레벨까지 내려감에 따른 trade-off 가 발생한다.