Rails应用减少内存消耗

环境:Ubuntu 20.04

内存泄漏在 Ruby 中常常是由 C 拓展程序 bug 导致的。内存碎片会造成内存呈对数增长。 它看起来像一个长长的曲线,会到达某个不可见的限制点。所有 Ruby 进程都有一些内存碎片问题。Ruby 管理内存方式必然会导致这个问题。尤其是 Ruby 不会在内存中移动对象。这样可能会破坏持有 Ruby 对象指针的 C 扩展程序。 碎片有时会造成 Ruby 占用超过它实际需要两倍的内存,有时还可能会是 4 倍之多!

解决方法:1. 调整环境变量 export MALLOC_ARENA_MAX=2

2. 使用jemalloc内存分配库,检查是否支持

ruby -r rbconfig -e “puts RbConfig::CONFIG[‘MAINLIBS’]”

 

Rails 内存占满

最近搭建一个rss feed管理的rails应用,在使用一段时间后内存差不多就占满,就是pumasidekiq这两个进程占用。一种比较灵活的方式,使用像puma_worker_killer这样的监控程序,监控rails进程达到一定内存占用后将其重启,但这样使用体验不好。

由于ruby使用glibcmalloc进行内存分配,这是一个比较老旧的内存分配器,性能比较低分配时会产生大量碎片,所以切换jemalloc做为Ruby应用的内存分配器

# ruby -v

ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]

#apt-get install libjemalloc-dev

#apt-get install libcurl4 libcurl4-openssl-dev

# rvm reinstall 2.6.3 -C –with-jemalloc