SJVA – 메모리 문제

이 글은 파악했던 문제점을 정리해 놓기 위한 글입니다.


SJVA의 큰 문제점은 메모리가 계속하여 증가하는 것이다.

이 스샷을 보면 19시간만에 800메가를 넘겼고, 이 숫자는 계속해서 증가하여 결국에는 메모리가 부족한 문제가 발생한다.

하지만, 실제 프로그램 내에서 메모리를 찍어보면, 40메가 정도로 시작한 후 많아봐야 60메가 수준으로 코드의 문제가 아닌 것으로 파악된다.

원인 : 단편화 문제로 OS에 free가 되지 않는다.

삽질 1) multiprocessing 사용
multiprocessing 을 사용하는 경우 메모리 증가 문제는 발생하지 않는다. 하지만 websocket 잘 적용되지 않았다. 나중에 안 거지만 gevent에서 multiprocessing을 많은 문제점이 있다고 하며 gevent에서 multiprocessing 을 사용하는 것 자체가 OS에 문제를 야기 할 수 있다고 한다.
flask-socketio는 greenlet이나 gevent를 사용해야 하는데, greenlet 또한 multiprocessing 을 사용하지 못한다. SJVA는 gevent 사용

삽질 2) uwsgi 에서 gevent 적용. 소스내에서는 multiprocessing
의미 없는 짓이었다. flask-socketio는 1 process 만 사용해야 하며, alpine 베이스 도커버전에서 –gevent 옵션이 항상 1으로 고정하는 문제가 발생했다.

삽질 3) gipc 사용
gevent에서 multiprocessing 을 사용하는 솔루션으로 나와있는 패키지인데, 잘 되는 듯 하나 run_callback 에러가 발생한다. 찾아보니 큐를 어찌어찌 사용해야 하는것으로 나왔는데, 잘 되는 코드를 변경하기가 애매하다.

해결방안 1) celery 사용
이 방법으로 나중에는 변경해야 하지만, framework 전체를 변경해야 하기에 0.2 버전에서 적용하고자 한다.

해결방안 2) 주기적인 재실행
0.1 버전에서는 일단 이 문제 이외에 여러 문제가 발생될 예정이기도 하고, 어짜피 업데이트 기능을 넣으면 재실행 해야하기에, 1일 정도 간격으로 재실행하도록 한다.

Hits: 1001

This Post Has 2 Comments

  1. 도저히 해결이 안되서 여쭤봅니다 putty를 실행 하고 ID PW 입력하자마자 차이 닫힙니다 제발 도와 주세요…ㅜㅜ

댓글 남기기

Close Menu