最近国外的一个同行Bryan Liles做过一个对RubyEE下执行测试的的评测:
未调优前:
- 410 scenarios (410 passed)
- 3213 steps (3213 passed)
- 9m29.685s
调优后:
- 410 scenarios (410 passed)
- 3213 steps (3213 passed)
- 5m58.661s
差距怎么这么大呢?
可以去看看REE官方文档关于GC性能调整的章节。只需要设置5个参数,我们也可以得到上面的效果:
- export RUBY_HEAP_MIN_SLOTS=1000000
- export RUBY_HEAP_SLOTS_INCREMENT=1000000
- export RUBY_HEAP_SLOTS_GROWTH_FACTOR=1
- export RUBY_GC_MALLOC_LIMIT=1000000000
- export RUBY_HEAP_FREE_MIN=500000
下面我们来解释一下这些变量的意义:
RUBY_HEAP_MIN_SLOTS
This specifies the initial number of heap slots. The default is 10000.
专门声明堆栈的初始数据的,默认是10000.
这个默认配置太小了。因为我们测试可能用到更多的堆,所以我们把它设置的大点。这就意味着我们要消耗更多的内存。
RUBY_HEAP_SLOTS_INCREMENT
The number of additional heap slots to allocate when Ruby needs to allocate new heap slots for the first time. The default is 10000.
For example, suppose that the default GC settings are in effect, and 10000 Ruby objects exist on the heap (= 10000 used heap slots). When the program creates another object, Ruby will allocate a new heap with 10000 heap slots in it. There are now 20000 heap slots in total, of which 10001 are used and 9999 are unused.
当Ruby需要开辟一片新的堆栈所需的数,默认是10000.
例如, 假如实际堆栈就只有默认配置的那么多,有10000个Ruby对象已经占满了堆栈, 当你的程序创建另一个对象的时候, Ruby会分配一个新的堆,包含10000个栈。 那么现在就一共有20000 个堆栈, 其中有10001个是被占的, 而有9999空闲。
从这里我们可以看出来, 当所有的桟都被耗尽,一片新的桟会被开辟出来。 默认配置的数字太低了,可能时不时的开辟堆,所以上面的配置把它增加了100倍。
RUBY_HEAP_SLOTS_GROWTH_FACTOR
Multiplicator used for calculating the number of new heaps slots to allocate next time Ruby needs new heap slots. The default is 1.8.
Take the program in the last example. Suppose that the program creates 10000 more objects. Upon creating the 10000th object, Ruby needs to allocate another heap. This heap will have 10000 * 1.8 = 18000 heap slots. There are now 20000 + 18000 = 38000 heap slots in total, of which 20001 are used and 17999 are unused.
The next time Ruby needs to allocate a new heap, that heap will have 18000 * 1.8 = 32400 heap slots.
当ruby需要新的堆栈的时候, 此参数做为一个乘数被用来计算这片新的堆栈的大小。
拿上个例子来说, 假设程序又创建了10000个对象。Ruby需要分配另一个堆。这个堆将会是这么多堆栈:
10000 * 1.8 = 18000。 那么这里一共就有20000+18000个堆栈, 其中有20001个被用,而有17999个空闲。
RUBY_GC_MALLOC_LIMIT
The amount of C data structures which can be allocated without triggering a garbage collection. If this is set too low, then the garbage collector will be started even if there are empty heap slots available. The default value is 8000000.
这是不触发垃圾回收的C数据结构的数量。如果它设置的太低就会触发垃圾回收,即使还有很多可用的空闲堆栈。默认是8000000.
RUBY_HEAP_FREE_MIN
The number of heap slots that should be available after a garbage collector run. If fewer heap slots are available, then Ruby will allocate a new heap according to the RUBY_HEAP_SLOTS_INCREMENTand RUBY_HEAP_SLOTS_GROWTH_FACTOR parameters. The default value is 4096.
在垃圾回收运行以后可用的堆栈数。 如果可用的堆栈太少, 那么Ruby会按照UBY_HEAP_SLOTS_INCREMENT 和RUBY_HEAP_SLOTS_GROWTH_FACTOR的配置参数分配一个新的堆。默认是4096.
值得注意的是,以上的配置请不要在生产环境下使用。 当然你可以参考37signals 和 Twitter 提供的REE配置来调优你的应用。
37signals 在生产环境的配置:
RUBY_HEAP_MIN_SLOTS=600000
RUBY_GC_MALLOC_LIMIT=59000000
RUBY_HEAP_FREE_MIN=100000
Twitter 用在生产环境的配置:
RUBY_HEAP_MIN_SLOTS=500000
RUBY_HEAP_SLOTS_INCREMENT=250000
RUBY_HEAP_SLOTS_GROWTH_FACTOR=1
RUBY_GC_MALLOC_LIMIT=50000000
关于Twitter配置的说明:
*
Start with enough memory to hold the application (Ruby’s default is very low, lower than what a Rails application typically needs).
*
让你的应用保持足够的内存(Ruby默认的非常低, 低于典型Rails应用所需)
*
Increase it linearly if you need more (Ruby’s default is exponential increase).
*
如果你需要更多堆栈,请保证它线性增长(Ruby默认的是指数级增长)
*
Only garbage-collect every 50 million malloc calls (Ruby’s default is 6x smaller).
*
每5000万个malloc被调用才启动垃圾回收(Ruby默认的数比这个数小6倍)
分享到:
相关推荐
4. **Enterprise Features(企业级特性)**:REE还包含了一些额外的库和工具,如 Passenger(又名Mod_Ruby,一个流行的Ruby on Rails部署解决方案),这些工具和库旨在简化服务器部署和管理,提高生产环境的稳定性。...
REE 元素配分模式图的绘制 REE 元素配分模式图是地质学中一种重要的研究手段,用于分析和描述地质样品中的稀土元素组成和变化规律。REE 配分模式图的绘制可以帮助研究人员更好地理解地质样品的地球化学特征和演化...
Ruby企业描述从 Phusion 安装 Ruby 企业版 (REE)。要求食谱: build-essential - 获取编译器和相关文件属性node['ruby_enterprise']['install_path'] - 安装 REE 的位置。 默认 /opt/ruby-enterprise node['ruby_...
我们研究了由一维硬核连续气体引起的二连通图c的第二Mayer权重ωM(c)和Ree-Hoover权重ωRH(c)。 使用与图c自然相关的凸多面体的有符号体积来计算这些权重。 在当前的工作中,我们使用图同态的方法,为特殊的2个...
要求 宝石经过以下测试: Ruby (MRI) 2.0.0 Ruby (MRI) 1.9.3 Ruby (MRI) 1.9.2 Ruby (MRI) 1.8.7 Ruby (REE) 1.8.7 JRuby 1.7.2 鲁比尼乌斯 1.2.4安装 gem install identifier例子 Identifier . generate # "CFAA3C...
通过与Hino、TRW、NSK、MUSASHI、Tenneco、KYB和Iochpe-Maxion等多家行业领先企业建立战略伙伴关系,REE正不断优化其电动汽车平台,使其更加完善并符合全球安全标准。 综上所述,REE Automotive的创新平台代表了...
由于基质效应,在充满... 该信息对于校正岩石样品对更高质量数REE的峰干扰至关重要,因此开发了方程式以使用测得的CeO / Ce和CeOH / Ce之比来预测REE套件中任何其他成员的此类值。 所获得的浓度与国际参考材料特别是
此 Ruby SDK 适用于 Ruby 1.8.x, 1.9.x, jruby, rbx, ree 版本,基于 七牛云存储官方API 构建。使用此 SDK 构建您的网络应用程序,能让您以非常便捷地方式将数据安全地存储到七牛云存储上。无论您的网络应用是一个...
标题中的"PyPI 官网下载 | ree-2.2.2.tar.gz"表明这是一个在Python Package Index(PyPI)官方源上发布的软件包,名为"ree",版本为2.2.2,其打包格式是tar.gz。PyPI是Python开发者发布和管理他们自己创建的Python库...
知识点一:稀土元素(REE)及其地球化学特性 稀土元素是指周期表中从镧(La)到镥(Lu)的15个镧系元素,此外还包括钪(Sc)和钇(Y),在自然界中常呈三价状态。稀土元素具有相似的化学性质,这使得它们在许多地质...
我们研究了在不完全气体的情况下,Mayer理论和Ree-Hoover理论自然发生的图权,用于病毒式膨胀。 对于一维硬核连续气体,我们特别注意2连通图的Mayer权重和Ree-Hoover权重。 这些权重是根据与图形关联的凸多面体的有...
变步长AP-REE算法是一种在信号处理领域常用的算法,主要用于自适应滤波器的调整过程,以实现噪声或干扰的抑制。AP-REE算法(Affine Projection Algorithm Using Regressive Estimated Error)基于最小均方(LMS)...
npm install ree-validate --save 纱 yarn add ree-validate 入门 import ReeValidate from 'ree-validate' 安装类名以轻松管理类 npm i -S classnames import classnames from 'classnames' 现在创建一个新类,并...
Resque 是一个 Redis 支持的 Ruby 库,用于... Resque worker 可以分布在多台机器之间,支持优先级,对内存膨胀/“泄漏”有弹性,针对 REE 进行了优化(但在 MRI 和 JRuby 上工作),告诉你他们在做什么,并预期失败。
支持旧版本:Rails 2/3/4,Ruby 1.9 +,REE,带有RubyBench补丁的Ruby 1.8。 建立 滑轨5 在Rails 5(以及Rails 3和4)上,将其添加到config/application.rb的顶部: require 'trashed/railtie' 并在您的应用程序...
很棒的Ruby CLI应用程序 Ruby中很棒的命令行应用程序的精选列表。 您知道真棒的Ruby CLI应用程序吗? 伟大的。 将其贡献给列表! 但首先,请阅读。 内容 包装管理 ... 很棒的Ruby CLI ... rubycritic-使用Ree
调整了质谱仪的分析环境和操作模式,以检测PGE Penikat层状侵入体(芬兰)中的黄铁矿和Talnakh矿床(俄罗斯Norilsk地区)中的黄铜矿,以检测硫化物矿物中的REE。 黄铁矿中的总REE含量约为。 3.5 ppm,足以定义黄铁...
【标题】和【描述】提及的是On2 Technologies与韩国Boo-Ree公司的合作,他们在Tachyon-I多媒体处理器中集成了On2视频播放功能。这个合作使得Tachyon-I处理器能够在各种设备上,如手机、个人媒体播放器和电视机顶盒上...