-
[서버] http 502 서버 메모리 부족TIL 2024. 4. 30. 11:25
관제서버 운영중에,
배치프로그램으로부터 각 pc의 상태를 report하는 request를
간헐적으로 서버에서 수신하지 못해 경고 알람이 울리는 현상이 지속적으로 발생했었다.배치프로그램은 curl로 api를 호출했었는데, 배치프로그램에서 response 받은 에러 내용을 살펴보니
nginx에서 502 error를 반환하고 있었다.(서버와 연결 실패)
nginx의 로그를 살펴본 결과,
어느 순간부터 104에러 (업스트림 서버로부터의 일방적 연결해제) 가 발생하고그 이후부터 약 10~20초간 111에러 (업스트림 서버로 연결 실패)가 발생하고 정상복귀 되었다.
이때 서버가 어떤 원인에 의해 종료된 후 재시작되어서 10~20초간 수신을 못하는 건가? 싶었지만,
서버가 재시작되면 크론 스케쥴이 서버 시작 시점부터 80초 뒤 시작되는데, 크론잡이 시작되기 전인 80초 이내에
repuest를 받지 못할 리가 없으므로, 이건 아닐거라고 생각했다이 502에러가 발생하는 원인은 굉장히 다양했다.
이것저것 다 시도해 보고나서 결론부터 말하자면, 원인은 서버 인스턴스의 메모리 부족이 원인이었다.
(aws t3a.medium 인스턴스, 4gb 메모리)
약 10초간에 고작 100개 정도의 request만을 수신하고,
크론잡이 많긴 하지만 전체적으로 연산량도 적고 효율이 좋게 짜여진 서버인데,서버의 자원이 부족해서 발생했을 것이라고는 내 상식선에서는 생각하기 힘들었다.
그래서 나는 원인을 정확히 파악하고자 로그 파일을 만드는 모듈을 만들어서 디버깅을 하고 있었다.
그러다 오류가 발생했을 때, 로그가 기록되는 파일이 초기화된다는 점,
그리고 pm2로 보았을 때 서버의 업타임을 보니 오류가 발생했을 때 서버가 재시작된다는 점을 발견했다.결국 문제는 총 두가지였는데, 첫번쨰는 서버의 메모리 부족이었고,
두번째는 로그파일을 만드는 모듈에서 로그를 파일에쓴 뒤 스트림을 종료하지 않아 메모리 누수가 지속적으로 누적되었다는것이었다.
두가지를 해결하니 일단은 더이상 문제가 발생하지는 않고 있다.
'TIL' 카테고리의 다른 글
[IPv6] ENETUNREACH (0) 2024.04.22 [https] redirect (0) 2024.04.17 [https] nginx로 간단하게 https 설정 (0) 2024.04.16 [Nest] 모듈 export (0) 2024.04.01 [.env] 환경변수 로드 순서 (0) 2024.03.26