
어느날 Jenkins로 개발 서버에 어플리케이션을 배포하는데, 다음과 같은 에러 문구가 뜨면서 빌드에 실패하였습니다.

Gradle build daemon disappered unexpectedly 라는 문구로 구글링을 해본 결과 EC2 메모리가 부족해서 빌드가 실패한 것이라는 이야기가 많아서 개발 서버 EC2 메모리 용량을 free -h 명령어로 확인을 해보니 사용 가능한 메모리가 300MB로 굉장히 작았습니다.
어차피 개발 서버이니 스왑 메모리를 설정을 할까.. 아니면 EC2 메모리 스펙을 늘릴까.. 고민을 하던 와중,
왜 갑자기 메모리가 부족하게 되었을까? 라는 근본적인 문제의 원인이 궁금해졌습니다.
먼저 어떤 프로세스가 메모리를 잡아먹고 있는지 알기 위하여, ps -e 명령어를 통하여 모든 프로세스를 출력해봤습니다.

출력해보니, ssh-agent 라는 프로세스가 굉장히 많이 눈에 띄었는데요, 해당 프로세스는 EC2에 ssh 접속을 하고 제대로 종료를 안하면 쌓이는 프로세스였습니다.
Jenkins의 구성을 확인해보니, 한번 배포를 할 때마다 EC2에 ssh 접속을 총 4번을 하도록 되어있었습니다. 그러면 ssh-agent도 총 4번이 쌓이겠죠..?
어찌되었건 의심이 가는 ssh-agent 프로세스를 아래의 명령어로 전부 죽여보았습니다.
kill `ps -ef | grep ssh-agent | grep -v grep | grep -v tail | awk '{print $2}'`
다시 한번 free -h 명령어를 통해 확인해보니 사용가능한 메모리가 300MB에서 1.2G로 늘어났고, 빌드도 정상적으로 성공하게 되었습니다!

일단은 ssh-agent 프로세스가 쌓이지 않도록 빌드가 끝난 뒤에는 정상적으로 프로세스를 종료해주어야 하겠으나, 아직까진 개발서버에서만 발생하고 있기에 젠킨스에서 빌드 실패 시 해당 명령어를 통해 ssh-agent 프로세스를 주기적으로 지워주는 방법을 선택하였습니다.

다른 팀원분들도 저처럼 당황할 수 있으니, 노션의 백엔드 팀 위키에 기록해두어, 팀원 분들도 관련하여 어려움을 겪을 경우 해결할 수 있도록 해결 내용을 공유해드렸고, 이 글을 보시는 분들도 같은 상황이라면 상황에 맞는 해결방법을 잘 채택하여 해결하시길 바랍니다!
'트러블 슈팅' 카테고리의 다른 글
JPA Batch Insert API 성능 개선기 (GenerationType.IDENTITY의 한계점) (0) | 2024.05.21 |
---|---|
(Spring) MySQL 격리수준에 따른 문제 해결 (2) | 2024.03.28 |
@RequestParam MultiValueMap의 내부 List 타입 불일치 문제 해결 (0) | 2023.11.11 |
개발을 하며 만났던 문제들과 해결 과정, 공부한 내용 등을 기록합니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!