我们如何使用 jemalloc 降低内存使用量
由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!
DEV 是一个部署在 Heroku 服务器上的 Ruby on Rails 应用程序。
前几天,我们公司的SRE专家Molly Struve注意到我们遇到了一些内存问题。这些问题看起来不像内存泄漏,因为随着时间的推移,内存使用量趋于稳定。但显然值得深入调查。
经过一番调查,我记起过去我曾将一个 Rails 应用程序从标准内存分配器切换到jemalloc。
jemalloc 库是应用程序可以使用的另一种内存分配器(Redis 自带该库),它在多线程环境下处理内存碎片问题时效果更好。
我们对此进行了研究,并启动了相关程序,结果如下:
红色条形图之前出现的轻微下降是由于部署操作释放了一些占用的内存,这是显而易见的。
我如何在我的 Rails 应用程序中实现同样的功能?
前提条件是你在 Rails 中使用多线程,否则它不会起到太大作用。
如果您使用的是 Heroku,可以按照这些说明操作。
如果不行,您可以参考本教程,重新编译您的 Ruby 代码并激活jemalloc支持。
为什么会发生这种情况?
Nate Berkopec 在他的文章《Malloc 可以使多线程 Ruby 程序内存使用量翻倍》中对此进行了详细的解释,但简而言之:malloc由于 Ruby 虚拟机和默认内存分配器()的设计方式,当涉及多线程时,它们之间的通信并不理想。
有什么缺点吗?
有可能,因为这会降低应用程序的可移植性(它在 Windows 上无法运行),而 Ruby 核心正在探索一些占用空间更小的选项,例如使用malloc_trim()。
我的建议是测试一下 :-)
文章来源:https://dev.to/devteam/how-we-decreased-our-memory-usage-with-jemalloc-4d5n
