Wol*_*old 11
事实证明,我们的问题是由我们自己的自定义Resque.before_fork和Resque.after_fork处理程序引起的.
NewRelic的RPM gem将自动设置钩子Resque.before_fork并Resque.after_fork为工人建立通信渠道.作为Resque的限制,它仅运行最后分配的块/ Proc到before_fork和after_fork挂钩.因此,如果您有自己的自定义before_fork/after_fork挂钩,则必须*手动设置代理的通信通道,例如在config/initializers/custom_resque.rb文件中:
Resque.before_fork do |job|
NewRelic::Agent.register_report_channel(job.object_id)
# extra custom stuff here
end
Resque.after_fork do |job|
NewRelic::Agent.after_fork(:report_to_channel => job.object_id)
# extra custom stuff here
end
Run Code Online (Sandbox Code Playgroud)
此代码直接取自RPM gem的文件 gems/newrelic_rpm-3.5.0/lib/new_relic/agent/instrumentation/resque.rb
RPM bug更新12/27/2012:在部署上述技术后,我们发现RPM gem在分叉模式下使用时会泄漏文件句柄(例如Resque).我们观察到了那种错误信息ActiveRecord::StatementInvalid: ArgumentError: too large fdsets: SET client_min_messages TO ''.经过大量挖掘后,我们发现这些是在ActiveRecord尝试打开数据库连接时引起的,因为文件描述符的数量已经耗尽.New Relic确认在对解释计划进行抽样时代理中存在错误.当运行大量连接到数据库的Resque作业时,会发生这种情况.
错误更新2013年1月28日:经过多次努力,我们发现这个错误是由与resque-lonely_job gem 的不支持的交互引起的,该gem使用Resque的before_perform钩子,可能会停止Resque作业并发生Resque::Job::DontPerform异常.在这种情况下,RPM客户端无法正常清理并泄漏文件描述符.New Relic已被告知并正在努力修复.
错误更新4/10/2013:这已得到修复.我们使用3.6.0.78并处理这种情况.没有更多的文件描述符泄漏!谢谢New Relic.
| 归档时间: |
|
| 查看次数: |
3337 次 |
| 最近记录: |