AWS/ElasticBeanstalk

Elastic Beanstalk memory issue

알면 알 수록 재밌다! 2023. 6. 19. 11:24

EC2의 사이즈를 small 정도로 운영하니 메모리가 99%가 뜨면서 결국 서버가 내려가게 되었던 이슈가 있었다.

 

해당 이슈는 nginx의 세팅을 해줘서 메모리 누수를 막아줘야하는 이슈라고 한다.

 

 

나는 아래 블로그를 보고 참고했는데, 해결방법이 다양하니 밑에 여러 방안을 작성해봤다.

https://velog.io/@stay136/gunicorn%EA%B3%BC-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%88%84%EC%88%98

 

 


원인 1)

 

gunicorn의 max connection을 지정 안해주면 default(4개)로 잡히는데, 
연결 안끊고 클라이언트가 5개이상 붙어있으면 서버가 클라이언트 소켓 accept를 못하게되고 무한으로 pending 되게 되는 현상으로 메모리 누수현상이 일어나게 된다.


그래서 elastic beanstalk cpu  > 95% 이러다가 max connection이 5개 이상 잡히는 순간 
> 99% 가 되서 elastic beastalk 가 동작을 멈춘다.

 


 

원인 2)

 

gunicorn의 max connection 문제가 아니라 docker hard limit가 512mb인데, 배포한 컨테이너가 이 메모리양을 넘었기 때문에 발생한 것이다.

때문에 웹서버가 띄워지면서 api를 수행하게 되고 메모리가 점점 차올라서 512mb를 넘게 되는것이다.

docker의 hard limit를 늘려주자.

 

docker run --memory=1g app

 

위처럼 해볼 수 있고

version: '3'
services:
  app:
    image: app
    mem_limit: 1g

 

docker-compose 시에는 위처럼 할수도 있다.

 

그리고 gunicorn의 timeout을 늘려줘야한다. 용량이 크다는건 그만큼 배포할때 오래걸린다는 뜻이니까 말이다.

--timeout=60

 

위처럼 타임아웃을 늘려줘야한다.