gunicorn에서의 공유 메모리(heroku)

heroku에 doc2vec으로 학습한 데이터를 올려서 조회해보는 아주 간단한 앱을 만들어서 올렸다. django를 이용했으니, view.py에 golobal model 변수에 대해서 ‘if model =  None이면 모델을 읽어라.’ 라고 코딩했다. 완벽하다. 그런데, 분명히 모델을 읽었음에도 불구하고, global model변수가 None이라고 하면서 다시 읽어들인다.

얼추 검색해보니, wsgi인지 gunicorn인지 뭔지 모르겠으나, 이놈들이 python 웹을 멀티 프로세스(또는 쓰레드?)로 띄워주기 때문에, worker 가 달라지면 global변수가 공유가 안된단다. 아유 골치아파…

그래서 프로세스간 메모리 공유에 대해서 알아봐야한다.

worker를 1개로 줄인다.(O)

worker가 2개 이상이 되면, 새로운 work가 초기화될때마다 전역변수를 새롭게 설정해주어야한다. 따라서 워커를 하나로 줄이면 서비스의 scalability는 낮아지지만, 메모리는 최소화하여 사용할 수 있다. heroku에서 아래와 같이 하면 워커를 1개로 설정할 수 있다.

 

캐싱 방법을 찾아본다.(사이즈 제한이 있음)

https://devcenter.heroku.com/articles/memcachier#django

단, 수MB이하의 데이터를 캐싱하는 것만 허락한다. 그리고 또한 redis등으로 캐싱할 경우 사이즈당 요금이 비싸다. 이건 포기…