Kafka

Performance Management

재심 2023. 4. 16. 10:58

목차

    [Client]

    Producer

    • compression.type: lz4, zstd, gzip 등 제공. 헤더에 압축관련 정보를 함께 실어 전송하게 됨.

    Latency 최소화를 위한 Default Value

    • batch.size: 16KB
    • linger.ms: 0
    • buffer size: 32MB

     

    Throughput을 늘리고 싶을 때 고려할 만한 옵션

    • batch.size: 1000KB
    • linger.ms: 100
    • buffer size: batch size * partition수 보다 크게 설정

     

    Client 성능지표

     

    • io-wait-ratio: 이 값이 높다면 브로커에 문제가 있다고 판단
    • io-ratio: io가 많이 발생한다는 뜻
    • Producer: 메시지를 보내는 시간이 길다. -> batch size를 늘리거나 압축 사용
    • Consumer: max.partition.fetch.szie를 늘리거나 컨슈머 그룹에 추가 컨슈머를 투입한다. (파티션 확장도 같이)
    • 클라이언트 처리시간: 실제 브로커에서는 제대로 처리하기 때문에 클라이언트 수정이 필요.
    • Producer/Consumer의 내부로직이 너무 오래걸리지 않는지 확인

    [Broker]

     

    • Producer: Producer Request, Produce
    • Consumer: Fetch Request, Fetch Consumer
    • Replica: FetchRequest, FetchFollower

     

    카프카는 기본적으로 큰 메시지를 처리하기 위한 목적이 아니다.

     

    • message.max.bytes: 1MB. 최대 권고 20MB이며 8MB 미만을 최대한 권고한다고 한다.
    • max.partiton.fetch.size: 1MB
    • request queue: 기본값 500개이며 가득차기 시작하면 I/O Thread 증가 필요
    • request handler idle time rate: 0.4 이상 유지 필요. 0.4 미만이면 너무 바쁘다는 뜻이므로 브로커를 늘리거나 파티션 재배치 필요
    • network processor idle time rate: 0.4 이상 유지 필요. 0.4 미만이면 너무 바쁘다는 뜻이므로 브로커를 늘리거나 파티션 재배치 필요

    • request local time
      • i/o thread에서 page cache에 저장하는데 걸리는 시간
      • 느려지면 해당 브로커의 메모리가 부족하다는 뜻
      • page cache가 모자라서 데이터 flush 후 (쓸 자리를 확보) 하기 때문에 오래걸리는 것이다.
      • 메모리와 디스크 체크 필요
    • response remote time
      • 팔로워를 기다리는 시간
      • Purgatory 영역에서 follower가 Replica를 끝낼때 까지 기다리는 시간
      • 이 시간이 높으면 다른 브로커들이 바쁘거나 브로커간 latency가 느리다는 뜻
    • response queue time
      • purgatory, response queue, network thread까지의 영역
      • 이 수치가 높으면 네트워크 스레드가 모자르다는 뜻
    • response send time
      • 실제로 보내는 시간.
      • 클라이언트와 브로커간 통신 상태 확인

    • message.max.bytes: 1MB 권고. 8MB미만이 권고값. 최대 20MB. 카프카는 대형 메시지 처리에 적합하지 않다.
    • max.partition.fetch.bytes: 1MB
    • num.network.threads: Network Thread Count
    • queued.max.request: queue의 개수
    • log.flush: page cache를 임의로 flush 하고 싶을 때 사용. 메시지 수 or 시간 단위로 설정가능. 기본적으로는 OS가 알아서 처리함
    • num.io.threads: I/O Thread Count
    • replica.fetch.wait.max / replica.fetch.min.bytes: replica를 가져오는 사이즈 설정
    • num.replica.fetchers.count: Replica Fetch Thread Count
    • socker.send.buffer.bytes / receiver.buffer.bytes: kafka에서만 해당 설정을 조정하는 것이 아니라 OS의 buffer도 같이 설정 조정을 해야 제대로 동작한다고 한다.
    • GC: 최근에는 Java17의 GC 알고리즘을 사용하는 경우 성능이 더 나아 질 수도 있다고 한다.