🏢
【jemalloc】Rubyのメモリ使用率上昇を食い止めたい
はじめに
この記事のゴール
Rubyのアロケータをjemallocに変更してメモリ使用率上昇を食い止める
【現状】
AWSのEC2(AmazonLinux2)でrailsを動かしています。
このようにメモリ使用率がどんどん上昇して帰ってこなくなりました。こわい。
いろいろ探していくなかで、Rubyのアロケータをjemallocに変更する手がよいとのこと。
jemallocもスレッド単位アリーナを実装していますが、mallocで起きる断片化を回避する設計になっているようです。
メモリ使用率の上昇を食い止めるため、Rubyのアロケータをmallocからjemallocに変更していきます。
ゴールまでの道のり
- jemallocを有効化する
- 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を有効にしてみました。
打てる手は打ちました。あとは天命を待ちます。。
参考記事
ありがとうございました。
Discussion