Rails 메모리 이용 최적화하기

shj5508·2020년 4월 9일
1

보안 이슈때문에 또 루비 버전을 올려야했지만, 귀찮아서 차일피일 미루다 얼마전 이런 서버 리소스 그래프를 보게 되었다.

뮤팟 서비스가 성장하면서 동시접속자가 늘어났고, 그로인해 서버 메모리가 최대 88% 정도까지 점유하게 되었다.
jemalloc을 이용하면 Rails 메모리 최적화를 할 수 있다고 이전부터 알고 있었는데, 이제 그 작업을 할 때가 온 것 같았다.

jemalloc 라이브러리가 달린 루비 버전 설치

sudo apt install libjemalloc-dev 

우선 서버에 jemalloc을 설치한다. 이후 rbenv로 루비 버전을 올려야 한다.

cd .rbenv
git pull origin master
cd plugins/ruby-build
git pull origin master

우선 루비 버전 정보를 전부 최신버전으로 올리고 다음 명령어로 jemalloc 라이브러리가 달린 루비 버전을 설치해야 한다

RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install 2.6.x

나는 여기서 자꾸 openssl이 build 에러가 나서 libssl-dev를 삭제하고 설치하니까 제대로 설치가 되었다. (openssl 헤더 파일이 제대로 연결 안되어있어서 나는 문제였는데 왜 삭제를 하니까 설치가 되는지는 잘 모르겠다...)
제대로 설치가 되었다면 다음과 같이 명령을 입력하면 출력이 이루어져야 한다.

$ ruby -r rbconfig -e "puts RbConfig::CONFIG['MAINLIBS']"
-lz -lpthread -lrt -lrt -ljemalloc -lgmp -ldl -lcrypt -lm

이제 원래 레일즈 프로젝트에서 bundle install 하고 nginx를 재시작하면 적용 완료!

적용결과: 효과 없음

생각보다 효과가 좋지 못했다. 물론 효과가 있긴 했지만, passenger가 사용할 총 램의 양을 정해놓고, 그 양만큼은 결국 점유하게 되었다. 내 생각에는 GC를 실행하는 조건이 일정량의 메모리가 사용하고 있을 때로 보인다. 그래서 그래프의 총 점유량은 변하지 않았다.

메모리 점유량 자체를 줄이려면 spawn되는 process의 개수를 줄여야 한다. 하지만 CPU가 맨날 놀고 있기 때문에 굳이 그럴 필요가 보이지 않아서 그냥 process개수는 그대로 유지하기로 했다.

profile
Rails, MongoDB 강좌를 운영하고 있습니다

0개의 댓글