https://colevelup.tistory.com/23
[Kafka] Kafka와 zero-copy
이전 카프카 도입 사례에서 Twitter가 내부에서 활용하는 In-House-Event-Bus에서 kafka로 전환하계 되는 이유들 중 하나가 kafka가 zero-copy를 제공한다라는 말이 있었습니다. zero-copy에 대해서 자세하게 알
colevelup.tistory.com
해당 블로그에 zero copy에 대해 잘 정리가 되어 있어 오늘은 해당 부분을 내 블로그에 옮겨 적어보며 공부해보고자 한다. 해당 글이 잘 이해되지 않는다면 위에 블로그가 정리가 깔끔하게 되어 있으니 들어 가서 다시 읽어 볼 것을 추천한다.
Kafka와 Zero-Copy
오늘날 스트리밍 데이터 플랫폼에서 Kafka를 쉽게 빼 놓고 얘기할 수는 없다. Kafka는 디스크 기반 저장으로 영속성을 보장하며, 쉽고 성능 역시 빠르다. 이렇게 Kafka가 빠르게 동작할 수 있는 이유들 중 하나인 Zero copy에 대해 알아보자
기존 버퍼링 방식
기존의 데이터 전송 방식은 데이터를 물리적 위치에서 찾은 다음 메모리로 이를(혹은 주소값만) 복사한다. 이후 네트워크 버퍼에 같은 데이터를 복사한 다음, 메모리에 있는 데이터는 복사가 완료 된 후 지우는 방식이다.
즉 buffer를 할당 받고 디스크에서 파일을 버퍼로 읽어 들여서 다시 소켓으로 전송한다. read와 send가 반복되는 형태.
Zero-Copy
Kafka의 읽기는 오프셋부터 순차적으로 수행되며 데이터는 disk buffer에서 network buffer로 zero copy 된다.
Zero copy는 별도의 복사본을 만들지 않고 한 위치에서 다른 위치로 데이터를 이동하는 데이터 전송 방식으로 메모리를 절약하고 성능을 향상 시킬 수 있다.
Kafka는 Java의 NIO 패키지의 transforTo()를 사용한다.
- transferTo() 메서드는 I/O) 파일 전송 요청 read()와 send()가 하나로 합쳐진 형태의 systemcall
- read() system call과 마찬가지로 DMA 엔진이 디스크에서 파일 읽어서 Read buffer로 복사
- 커널 모드에서 바로 socket buffer로 복사
- socket buffer에서 복사된 데이터를 nic buffer로 복사
- 데이터 전송 transferTo() 메서드에 리턴
이 과정으로 application buffer로 데이터들이 복사 되지 않기 때문에 복사본이 4군데에서 3군데로 줄어든다. 4개에서 3개 중 하나만 cpu 와 관련되어 있게 된다.
zero-copy 개선
Linux 2.4 버전 이후에는 NIC 장비가 “Gather Operation”을 지원할 경우 복사본을 더 줄일 수 있게 되었다.
- 사용자가 TransferTo() 메서드를 호출 : DMA 엔진이 디스크에서 파일을 읽어 커널에 위치한 Read buffer로 데이터를 복사
- 데이터는 socket buffer로 복사되지 않고, 데이터 저장 위치, 사이즈, 디스크립터가 socketbuffer로 추가된다. DMA엔진은 이 정보를 이용해 Read buffer에 있는 데이터를 NIC buffer에 바로 복사하고 네트워크로 데이터를 전송
Kafka는 이러한 OS의 페이지 캐시와 제로카피를 적극 활용해 디스크 저장 기반 시스템임에도, 빠른 성능을 자랑하고 있다. 그리고 Kafka의 영속성과 성능, 가용성은 Kafka가 더 발전할 수 있는 어플리케이션임을 보여주고 있다고 생각한다.
참고 자료
'CS 기초' 카테고리의 다른 글
Java 개념 정리 (0) | 2023.05.23 |
---|---|
[CS 기초] 03. 캐시 메모리(Cache Memory) (0) | 2022.12.01 |