KEMBAR78
Apache kafka performance(latency)_benchmark_v0.3 | PDF
Apache Kafka e2e latency test
1
2020.12
freepsw
이벤트 발생시 얼마나 빠르게 데이터(1mb image)를 전달 할 수 있을까?
(REST API, Socket 통신보다 많이 느릴까?)
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
우리가 원하는 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
요구하는 환경을 위한 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
[백업] 사용한 라이브러리의 기본(default) 설정 값 비교
아래 설정 값을 조정하면서 테스트를 진행하였으나, 성능개선 효과가 크지 않았음.
(라이브러리 자체의 성능을 넘어서지 못하는 것인지, 다른 옵션을 더 봐야하는지 확인이 필요함)
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
[테스트 결과 - All] 특정 library를 제외하고는 0.5초 이내
Python-kafka 설정(producer/consumer)를 조정해 봤으나, latency가 줄지 않음.
Python-kafka의 성능이 너무 낮음
Seconds
8
[테스트 결과 – Top4] Socket/Rest가 역시 가장 빠르다.
Kakfa-confluent는 broker를 통해서 전달됨에도 성능이 나름 빠르게 나온다.
제일 처음 연결될 때 가장 latency가 높고,
이후 부터는 빠르게 줄어든다
Seconds
9
[테스트 결과 – Top4] 초기 연결을 제외한 평균 latency
첫번째 연결 시 latency를 제외하면, kafka-confluent 평균 latency가 조금 더 낮아짐
REST API 대비 2배 정도 느림
(0.003초 느림)
Seconds
10
Kafka library의 어느 구간에서 속도가 느리게 나올까?
Java E2E Latency
Producer latency
Consumer latency
Seconds
Kafka-confluent Latency
전체 기준으로 보면, producer의 latency를 줄이는 것이 중요하다.
(하지만, kafka-confluent의 성능을 개선하려면 consumer의 latency를 더 낮추기 위한 고민이 필요)
Producer 구간의 latency가 낮아지면서,
전체 latency가 개선됨
11
테스트 결과 정리
Kafka를 사용하는 것이 Socket/REST API 보다는 느리지만,
6ms 정도의 낮은 latency를 보장함
1mb 이상의 메세지 전송 낮은 latency 보장
[ 고려사항 ]
• 네트워크 대역폭 확보를 통한 대용량 메세지 전달 가능
한 환경 구성 필요
• Async 전송(Producer)을 위해서 socket buffer의 크기
증가 필요 (send_buffer_bytes)
• 너무 작으면 broker에 전달 되지 못하고 유실되는
현상
[ 고려사항 ]
• 너무 낮은 latency를 위한 설정은 전체 throughput이 감
소하는 현상 유발
• 비즈니스 목적에 따라 latency의 최대 허용 가능한 수준
을 정하고, 이에 맞는 설정이 필요
12
테스트에 사용한 코드들
https://github.com/freepsw/kafka-latency-test.git
13
END

Apache kafka performance(latency)_benchmark_v0.3

  • 1.
    Apache Kafka e2elatency 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 우리가 원하는 ApacheKafka의 역할은? 큰 용량의 이미지를 전달하면서, 가능한 빠르게(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의 최대 허용 가능한 수준 을 정하고, 이에 맞는 설정이 필요
  • 12.
  • 13.