ruby 当有足够的空闲堆槽时请求更多内存
ruby requests more memory when there are plenty free heap slots
我们有服务器运行
- Sidekiq 4.2.9
- rails 4.2.8
- MRI 2.1.9
此服务器定期从外部 API 产生一些导入,对它们执行一些计算并将这些值保存到数据库中。
大约 3 周前服务器开始挂起,正如我从 NewRelic 看到的(以及当 ssh 连接到它时)- 随着时间的推移它消耗越来越多的内存,最终占用所有可用的 RAM,然后服务器挂起。
我已经阅读了一些关于 ruby GC 工作原理的文章,但仍然无法理解,为什么在 ~5:30 AM 堆大小从 ~2.3M 跳到 3M ,而此时仍有 1M 空闲可用的堆插槽(GC 设置为默认设置)
类似行为,3:35PM:
所以,问题是:
- 如何使 Ruby 填充空闲堆槽而不是从 OS 请求新槽?
- 如何让它释放空闲堆槽给系统?
how to make Ruby fill free heap slots instead of requesting new slots from OS ?
您的图表没有 "full" 保真度。很多人认为 GC.stat 是由 Newrelic 或诸如此类的东西恰好在正确的时间调用的。
很可能您 运行 没有插槽,堆变大了,并且由于堆在 Ruby 中没有收缩,您陷入了有点臃肿的堆中。
为了减轻一些痛苦,您可以将 RUBY_GC_HEAP_GROWTH_MAX_SLOTS 限制在一个合理的数字,大约 100,000 就可以了,我正在尝试游说在此处设置默认值。
还有
创建 运行 作业的持久日志并对其计时 运行(持续时间等),在作业 运行 之前和之后收集 GC.stat =]s
按队列拆分作业,运行 1 个队列在一台服务器上,另一个队列在另一台服务器上,查看哪个队列和哪个作业对问题负责
使用 flamegraph 或其他分析工具分析您的各种作业
减少您 运行 作为实验的并发作业数量,或在某些作业类型之间放置互斥体。可能一次 1 "job a" 还可以,一次并发 20 个 "job a" 会膨胀内存。
我们有服务器运行
- Sidekiq 4.2.9
- rails 4.2.8
- MRI 2.1.9
此服务器定期从外部 API 产生一些导入,对它们执行一些计算并将这些值保存到数据库中。
大约 3 周前服务器开始挂起,正如我从 NewRelic 看到的(以及当 ssh 连接到它时)- 随着时间的推移它消耗越来越多的内存,最终占用所有可用的 RAM,然后服务器挂起。
我已经阅读了一些关于 ruby GC 工作原理的文章,但仍然无法理解,为什么在 ~5:30 AM 堆大小从 ~2.3M 跳到 3M ,而此时仍有 1M 空闲可用的堆插槽(GC 设置为默认设置)
类似行为,3:35PM:
所以,问题是:
- 如何使 Ruby 填充空闲堆槽而不是从 OS 请求新槽?
- 如何让它释放空闲堆槽给系统?
how to make Ruby fill free heap slots instead of requesting new slots from OS ?
您的图表没有 "full" 保真度。很多人认为 GC.stat 是由 Newrelic 或诸如此类的东西恰好在正确的时间调用的。
很可能您 运行 没有插槽,堆变大了,并且由于堆在 Ruby 中没有收缩,您陷入了有点臃肿的堆中。
为了减轻一些痛苦,您可以将 RUBY_GC_HEAP_GROWTH_MAX_SLOTS 限制在一个合理的数字,大约 100,000 就可以了,我正在尝试游说在此处设置默认值。
还有
创建 运行 作业的持久日志并对其计时 运行(持续时间等),在作业 运行 之前和之后收集 GC.stat =]s
按队列拆分作业,运行 1 个队列在一台服务器上,另一个队列在另一台服务器上,查看哪个队列和哪个作业对问题负责
使用 flamegraph 或其他分析工具分析您的各种作业
减少您 运行 作为实验的并发作业数量,或在某些作业类型之间放置互斥体。可能一次 1 "job a" 还可以,一次并发 20 个 "job a" 会膨胀内存。