Zero-Copy란? 데이터 복사를 줄이는 최적화 기법

Zero-Copy의 정의

Zero-Copy(제로 카피)는 데이터를 전송하거나 처리할 때, 불필요한 메모리 복사 과정을 최소화하는 최적화 기법입니다. 일반적으로 파일을 읽어서 네트워크로 전송하는 작업을 생각해보면, 데이터는 디스크에서 커널 메모리로, 커널 메모리에서 다시 애플리케이션 메모리로, 그리고 다시 커널의 소켓 버퍼로 이동하는 여러 단계를 거칩니다. 이 과정에서 같은 데이터가 여러 번 복사되는데, Zero-Copy는 이런 중복 복사를 없애거나 줄여서 CPU 사용량과 메모리 대역폭 낭비를 크게 줄이는 것을 목표로 합니다.

비유하자면, 택배 상품을 창고에서 트럭으로 옮길 때 굳이 사무실 책상을 거쳐서 다시 옮기는 대신, 창고에서 트럭으로 바로 싣는 것과 같습니다. 중간 경유지를 없애면 그만큼 시간과 인력이 절약되는 것처럼, Zero-Copy도 데이터가 거쳐야 하는 ‘경유지’인 메모리 복사 단계를 줄여줍니다.

동작 원리와 예시

전통적인 파일 전송 방식은 다음과 같은 흐름을 가집니다.

  • 디스크 -> 커널 버퍼로 복사 (DMA)
  • 커널 버퍼 -> 애플리케이션 버퍼로 복사
  • 애플리케이션 버퍼 -> 커널 소켓 버퍼로 복사
  • 소켓 버퍼 -> 네트워크 카드로 복사 (DMA)

이 과정에서 애플리케이션이 데이터를 가공할 필요가 없다면, 커널과 애플리케이션 사이를 오가는 2번과 3번 단계는 사실상 불필요한 낭비입니다. 리눅스의 sendfile() 시스템 콜은 이런 낭비를 없애기 위해 만들어졌습니다. sendfile()을 사용하면 데이터가 커널 영역 안에서만 이동하고, 애플리케이션 메모리를 거치지 않고 바로 소켓 버퍼로 전달되거나, 최신 네트워크 카드에서는 DMA를 이용해 커널 버퍼조차 거치지 않고 바로 전송할 수도 있습니다.

자바에서는 FileChannel.transferTo() 메서드가 내부적으로 이런 Zero-Copy 방식을 활용합니다.

실무에서 왜 쓰는지

Zero-Copy는 대용량 파일을 자주 전송하는 서버, 예를 들어 정적 파일을 서빙하는 웹 서버나 메시지 브로커, 스트리밍 서버 등에서 핵심적인 성능 최적화 기법으로 사용됩니다. 대표적으로 Kafka는 프로듀서가 보낸 메시지를 디스크에 저장했다가 컨슈머에게 전달할 때 Zero-Copy를 적극 활용해서, CPU 사용률을 낮추고 처리량을 크게 높입니다. Nginx 역시 정적 파일 응답 시 sendfile 옵션을 활성화하면 동일한 효과를 얻을 수 있습니다.

결국 Zero-Copy는 데이터의 내용을 바꾸지 않고 단순히 위치만 옮기는 작업에서, 불필요한 메모리 복사와 컨텍스트 스위칭을 줄여 시스템 자원을 더 효율적으로 쓰기 위한 기법이라고 이해하면 됩니다.

댓글 남기기