보안 이슈때문에 또 루비 버전을 올려야했지만, 귀찮아서 차일피일 미루다 얼마전 이런 서버 리소스 그래프를 보게 되었다.
뮤팟 서비스가 성장하면서 동시접속자가 늘어났고, 그로인해 서버 메모리가 최대 88% 정도까지 점유하게 되었다.
jemalloc을 이용하면 Rails 메모리 최적화를 할 수 있다고 이전부터 알고 있었는데, 이제 그 작업을 할 때가 온 것 같았다.
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개수는 그대로 유지하기로 했다.