Ruby GC执行超过每个请求约250-320ms

ran*_*its 13 ruby performance garbage-collection latency ruby-on-rails

我在rails应用程序上有一个ruby.我正在调查我的NewRelic门户网站的Apdex下降,我发现平均而言,GC执行花费了250-320ms.这是一个非常令人不安的数字.我在下面放了一个屏幕截图.

我的Ruby版本是:

ruby 1.9.3p194(2012-04-20修订版35410)[x86_64-linux]

任何调整这个的建议都是理想的.这个数字应该大大降低.

在此输入图像描述

Chr*_*ald 10

你在GC上花了那么多时间,因为你经常运行你的GC.默认情况下,Ruby设置适用于小脚本的GC参数,而不是大型应用程序.尝试使用以下环境参数设置启动您的应用:

RUBY_HEAP_MIN_SLOTS=800000
RUBY_FREE_MIN=100000
RUBY_GC_MALLOC_LIMIT=79000000
Run Code Online (Sandbox Code Playgroud)

这样做会增加初始堆分配大小并填充GC编号,使其不会经常运行.这可能会让您的应用程序使用更多的RAM,但它应该会大大减少在GC上花费的时间.在默认设置下,您可能每次请求多次运行GC; 你希望理想情况下每隔几次请求运行一次(甚至更好,在使用Unicorn的OOB :: GC之请求之间).

这些是我的应用程序的GC设置,您需要上下调整它们,因为它们最适合您的应用程序以找到正确的设置; 你正在寻找一个你不经常运行GC的中间地带,并且没有过多的内存使用量.这是特定于每个应用程序,所以没有样板建议我可以给出这些确切的设置应该是什么.从默认值(10k插槽,1.8倍增长因子)增加应立即产生影响,并且您可以从那里进行调整,以最适合您当前的情况.

有这些参数的完整writup 这里和更多的信息在这里,和而那些职位的REE 1.8.7写的,它们适用于红宝石1.9.2+为好.

这些是一些相当极端的数字,所以你可能在你的应用程序中做了一些事情,导致你分配比你应该多得多的内存,所以我鼓励你怀疑并梳理你的应用程序寻找过度 - 急切的分配.但是,GC环境变量应该有助于在任何情况下对情况进行分类.