用 Jemalloc 来减少 Ruby 应用内存开销,并提升性能

使用不同的内存 Allocation 库,可以减少 Ruby 应用的内存开销和响应时间。本文介绍如何用它在 Heroku 或自己的服务器上部署。

Ruby 应用程序一般都有较大的内存开销,并逐步增加,哪怕有 GC 的动作。你的应用程序可能在启动的时候就有 150MB,然而有潜在的可能很快就会上升到 300MB。

Ruby 使用 malloc 的 C 库来实现动态 allocate, release 以及 re-allocate 内存,以便存储对象。然而,还有其他的实现存在,例如 tcmallocjemalloc。后者已经在 2005 年 FressBSD 里面证明了自己。同时 Redis 也曾用过它好几年,可靠性值得信赖。

在 Ruby 里面使用 jemalloc 可以让你的应用程序 allocate, re-use 或 release 时更高效的利用内存。在生产环境 (production),已经有很多的用户例子说明它可以提升 10% (仅 Ruby 实现的部分),同时有稳定的内存消耗。也有些人像我们一样,发现内存泄漏,并解决了。如果你也有这样的问题,文章最后的部分可以帮到你。

Installing jemalloc

Ruby MRI(官方标准的 Ruby 版本),自从 2.2 以后支持在编译的时候用 jemalloc 代替 malloc。不需要额外的 patches,只需要你的系统安装了 jemalloc 的库,并在编译的时候增加相应的编译参数。

在 Linux 安装 jemalloc 可以用包管理工具,以 Ubuntu 为例:

$ sudo apt-get update
$ sudo apt-get install libjemalloc-dev

macOS 也有简单的方法:

$ brew install jemalloc

编译 Ruby 以支持 jemalloc

$ ./configure --with-jemalloc

# Usual post-configuration commands:
$ make
$ make install

如果你是用 rbenv 或 RVM 的话,带上 RUBY_CONFIGURE_OPTS 参数就可以(这个是 Ruby 编译支持的,所以 RVM, rbenv 都一样的)

# rbenv
$ RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install 2.4.0
# rvm
$ RUBY_CONFIGURE_OPTS=--with-jemalloc rvm install 2.4.0

用下面的方法可以验证效果:

$ ruby -r rbconfig -e "puts RbConfig::CONFIG['LIBS']"

如果 jemalloc 有效,你会看到下面的信息:

-lpthread -ljemalloc -ldl -lobjc

译注:后面部分省略了,自己看原文吧

原文阅读

https://www.levups.com/en/blog/2017/optimize_ruby_memory_usage_jemalloc_heroku_scalingo.html

11 个赞
评论列表
2099
hz_qiuyuanxin 发表于 2017年04月21日

👍