Rails 3.2 性能优化记录

将一个项目从[url=http://quake.iteye.com/blog/1445681]rails2.3+ruby1.8升级到rails3.2+ruby1.9[/url] 之后,性能测试发现原先平均500ms的请求,变成了750ms,性能损失达到了50%,经过一些性能优化以后,改善到了400ms左右,记录一下优化的3个地方。

[size=large]1. GC调整[/size]

根据一些资料,Rails3.2的call stack比2.3深了N多层,导致GC会变得更加频繁,所以首先针对GC做profile,对比升级前后的数据:

class BrowsingTest < ActionDispatch::PerformanceTest
self.profile_options = { :runs => 20, :metrics => [:wall_time, :memory, :gc_time, :gc_runs], :output => 'tmp/performance', :formats => [:flat] }
#...
end


rake test:profile
gc_time: 465 ms
gc_runs: 3

而在2.3,20次相同performance profile test,gc_runs是1,这说明了Rails 3.2确实比2.3 GC要频繁,相应的GC参数需要进行调整,这个是调整后的参数(和2.3相比,要加大RUBY_GC_MALLOC_LIMIT):

export RUBY_HEAP_MIN_SLOTS=620000
export RUBY_FREE_MIN=100000
export RUBY_GC_MALLOC_LIMIT=62000000

具体的值根据应用不同,可以进行微调,再跑rake test:profle可以得出适合你应用的合理值,另外,推荐用rvm,这样对不同应用配置不同的参数,上面的参数设置可以在rvm env文件里面配置:
~/.rvm/environments/ruby-1.9.2-xxx

[size=large]2. Cache调整[/size]

在搜索GC资料的时候,看到了一篇关于Memcached client的博客[url=http://www.mikeperham.com/2010/09/19/dalli-performance-and-garbage-collection/]http://www.mikeperham.com/2010/09/19/dalli-performance-and-garbage-collection/[/url]

因为我们的应用使用Memcached操作比较多,平均每个页面有8次左右的Memcached操作,改了一下配置,使用dalli和kgio:

# Gemfile
gem 'dalli', :git => 'https://github.com/mperham/dalli.git'
gem 'kgio'

# config/environments/production.rb
config.cache_store = :dalli_store, 'memcached_server'



[size=large]3. Rack 中间件调整[/size]

在GC调整里面说到的call stack变多的ppt在这里:[url=http://www.slideshare.net/tenderlove/railsconf-2011-keynote]http://www.slideshare.net/tenderlove/railsconf-2011-keynote[/url],主要是rake middleware造成,在Rails 3.2项目下运行rake middleware,可以发现和2.3相比,多了N的middleware:

use Rack::Cache
use Rack::Lock
use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x8f4f210>
use Rack::Runtime
use Rack::MethodOverride
use ActionDispatch::RequestId
use Rails::Rack::Logger
use ActionDispatch::ShowExceptions
use ActionDispatch::DebugExceptions
use ActionDispatch::RemoteIp
use ActionDispatch::Callbacks
use ActiveRecord::ConnectionAdapters::ConnectionManagement
use ActiveRecord::QueryCache
use ActionDispatch::Cookies
use ActionDispatch::Session::CookieStore
use ActionDispatch::Flash
use ActionDispatch::ParamsParser
use ActionDispatch::Head
use Rack::ConditionalGet
use Rack::ETag
use ActionDispatch::BestStandardsSupport
run Rails32::Application.routes


其实对于我们的应用来说,很多都是不需要的,比如整页Cache/ETag/X-Request-Id等,我们的应用都是动态请求,所以都是强制无Cache,我列了一下可以去除的和他们的用途:

Rack::Cache 整页缓存
Rack::Runtime 记录X-Runtime(方便客户端查看执行时间)
ActionDispatch::RequestId 记录X-Request-Id(方便客户端查看请求具体在集群中的哪台执行)
ActionDispatch::RemoteIp 防止IP伪造(可以在web server上做)
ActionDispatch::Callbacks 设置callback
Rack::ConditionalGet 设置If-None-Match and If-Modified-Since
Rack::ETag 设置ETag
ActionDispatch::BestStandardsSupport 设置X-UA-Compatiblecd(可以在web server上做)


写一个initializer,去除掉这些不必要的中间件。

整个优化的重点就是减少GC,希望Rails 4能够更加精简,希望Ruby 2.0的GC能够有更好的性能。
【无人机】基于改进粒子群算法的无人机路径规划研究[和遗传算法、粒子群算法进行比较](Matlab代码实现)内容概要:本文围绕基于改进粒子群算法的无人机路径规划展开研究,重点探讨了在复杂环境中利用改进粒子群算法(PSO)实现无人机三维路径规划的方法,并将其与遗传算法(GA)、标准粒子群算法等传统优化算法进行对比分析。研究内容涵盖路径规划的多目标优化、避障策略、航路点约束以及算法收敛性和寻优能力的评估,所有实验均通过Matlab代码实现,提供了完整的仿真验证流程。文章还提到了多种智能优化算法在无人机路径规划中的应用比较,突出了改进PSO在收敛速度和全局寻优方面的优势。; 适合人群:具备一定Matlab编程基础和优化算法知识的研究生、科研人员及从事无人机路径规划、智能优化算法研究的相关技术人员。; 使用场景及目标:①用于无人机在复杂地形或动态环境下的三维路径规划仿真研究;②比较不同智能优化算法(如PSO、GA、蚁群算法、RRT等)在路径规划中的性能差异;③为多目标优化问题提供算法选型和改进思路。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注算法的参数设置、适应度函数设计及路径约束处理方式,同时可参考文中提到的多种算法对比思路,拓展到其他智能优化算法的研究与改进中。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值