【jemalloc】Rubyのメモリ使用率上昇を食い止めたい


はじめに

この記事のゴール

Rubyのアロケータをjemallocに変更してメモリ使用率上昇を食い止める

【現状】
AWSのEC2(AmazonLinux2)でrailsを動かしています。


このようにメモリ使用率がどんどん上昇して帰ってこなくなりました。こわい。

いろいろ探していくなかで、Rubyのアロケータをjemallocに変更する手がよいとのこと。

jemallocもスレッド単位アリーナを実装していますが、mallocで起きる断片化を回避する設計になっているようです。

メモリ使用率の上昇を食い止めるため、Rubyのアロケータをmallocからjemallocに変更していきます。

ゴールまでの道のり

  1. jemallocを有効化する
  2. jemallocが有効になっているか確認

環境

  • AWSのEC2(AmazonLinux2)内で既にrailsアプリが動いている
  • Ruby2.7.1

実践

1.jemallocを有効化する

Rubyのバージョンを確認

$ ruby -v
ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]

システムを止める

$ kill -9 <PID番号>

依存ライブラリのインストール

$ sudo amazon-linux-extras install -y epel
$ sudo yum install -y jemalloc-devel

rbenvを使ってrubyを再インストール

$ RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install 2.7.1
rbenv: /home/ec2-user/.rbenv/versions/2.7.1 already exists
continue with installation? (y/N) y
Downloading ruby-2.7.1.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.1.tar.bz2
Installing ruby-2.7.1...
Installed ruby-2.7.1 to /home/ec2-user/.rbenv/versions/2.7.1

※RUBY_CONFIGURE_OPTSオプションを付けてjemallocを指定する

システムを起動

$ rails s -e production

2.jemallocが有効になっているか確認

rbconfigを確認する方法

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

ljemalloc が表示されていればOK

プロセスを確認する方法

$ sudo strings /proc/<RubyのアプリのPID番号>/maps | grep jemalloc
7fe716d40000-7fe716d71000 r-xp 00000000 103:01 9054958                   /usr/lib64/libjemalloc.so.1
7fe716d71000-7fe716f70000 ---p 00031000 103:01 9054958                   /usr/lib64/libjemalloc.so.1
7fe716f70000-7fe716f72000 r--p 00030000 103:01 9054958                   /usr/lib64/libjemalloc.so.1
7fe716f72000-7fe716f73000 rw-p 00032000 103:01 9054958                   /usr/lib64/libjemalloc.so.1

pidを指定してメモリマップを確認し、jemallocへのパスが表示されていればOK

consoleで確認する方法

$ irb
irb(main):001:0> RbConfig::CONFIG['MAINLIBS']
=> "-lz -lpthread -lrt -lrt -ljemalloc -ldl -lcrypt -lm "

-ljemalloc が表示されていればOK

おわり

jemallocを有効にしてみました。
打てる手は打ちました。あとは天命を待ちます。。

参考記事

ありがとうございました。

https://techracho.bpsinc.jp/hachi8833/2017_12_28/50109
https://zenn.dev/sukedon/scraps/32d5bc84aa08b6
https://tech.studyplus.co.jp/entry/2019/09/09/094140