선요약
- Kafka는 일반적인 copy 가 아니라 zero-copy를 사용해서 속도가 빠르다
- zero-copy는 데이터를 네트워크로 전송할때 생기는 Kernel-Application단에서 생기는 버퍼과정과 복사본 수를 줄이는 기법을 사용했다
- NIC버퍼가 Socket버퍼를 거치지않고, Read버퍼에 DMA(직접메모리접근)엔진으로부터 Read버퍼의 내용을 가지는 Descriptor를 가짐으로써 데이터를 읽게된다
- zero-copy 과정에서 생기는 버퍼복사는 단 2회
- Read(), Send() 등의 시스템 콜에 의해 바뀌는 context-switching(유저모드,커널모드) 에 대한 오버헤드를 줄이고, DMA엔진의 용량보다 데이터양이 더 클때 생기는 미리읽기 성능저하를 방지할수 있음
(기존 copy, 향상된 copy, zero-copy)
이 내용의 원본은 https://developer.ibm.com/articles/j-zerocopy/ 에서 볼수 있습니다.
데이터를 네트워크로 보내는 과정에서 일어나는 일
이 내용은 데이터를 네트워크를 통해 다른장소로 보낼때에 ‘하드웨어를 관리하는 운영체제. 커널영역’ 과 ‘데이터를 조작하는 사용자. 어플리케이션 영역’ 을 왔다갔다 해야합니다.
하지만 어플리케이션 영역은 커널영역에 접근할수 없으므로, 커널영역에서 어플리케이션 영역으로 데이터를 복사해주어야 한다.
DB에서부터 NIC(네트워크장비)버퍼 까지 가는 전체 과정을 알수 있습니다.
기존 COPY
기존의 전통적인 데이터 카피는 이런 형식으로 이루어져있습니다
위 사진에서 Application buffer는 데이터를 Read버퍼에서 받고, Socket버퍼로 전달해 줄뿐이지, 데이터를 가질 필요가 없습니다.
그러나, 시스템적인 원리상, ‘전달' 을 할때는 버퍼에 ‘복사본' 이 생긴다. 즉 2,3과정에서 쓸모없는 복사본이 생기는것.
U는 유저모드, K는 커널모드를 뜻함
위위사진에는 안나왔지만 DB→NIC버퍼 로 데이터가 전달되려면 시스템콜 read()와 Send()가 작동됨. 이때, U와 K를 바꾸는 context-switching 이 발생
어차피 DB→NIC버퍼로 보내는데 왜 굳이 Application단을 거치냐?
굳이 복사하면 Application단에서 복사를 2번이나 더하니까, Read버퍼 → Socket버퍼 로 바로 보내보자
좀더 간결해졌습니다. Application단에서 복사본을 2개를 가지지 않을수 있게됐고, 기존에 Application단에서 생기는 복사가 없는 대신 transferTO() 를 만들었습니다.
transferTo()는 Read()와 Send()가 합쳐진 시스템콜
Read()와 Send()를 따로따로하던 기존의 방식에서는 Contextswitching이 4번이나 일어났는데 두개를 합친 transferTo()시스템콜은 겨우 2번이면 된다
(굳이 따지자면 transferTO()가 실행되면, Read(), Send()가 순차적으로 진행된다)
과연 소켓버퍼도 필요할까?
응~ Read버퍼에서 바로 NIC버퍼로 보내버리면 그만이야 ~
사용자가 transferTo()를 호출하면, DMA엔진이 DB에서 Read버퍼로 데이터를 보내는것까지는 모두 동일하다
그러나 데이터가 소켓버퍼로 복사되지는 않고, 데이터가 저장된 위치, 데이터의 사이즈에 대한 정보가 저장되어있는 Descripter가 Socket버퍼에 추가된다.
즉, Socket버퍼는 버퍼의 역할에서, 데이터의 정보를 가지고있는 Descriptor로 바꾼것
결과
그냥 카피보다 성능 향상이 이루어졌다..!
아무래도 버퍼를 덜 거치고, 이때 생기는 병목현상이나, CPU리소스 소모량 자체를 줄여버리니까 성능이 향상된것이라고 생각한다.
그러나 사실 zero-copy는 생각보다 별게 아니라
예전에야 CPU성능도 엄청 적고, 램도 적으니까 이런거 하나하나 줄일려고 했던거지, 요즘같이 자원 빵빵한 시대에는 큰 의미가 없는것 같다.
특히나 zero-copy라는 개념이 2008년도 IBM에서 나온거라, '속도가 빨라진건 알겠는데, 22년도에도 먹힐까?' 가 걱정이었는데 아니나 다를까 netty io_uring 를 속도 증가 목적으로 쓴다고함. 이건 리눅스 커널단에서 IO퍼포먼스를 더 늘려주는것같음. 메이븐의 플러그인? 형태로 제공하는듯하다
참고자료
- https://developer.ibm.com/articles/j-zerocopy/
- https://m.blog.naver.com/kgw1988/221218267855
- https://soft.plusblog.co.kr/m/7
- https://m.blog.naver.com/kgw1988/221218267855
- https://blockdmask.tistory.com/69
'DATA Engineering > Kafka' 카테고리의 다른 글
섹션3. 카프카 클러스터 운영 (0) | 2022.07.20 |
---|---|
에러해결 kafka : Configured zookeeper. connect may be wrong. (0) | 2022.07.12 |
zero-copy 대신에 io_uring (1) | 2022.07.08 |
섹션 2. 카프카 기본 개념 설명 (0) | 2022.06.04 |
섹션 1. 아파치 카프카의 역사와 미래 (0) | 2022.06.02 |