Apache Kafka를 이용하여 이미지 데이터를 얼마나 빠르게(with low latency) 전달 가능한지 성능 테스트.
최종 목적은 AI(ML/DL) 모델의 입력으로 대량의 실시간 영상/이미지 데이터를 전달하는 메세지 큐로 사용하기 위하여, Drone/제조공정 등의 장비에서 전송된 이미지를 얼마나 빨리 AI Model로 전달 할 수 있는지 확인하기 위함.
그래서 Kafka에서 이미지를 전송하는 간단한 테스트를 진행하였고,
이 과정에서 latency를 얼마나 줄여주는지를 확인해 보았다.(HTTP 프로토콜/Socket과 비교하여)
[현재 까지 결론]
- Apache Kafka는 대량의 요청 처리를 위한 throughtput에 최적화 된 솔루션임.
- 현재는 producer의 몇가지 옵션만 조정하여 테스트한 결과이므로,
- 잠정적인 결과이지만, kafka의 latency를 향상을 위해서는 많은 시도가 필요할 것 같음.
- 즉, 단일 요청의 latency는 확실히 느리지만,
- 대량의 처리를 기준으로 평균 latency를 비교하면 평균적인 latency는 많이 낮아짐.
Test Code : https://github.com/freepsw/kafka-latency-test
1. Apache Kafka e2e latency test
1
2020.12
freepsw
이벤트 발생시 얼마나 빠르게 데이터(1mb image)를 전달 할 수 있을까?
(REST API, Socket 통신보다 많이 느릴까?)
2. 2
Kafka Latency Test 목표
AI(ML, DL)모델 서버에 실시간으로 영상/이미지(Drone, CCTV 등)을 빠르게 전달하는 용도로
Apache Kafka를 적용하는 것이 latency 측면에서 적절한지 검토
https://www.confluent.io/blog/optimizing-apache-kafka-deployment/
이번 테스트에서는 2가지 목표를 달성하기 위한 환경을 구성한다.
Latency 최소화에 집중 !
이미지 데이터 전송
(message size 1.3MB)
3. 3
우리가 원하는 Apache Kafka의 역할은?
큰 용량의 이미지를 전달하면서, 가능한 빠르게(Low Latency) 전달
큰 용량의 이미지를 전달하려면? 빠르게(low latency) 전달하려면?
• Producer/Broker/Topic/Consumer가 한번에 많은 데이터 처리
• 하나의 message size가 큼 (1MB 이상)
• Socket Send/Receive Buffer 조정 à 많은 양을 더 빨리 전달
• Socket buffer가 부족하면,
• Kernel에서 데이터 전달을 지연시키거나,
• TCP에서 MTU(최대 전달 사이즈)를 줄여서, 전송이 늦어짐
• Producer : 기다림 없이 빨리 Broker로 전달
• Consumer : Broker에 저장된 즉시 데이터 수신
Send/Receive buffer size 최대화 Latency 최소화
4. 4
요구하는 환경을 위한 Apache Kafka 설정은?
Latency는 producer/broker/consumer 전 과정에 영향
큰 사이즈의 이미지 전송을 위한 설정 Latency 최소화를 위한 설정
• Producer
• max.request.size=15000000(15Mb, 1개 메세지 최대 크기)
• send_buffer_bytes : 소켓 버퍼를 늘려서 NW 지연 방지
• Broker
• max.message.bytes=15000000
• Topic (Topic별 설정 필요함)
• max.message.bytes=15000000
• Consumer
• max.partition.fetch.bytes= 15000000
• Producer
• Linger.ms : 0 (기다리지 않고 가능한 빨리 전송)
• Consumer
• fetch.max.wait.ms : 0
• Broker에 데이터가 도착하면,
• 바로 consumer의 fetch request로 응답
5. 5
[백업] 사용한 라이브러리의 기본(default) 설정 값 비교
아래 설정 값을 조정하면서 테스트를 진행하였으나, 성능개선 효과가 크지 않았음.
(라이브러리 자체의 성능을 넘어서지 못하는 것인지, 다른 옵션을 더 봐야하는지 확인이 필요함)
6. 6
테스트 환경을 구성하자
Kafka의 최소 단위(partition 1개) 성능을 측정하기 위해 1대의 broker로 구성
• Socket/REST 방식이 중간에 거치는 과정이 없음
• Kafka의 경우 broker를 통해 2번의 통신 과정이 발생(latency 지연)
• Hardware
• GCP(asia-northeast3-a) : CentOS 7
• CPU : 8 cpus
• MEM : 32 GB
• DISK : pd-standard type (50G)
• hostname : kafka-test
• Software
• Apache Kafka (2.13-2.7.0)
• Python Library : kafka-python(v2.0.2), confluent-kafka(v1.5.0)
• Scala Library : kakfka client lib (org.apache.kafka.clients.*)
• JDK : 1.8.0
• Kafka
• Partition : 1
• Replica : 1
• Topic name : latency-test
• 총 20회의 메세지 전달
• Message Size : 1.3 mb (jpg)
테스트 환경 테스트 스펙
Kafka Cluster
Broker 1
Producer
Python-kafka
Python-confluent
Java-kafka
Consumer
Python-kafka
Python-confluent
Java-kafka
REST Client REST Server
Socket Client Socket Server
End to End Latency
7. 7
[테스트 결과 - All] 특정 library를 제외하고는 0.5초 이내
Python-kafka 설정(producer/consumer)를 조정해 봤으나, latency가 줄지 않음.
Python-kafka의 성능이 너무 낮음
Seconds
8. 8
[테스트 결과 – Top4] Socket/Rest가 역시 가장 빠르다.
Kakfa-confluent는 broker를 통해서 전달됨에도 성능이 나름 빠르게 나온다.
제일 처음 연결될 때 가장 latency가 높고,
이후 부터는 빠르게 줄어든다
Seconds
9. 9
[테스트 결과 – Top4] 초기 연결을 제외한 평균 latency
첫번째 연결 시 latency를 제외하면, kafka-confluent 평균 latency가 조금 더 낮아짐
REST API 대비 2배 정도 느림
(0.003초 느림)
Seconds
10. 10
Kafka library의 어느 구간에서 속도가 느리게 나올까?
Java E2E Latency
Producer latency
Consumer latency
Seconds
Kafka-confluent Latency
전체 기준으로 보면, producer의 latency를 줄이는 것이 중요하다.
(하지만, kafka-confluent의 성능을 개선하려면 consumer의 latency를 더 낮추기 위한 고민이 필요)
Producer 구간의 latency가 낮아지면서,
전체 latency가 개선됨
11. 11
테스트 결과 정리
Kafka를 사용하는 것이 Socket/REST API 보다는 느리지만,
6ms 정도의 낮은 latency를 보장함
1mb 이상의 메세지 전송 낮은 latency 보장
[ 고려사항 ]
• 네트워크 대역폭 확보를 통한 대용량 메세지 전달 가능
한 환경 구성 필요
• Async 전송(Producer)을 위해서 socket buffer의 크기
증가 필요 (send_buffer_bytes)
• 너무 작으면 broker에 전달 되지 못하고 유실되는
현상
[ 고려사항 ]
• 너무 낮은 latency를 위한 설정은 전체 throughput이 감
소하는 현상 유발
• 비즈니스 목적에 따라 latency의 최대 허용 가능한 수준
을 정하고, 이에 맞는 설정이 필요