Kafka가 빠른 이유

2024. 7. 25. 00:04기타

728x90

Sequential I/O

일반적으로 RAM은 랜덤 액세스를 지원히자만, 디스크는 데이터가 위치하는 블록을 찾는 시간과 찾은 데이터 블록을 메모리에 카피하는 시간 등의 오버헤드가 존재합니다. 데이터가 RAM에 이미 존재한다면 이 과정은 생략되지만, 그렇지 않다면 page fault가 발생하여 느리게 인식됩니다. 하지만 대용량의 데이터를 처리하는데 그 모든 데이터를 RAM에 올리는 것은 현실적으로 어려움이 많습니다.

Kafka는 디스크를 저장소로 사용하는 대신 Sequential I/O를 통해 탐색시간을 최소화합니다. Kafka의 데이터는 consumer가 읽어도 지워지지 않으며, 데이터는 맨 끝에 추가만 됩니다. 이로 인해 Kafka의 데이터는 디스크에 조각으로 나누어지지 않고 연속적인 블록에 저장됩니다. 이런 특성으로 Kafka는 원하는 데이터에 순차적으로 접근하게 되어 탐색시간이 최소화됩니다. 하지만 먄악 Kafka의 데이터가 위치하는 파일 시스템을 다른 어플리케이션이 함께 사용한다면 디스크 단편화가 발생할 수도 있습니다. 그래서 Kafka의 데이터를 가급적 독립된 파일시스템에 유지하는 것이 권장됩니다.

Zero-Copy

위의 그림은 일반적인 copy 기법으로 아래와 같은 절차를 가집니다.

  1. 디스크에서 read buffer
  2. read buffer에서 application buffer
  3. application buffer에서 socket buffer
  4. socket buffer에서 nic buffer

데이터를 네트워크를 통해 다른 장소로 보낼 때 하드웨어를 관리하는 운영체제, 커널영역과 데이터를 조작하는 사용자 어플리케이션 영역을 오고 가야 하지만 어플리케이션 영역이 커널영역에 접근할 수 없기 때문에 이런 데이터 복사 과정이 발생합니다.

Zero-Copy는 아래와 같은 개선을 통해 성능을 향상시켰습니다.

  1. 사용자의 가상 메모리 주소를 커널 메모리 주소에 매핑하여 application 영역으로의 불필요한 복사 방지
  2. read & write를 대체하는 새로운 시스템 호출인 sendFile을 이용하여 context-switching 절감
  3. DMA를 통해 디스크에서 커널 버퍼로 바로 데이터를 복사하고 socket buffer에는 파일 설명자를 추가하여 이를 토대로 커널 버퍼에서 네트워크 인터페이스로 패킷을 만들어 네트워크 전송을 수행하여 socket buffer에 불필요한 복사 방지

Topic Partitioning

같은 토픽이라도 데이터를 파티셔닝을 통해 나누고 각 파티션에는 독립된 스레드가 붙어 작업할 수 있도록 함으로써 하나의 토픽을 여러 스레드가 나누어 처리할 수 있도록 병렬성을 구현했습니다.

https://junuuu.tistory.com/786
https://ssnotebook.tistory.com/entry/Kafka-Kafka%EA%B0%80-%EB%B9%A0%EB%A5%B8-%EC%9D%B4%EC%9C%A0

728x90

'기타' 카테고리의 다른 글

Github Actions  (3) 2024.10.10
WEB 3.0  (0) 2023.12.24
3-Tier Architecture  (0) 2023.11.01
Ansible  (0) 2021.12.27
Vuex  (0) 2021.06.01