전공영역 공부 기록

애플리케이션 분석 역량이 서비스 운영에 중요한 이유(feat-firebase-admin SDK)

악분 2025. 4. 5. 02:53
반응형

이 글에서는 만났던 성능저하 문제를 재현하려고 했지만 실패했던 사례를 공유합니다.

 

들어가며

요즘 일하면서 느낀 것 중에 하나는 서비스 운영 또는 쿠버네티스 운영을 위해서는 “개발능력이 필수”입니다. 인프라 이슈가 아닌 애플리케이션 성능 문제는 아키텍처, 데이터베이스, 코드 이해 능력이 있어야 문제를 파악할 수 있습니다.

 

최근 서비스 운영하면서 많은 문제가 개발과 관련된 문제였습니다. 따라서 아키텍처를 이해하고 코드의 어떤 부분이 성능을 낮추는지 알아야 했습니다. 아직 저는 개발역량이 많이 부족하기 때문에 현상만 관찰할 수 있었고 원인은 분석하지 못했습니다. 그리고 오류를 재현하려고 했지만 재현도 실패했습니다. ㅜ.ㅜ

 

최근에 오류재현을 실패했던 문제는 java firebase-admin SDK의 높은 메모리 사용률입니다. springboot 애플리케이션을 실행하는 pod에서 메모리가 시간이 지날수록 우상향하는 문제가 있었습니다. 네트워크, 서버, 데이터베이스 문제는 아니었기 때문에 애플리케이션 문제로 분석범위를 좁혔습니다. 

 

많은 분들의 도움으로 springboot에서 사용하는 firebase-admin SDK의 문제인 것을 확인했습니다. firebase-admin SDK를 9.4.3버전으로 업그레이드 했는데 이유는 알 수 없지만 9.4.3.버전에 메모리 이슈가 있는 걸로 보였습니다. 이전 버전인 9.2.0버전으로 롤백하니 pod메모리 사용률은 정상화 되었습니다.

 

firebae-admin SDK 코드 분석

firebase-admin 9.4.x버전 업데이트 내용을 보면 쓰레드 풀을 100개로 제한했습니다.

- 패치내용: https://github.com/firebase/firebase-admin-java/pull/985/files

 

쓰레드풀을 100개로 제한한 이유는 OOM발생을 막기 위해서였습니다. 이전 버전에서는 쓰레드 풀을 제한하지 않았기 때문에, 짧은 시간에 많은 요청이 오면 SDK가 쓰레드를 무제한으로 만들어서 커널의 CPU와 메모리를 무제한 사용하게 됩니다. CPU는 압축가능한 리소스이지만 메모리는 압축이 불가능하기 때문에 결국 쓰레드가 많아질때 OOM이 발생합니다.

- github PR: https://github.com/firebase/firebase-admin-java/pull/985/files

 

정말 쓰레드를 제한하면 pod메모리 사용률이 줄어들까?

업데이트 내용대로 쓰레드가 제한되면 메모리 사용률이 주는지 테스트했습니다.

 

k6를 사용하여 pod에 부하를 주고, prometheus와 grafana를 사용하여 메트릭 수집하고 분석했습니다.

- v9.2.0: 쓰레드 풀을 제한하지 않음

- v9.4.3: 쓰레드 풀을 제한

 

부하 테스트를 해보니 정말 쓰레드를 제한한 버전이 메모리를 덜 사용했습니다. 그리고 쓰레드 개수도 눈에 띄게 많이 작아졌습니다!

 

왜 운영하던 서비스에서는 결과가 반대로 나왔을까?

firebase-admin SDK 패치의도대로 메모리 사용률이 실제로 낮아졌습니다. 하지만, 제가 운영하던 서비스는 반대로 메모리 사용률이 올라갔습니다.

 

더 깊게 분석하려면 firebase-SDK 이외에 다른 코드를 분석해야 한다고 생각했습니다. 분석시간을 어림잡아 100시간이 넘을 것으로 생각하여 분석은 중단했습니다.

 

낮은 확률이지만 쓰레드를 제한했음에도 불구하고 메모리 사용률이 높아지는 상황은 firebase 서버가 불안정한 상황입니다. firebaes 서버가 불안정하면 응답 latency가 증가하기 때문에 httpclient-dispatch가 증가할 수 있습니다. firebase가 제한한 쓰레드와 별개인 쓰레드입니다.

- 이슈제기: https://github.com/firebase/firebase-admin-java/issues/1029

 

부하 테스트 자료

부하 테스트 실습자료는 저의 github에 공개되어 있습니다. README를 참고하셔서 실습을 진행하시면 됩니다. 실습을 하기 위해 firebase 프로젝트가 필요합니다.

- github: https://github.com/choisungwook/portfolio/tree/master/backend/firebase-fcm

 

실습과정은 유투브 영상 16:14분부터 볼 수 있습니다.

https://youtu.be/cBfBAmYKGXM?si=fr82JadkuwHEtdyL&t=978

 

반응형