Flink 성능, end-to-end latency 병목을 찾아 해결하세요!
Flink 어플리케이션의 end-to-end latency 개선을 위해 Operator 단위 지표를 수집하고 분석함
Flame Graph를 활용하여 처리 시간과 처리 외 시간 병목 구간을 식별함
Kryo serializer와 같은 Flink 내부 코드의 병목을 찾아내고, POJO serializer로 개선함
Flink Operator 지표 수집 및 분석
Flink 어플리케이션의 end-to-end latency 개선을 위해 Operator별 처리 시간과 처리 외 시간 지표를 수집한다. 구체적으로, 처리 시간은 어플리케이션 코드 실행 시간을, 처리 외 시간은 데이터 de/serialize, 네트워크 I/O 시간을 의미한다. 따라서, 두 지표를 분리하여 병목 지점을 파악하고, 문제 해결 방향을 설정한다.
Flame Graph를 활용한 병목 구간 분석
Flame Graph는 Flink operator의 콜 스택을 시각화하여 성능 프로파일링을 돕는다. 처리 시간과 처리 외 시간을 구분하여 분석하고, 어플리케이션 로직 또는 Flink 내부 코드의 병목을 식별한다. 반면, 네트워크 I/O와 같은 외부 요인은 flame graph에서 확인하기 어렵다는 점을 유의해야 한다.
Kryo Serializer 병목 현상 해결
Flame graph 분석을 통해 Kryo serializer의 성능 저하를 확인하고, POJO serializer로 변경하여 성능을 개선한다. 구체적으로, Kryo serializer는 runtime reflection을 사용하므로, POJO serializer보다 성능이 떨어진다. 따라서, 데이터 클래스 코드를 수정하여 메모리 사용량 감소 및 성능 향상을 달성한다.