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 알고리즘을 사용하는 경우 성능이 더 나아 질 수도 있다고 한다.