gpt4 book ai didi

容器中的 Ruby OOM

转载 作者:IT老高 更新时间:2023-10-28 21:37:12 24 4
gpt4 key购买 nike

最近我们在 Docker 容器中遇到了 Ruby 的问题。尽管负载非常低,但应用程序往往会消耗大量内存,并且在提到的一段时间后会出现 OOM。

经过一番调查,我们将问题缩小到单线

docker run -ti -m 209715200 ruby:2.1 ruby -e 'while true do array = []; 3000000.times do array << "hey" end; puts array.length; end;'

在某些机器上它在启动后不久就 OOMed(由于超出限制而被 oom-killer 杀死),但在某些机器上它可以工作,虽然很慢,但没有 OOM。似乎(只是似乎,也许不是这样)在某些配置中,ruby 能够推断出 cgroup 的限制并调整它的 GC。

测试的配置:

  • CentOS 7、Docker 1.9 — OOM
  • CentOS 7、Docker 1.12 — OOM
  • Ubuntu 14.10、Docker 1.9 — OOM
  • Ubuntu 14.10、Docker 1.12 — OOM
  • MacOS X Docker 1.12 — 无 OOM
  • Fedora 23 Docker 1.12 — 无 OOM

如果你看一下 ruby​​ 进程的内存消耗,在所有情况下它的行为都与这张图相似,保持在略低于限制的同一水平,或者崩溃到限制并被杀死。

Memory consumption plot

我们希望不惜一切代价避免 OOM,因为它会降低弹性并带来丢失数据的风险。应用程序真正需要的内存远低于限制。

对于如何处理 ruby​​ 以避免 OOMing(可能会降低性能),您有什么建议吗?

我们无法弄清楚测试安装之间的显着差异是什么。

编辑:更改代码或增加内存限制不可用。第一个是因为我们使用我们无法控制的社区插件运行流畅,第二个是因为它不能保证我们将来不会再遇到这个问题。

最佳答案

您可以尝试tweak通过环境变量进行 rubies 垃圾回收(取决于您的 ruby​​ 版本):

RUBY_GC_MALLOC_LIMIT=4000100
RUBY_GC_MALLOC_LIMIT_MAX=16000100
RUBY_GC_MALLOC_LIMIT_GROWTH_FACTOR=1.1

或通过 GC.start 手动调用垃圾回收

对于你的例子,试试

docker run -ti -m 209715200 ruby:2.1 ruby -e 'while true do array = []; 3000000.times do array << "hey" end; puts array.length; array = nil; end;'

帮助垃圾收集器。

编辑:

我没有可与您相比的环境。在我的机器(14.04.5 LTS,docker 1.12.3,RAM 4GB,Intel(R) Core(TM) i5-3337U CPU @ 1.80GHz)上看起来很有希望。

docker run -ti -m 500MB  -e "RUBY_GC_MALLOC_LIMIT_GROWTH_FACTOR=1" \
-e "RUBY_GC_MALLOC_LIMIT=5242880" \
-e "RUBY_GC_MALLOC_LIMIT_MAX=16000100" \
-e "RUBY_GC_HEAP_INIT_SLOTS=500000" \
ruby:2.1 ruby -e 'while true do array = []; 3000000.times do array << "hey" end; puts array.length; puts `ps -o rss -p #{Process::pid}`.chomp.split("\n").last.strip.to_i / 1024.0 / 1024 ; puts GC.stat; end;'

但是每个 ruby​​ 应用程序都需要不同的设置来进行微调,如果您遇到内存泄漏,那您就输了。

关于容器中的 Ruby OOM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40268749/

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