TIL-20210205
RAM 32G 맥북프로 로컬에서 테스트한 django - celery 가 서버에서 돌리니 memory error가 났다.
로컬 컴퓨터와 서버 컴퓨터 램 사용량을 확인해보니 RAM, SWAP 두개가 있었는데 로컬에서는 둘다 사용하고 있었지만 서버에서는 RAM만 사용하고 SWAP 메모리는 사용하고 있지 않았다.
어플리케이션의 RAM 용량이 차면, swap 메모리가 자동으로 늘어난다. 하드디스크의 디스크 공간을 swap 메모리로 사용하기 때문에 속도가 느려진다. 보통 swap 메모리는 기본 RAM 용량의 2배정도를 잡는 것을 권장한다. 이 swap 메모리 용량은 성능이슈와 관련있기 때문에 알맞게 조정하는 것이 좋다. 메모리가 부족한 현상이 자주 발생하는 경우가 아니면 swap 자체를 사용하지 않는 것이 사실 좋다. 만약 swap 메모리를 사용해야 하는 경우가 생긴다면, 하드웨어로 먼저 처리할 수 있는지 확인하여 여유가 되면 하드웨어로 처리하는 것이 베스트이다. Ram 추가 세팅, SSD 사용 등이 하드웨어적 처리의 한 방법이겠다. swap in, swap out 은 성능을 많이 저하시킨다. 위와 같이 하드웨어로만 처리되면 좋겠지만, 그렇지 못한 상황은 꼭 발생한다. 특히 DB 를 자주 사용하는 경우는 swap 이 많이 활용된다. DB의 경우 속도를 위해 cache 를 사용하는 경우가 많기 때문에 대부분 memory 에 올려서 사용하려 하고, 그러다 보니 swap 을 사용하게 되는 경우가 많다. 과도한 swap 사용 방지를 위해 mlock 으로 이를 방지하는 형태로 서버를 유지하는 경우가 많다. swap 메모리 설정, swap 메모리 사용 빈도 설정, swap page-in, page-out 조회 등도 가능하다.
출처: https://aroundck.tistory.com/2659 [돼지왕 놀이터]
해당 블로그 내용에 따르면 과도한 SWAP 메모리 사용 방지를 위해 mlock으로 이를 방지하는 형태로 서버를 유지하는 경우가 있다고 하는데 이부분에 대해서 조금 더 자세히 알아보아야 할 것 같다.
서버에서 프로세스의 복사본을 만들기 때문에 사용량이 10GB 라면 fork 에서도 10GB가 필요하다
해결책의 한가지 방법으로 시스템에 더 많은 메모리 (아마도 가상 메모리, 즉 스왑 공간)를 추가하는 것을 고려 해봐야겠다.
app.ini 에 processes =4 로 설정되어 있는데 메모리가 * 4로 적용되서 난 에러가 아닐까 생각했다. processes = 1로 변경했을 때 제대로 동작한다면 내가 예상한 문제가 맞다는 것이다.. 결과는..? 잘 동작한다..
이를 해결하기 위해선 어떻게 해야할지도 생각해봐야겠다..
21-02-08 process = 2, 3, 4 를 점차적으로 늘려가며 언제 메모리 에러가 나는지 확인하고자 했다.
그런데 2, 3, 4 모두 잘 동작하였다
뭐지??? app.ini 프로세스를 죽이고 새로 시작하니 잘 동작했던 것 같다
왜 되는지, 왜 안되는지 원인파악을 다시 해봐야겠다.
댓글남기기