我有一个
ruby在rails应用程序.我正在调查我的NewRelic门户中的Apdex下降,我看到平均来说,250-320ms的时间花在GC执行上.这是一个非常令人不安的数字.我已经在下面添加了一个屏幕截图.
我的Ruby版本是:
ruby 1.9.3p194(2012-04-20修订35410)[x86_64-linux]
任何调整建议都是理想的.这个数字应该大大降低.
解决方法
您在GC中花费了大量时间,因为您经常运行GC.默认情况下,Ruby设置适用于小脚本的GC参数,而不是大型应用程序.尝试使用以下环境参数设置启动您的应用程序:
RUBY_HEAP_MIN_SLOTS=800000 RUBY_FREE_MIN=100000 RUBY_GC_MALLOC_LIMIT=79000000
这将是增加初始堆分配大小和填充GC数字,使其不经常运行.这可能会让你的应用程序使用更多的RAM,但它应该大大减少在GC上花费的时间.在默认设置下,您可能每次请求多次运行GC;您希望理想地在每个请求(或更好的情况下,在类似于Unicorn’s OOB::GC的请求之间)运行它一次.
这些是我的应用程序的GC设置,您需要上下调整,最适合您的应用程序找到正确的设置;你正在枪打中间,你不经常运行GC,并且没有过多的内存使用.这是每个应用程序的特定的,但是,没有任何样板建议,我可以给出这些确切的设置应该是什么.从默认值(10k插槽,1.8倍增长因子)增加应该会立即产生影响,您可以从那里进行调整,最适合您当前的配置.
这些参数here及更多信息here有完整的写作,而这些帖子是为REE 1.8.7编写的,它们也适用于Ruby 1.9.2.
那些是一些相当极端的数字,所以可能你在你的应用程序中做了一些事情,导致你分配比你应用更多的RAM,所以我鼓励你怀疑,梳理你的应用程序,热心分配无论如何,GC环境变量应该有助于分解这种情况.