gpt4 book ai didi

ruby - Sidekiq 在工作人员完成后不释放内存

转载 作者:数据小太阳 更新时间:2023-10-29 06:26:10 27 4
gpt4 key购买 nike

我有大约 6 个 Sidekiq worker 执行 JSON 爬行。根据端点的数据集大小,它们在 1 分钟到 4 小时之间完成。特别是,观看需要 4 小时的长视频,我发现随着时间的推移,内存有非常轻微的增加。

这不是问题,直到我想再次安排相同的 worker 作业。内存不会被释放并堆积起来,直到我遇到 Linux OOM Killer,它摆脱了我的 Sidekiq 进程。

内存泄漏?我观察了 ObjectSpace 中不同对象的数量:

ObjectSpace.each_object.inject(Hash.new(0)) { |count, o| count[o.class] += 1 }

那里并没有真正增加,哈希集、数组等保持不变,垃圾收集器清除了短期增加,gc.stat[:count] 告诉我,垃圾收集器也在工作。

即使在 worker 完成之后,例如我得到了 [Done] 记录,没有 worker 再忙了,内存没有被释放。原因何在?我可以做些什么来反对这个吗?编写终结器?

唯一的当前解决方案:重新启动 Sidekiq 进程。

我在使用 Ruby 2.0.0 并使用 Ruby MRI。


对于 JSON 解析,我使用 Yajl ,因此是 C 绑定(bind)。我需要它,因为它似乎是唯一能够正确实现流式读取和写入的快速 JSON 解析器。

最佳答案

编写 Sidekiq 的

Mike Perham 在这里解决了这个问题:http://www.mikeperham.com/2009/05/25/memory-hungry-ruby-daemons/

tl;dr 版本:MRI 不会归还内存,您最多只能控制堆,要做到这一点,Ruby Enterprise Edition有人建议。

不知道这有什么帮助,但情况就是这样 - 直接来自马口。

关于ruby - Sidekiq 在工作人员完成后不释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18978396/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com