개인 프로젝트 메모리 과부하로 다운된 썰

docker 잘 모르고 쓰니 위험했다.

JC
Museion
4 min readJun 6, 2019

--

docker로 운영 중인 개인 프로젝트 서비스가 다운됐었다. 그 이야기를 정리해본다.

아무리 캐릭터가 귀여워도 기분은 좋지 않은 숫자 404

개인 프로젝트로 운영하는 서비스가 있다. 외국에서 운영하는 게임 정보를 fork 해서 번역 데이터를 제공하는 것이다. 지금은 조금 더 발전해서 추가 기능이 있지만 기본 기능은 번역 데이터 제공이다.

많을 때는 pv가 6천 정도 나온다. 평소에는 3–4천 정도 나오는, 잔잔한 서비스다. 사람들에게 크게 영향을 미치고 싶은 생각도 없고, 잘 키워서 팔아먹을 생각도 없다. cloud, docker, python 공부하면서 운영비 정도만 벌면 좋겠다는 마음에 얼마 전부터 구글 애드센스를 붙였다.

다행히 사람들이 좋아하고 많이 찾아주셔서 별다른 홍보를 하지 않아도 서로 소개하고 화면 캡처도 하며 정보를 공유한다.

서버 다운의 서막

사건은 지난주부터 시작이다. 게임 공식 이벤트 페이지가 있는데 보기가 불편하다며 쉽게 볼 수 있는 방법은 없겠냐는 문의가 왔다. 이벤트 페이지를 살펴보니 chromium을 쓸 필요도 없이 requests로 크롤링하면 데이터를 가져올 수 있겠다 싶어 자기 전에 두 시간 정도 시간을 들여 만들고(아직 python을 하나도 모르니 뭐라도 만들려면 문서를 보면서 만들어야 한다) 공식 커뮤니티도 아닌 게임팬카페에 링크 하나를 남겼다. 링크를 올리자마자 잠들었고, 아침에 깼을 땐 이벤트 페이지의 동시 접속자가 50을 넘겼다. 이전에는 20을 넘기지 못했던 동시접속자인데 들어와서 계속 새로 고침을 하는 건지 모르겠지만 동시 접속자가 무척 많다.고 생각 하고 말았다. 서버 모니터링 정보를 보니 cpu가 조금 오르기는 했지만 다른 지표에는 큰 차이가 없었다. 업무가 바쁘기에 게임은 딱히 신경 쓰지 않았다.

공개한 날의 PV

죽음의 시간 11:58

매일 PV가 1만을 넘는 날이 계속되면서 이벤트 마지막 날이 다가왔다. 이 날까지도 게임에 신경을 쓰지는 못하고 접속이 좀 많구나 생각만 했다. 게임 이벤트는 순위로 경쟁하는 것이라 10분 주기로 크롤링하는 순위 기준 데이터와, 사용자가 요청할 때마다 크롤링하는 사용자 정보가 있는데 기준 데이터가 너무 빨리 바뀌어서 10분 주기로는 원하는 정보를 제대로 볼 수 없드는 피드백이 들어왔다. 이벤트 마지막 날이니까 그냥 지켜보자는 생각에 몇 시간만 무시하자고 생각했다. 나뿐 아니라 공식 페이지도 많은 트래픽을 받느라 고생했을 것이다. 그러던 중에 이벤트 종료 2시간 전부터 접속이 더 늘어나더니 동시 접속자 100을 초과한 것을 봤다. 그리고 이벤트 종료 직전인 11:58에 서버에 접속할 수 없게 됐다.

업무 시간이라 따로 모니터링을 하지는 않았는데 서버에 여러 문제가 있었을 것으로 보인다. 업무를 하지 않았더라도 최적화를 고민하지 않았을 것 같다. 여기에 에너지를 크게 쏟지 말자.

docker 조심해서 써야겠다

점심을 먹고 나서 원인 파악을 하려고 알아봤다. 크롤링을 하던 웹 컨테이너가 메모리 부족으로 뻗어버렸고, 디비 컨테이너도 메모리를 쓰기 때문에 같이 뻗은 것 같다. api 서비스 컨테이너는 살았지만 웹 컨테이너가 뻗어서 api 서비스는 아무 호출이 없는 상태다. 컨테이너를 재시작하고 컨테이너에서 아파치를 시작하자 서비스가 정상화됐다. 모니터링 정보를 보니 메모리가 계속 100%에 가깝게 있다가 11:58부터 0%로 뚝 떨어졌다.

어떻게 할까 고민하다가 서버 하나를 추가해서 이벤트 전용 서브도메인을 붙이고 이벤트 관련 코드를 옮겼다. 기존 페이지로 접속하던 사람들이 이 페이지로 리다이렉트 될 수 있도록 코드를 추가했다. 다음 이벤트에도 서비스가 필요할까? 딱히 필요는 없지만 머리를 쥐어짜서 필요하도록 만들려고 한다. 이벤트 페이지를 계속 훑어보며 기획 중이다. 다음 이벤트에는 서버가 뻗지 않기를!

--

--

JC
Museion

책 읽는 개발자. 아빠. 생산성, 책, 개발에 관한 글을 남깁니다.