DEV Community

K Putra
K Putra

Posted on

2

Menurunkan penggunaan memory untuk aplikasi Ruby (newbie friendly)

Bahasa Ruby merupakan salah satu bahasa yang memerlukan memory cukup besar. Hal ini berimbas pada kebutuhan memory yang besar di server, terutama ketika semakin banyak traffic dan background process yang perlu ditangani oleh aplikasi berbasis Ruby.

Salah satu cara untuk menurunkan penggunaan memory adalah dengan mengganti memory allocation library. Ruby secara default menggunakan malloc. Sekarang kita ganti dengan jemalloc.

Redis telah menggunakan jemalloc selama beberapa tahun. Berkat penggunaan jemalloc, Redis berhasil mengurangi penggunaan memory ketika dijalankan.

Apakah penggunaan jemalloc benar-benar berhasil? Semua, saya ulangi, semua artikel yang saya temukan mengenai penggunaan jemalloc untuk Ruby belum memiliki imbas buruk. Semuanya mengabarkan penurunan penggunaan memory pada aplikasi berbasis Ruby yang telah dibangun.

Beberapa artikel bahkan menggunakan jemalloc pada aplikasi yang telah menangani jutaan request dalam satu hari. Semakin besar skala aplikasi, semakin terasa keuntungan dari penggunaan jemalloc.

Disclaimer: Artikel saya ini tidak akan membahas mengenai hasil sebelum dan sesudah penggunaan jemalloc. Fokus saya hanya untuk bagaimana mengatur agar Ruby yang kita miliki dapat menggunakan jemalloc. Artikel-artikel benchmark penggunaan jemalloc saya sertakan di akhir artikel ini.

Install Jemalloc

Pada Linux, kita harus install jemalloc terlebih dahulu:

$ sudo apt update
$ sudo apt install libjemalloc-dev
Enter fullscreen mode Exit fullscreen mode

Pada macOS cara paling mudah instalasi jemalloc adalah menggunakan Homebrew:

$ brew install jemalloc
Enter fullscreen mode Exit fullscreen mode

Perhatian: Karena jemalloc adalah C library, maka hanya bisa digunakan untuk Ruby MRI.

Install Ruby

Instalasi Ruby pun harus diulang. Jika menggunakan rbenv, maka lakukan install Ruby dengan cara:

$ RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install 2.5.3
Enter fullscreen mode Exit fullscreen mode

Jika menggunakan rvm, maka bisa install dengan cara:

$ rvm install 2.5.3 -C --with-jemalloc
Enter fullscreen mode Exit fullscreen mode

Jika sebelumnya sudah terinstall versi Ruby, maka yang dilakukan adalah reinstall, bukan install.

Setelahnya, cek apakah versi Ruby yang diinstall telah menggunakan jemalloc:

$ ruby -r rbconfig -e "puts RbConfig::CONFIG['LIBS']"
Enter fullscreen mode Exit fullscreen mode

Respon yang didapat kurang lebih akan seperti ini:

-lpthread -ljemalloc -lgmp -ldl -lcrypt -lm
Enter fullscreen mode Exit fullscreen mode

Jika sudah ada -ljemalloc berarti versi Ruby yang baru diinstall sudah menggunakan jemalloc.

Restart aplikasi yang sedang berjalan (termasuk sidekiq, jika menggunakan sidekiq) maka aplikasi Ruby yang kita gunakan sudah akan menggunakan jemalloc sebagai memory allocation library.

Perhatian: Penurunan penggunaan memory pada aplikasi berskala kecil tidak akan signifikan.

Bagaimana di Heroku?

$ heroku buildpacks: set heroku/ruby
$ heroku buildpacks:add --index 1 https://github.com/scryfall/heroku-buildpack-jemalloc.git
$ git push heroku master
Enter fullscreen mode Exit fullscreen mode

Bagaimana benchmark penggunaan memory?

  1. https://medium.com/@adrienjarthon/ruby-jemalloc-results-for-updown-io-d3fb2d32f67f
  2. https://medium.com/rubyinside/how-we-halved-our-memory-consumption-in-rails-with-jemalloc-86afa4e54aa3
  3. https://bubblin.io/blog/jemalloc

Image of Datadog

The Future of AI, LLMs, and Observability on Google Cloud

Datadog sat down with Google’s Director of AI to discuss the current and future states of AI, ML, and LLMs on Google Cloud. Discover 7 key insights for technical leaders, covering everything from upskilling teams to observability best practices

Learn More

Top comments (0)

Hostinger image

Get n8n VPS hosting 3x cheaper than a cloud solution

Get fast, easy, secure n8n VPS hosting from $4.99/mo at Hostinger. Automate any workflow using a pre-installed n8n application and no-code customization.

Start now

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay