有没有办法只针对特定参数的存根方法.像这样的东西
boss.stub(:fire!).with(employee1).and_return(true)
Run Code Online (Sandbox Code Playgroud)
如果任何其他员工被传递给boss.fire!方法,我会得到boss received unexpected message错误,但我真正想要的只是覆盖特定参数的方法,并留给所有其他人.
有什么想法可以做到这一点?
我有一个工作进程,它产生多达50个线程并执行一些异步操作(大多数是http调用).当我启动该过程时,它从大约35MB的已用内存开始,并迅速增长到250MB.从那时起它进一步增长,问题是内存永远不会停止增长(即使增长阶段随着时间的推移而减少).几天后,进程只会超出可用内存并崩溃.
我做了很多分析和分析,似乎无法找到问题所在.即使堆大小非常不变,进程内存也在不断增长.我已将GC.stat输出收集到您可以在此处访问的电子表格中:
https://docs.google.com/spreadsheets/d/17TohDNXQ_MXM31CeAmR2ptHFYfvOeF3dB6WCBkBS_Bc/edit?usp=sharing
即使过程内存最终稳定在415MB,但它将在接下来的几天内持续增长,直到达到512MB的限制并崩溃.
我也尝试使用对象空间跟踪对象,但跟踪对象的内存总和从不超过70-80MB,这与GC报告完全一致.剩余的300MB +(和不断增长的)花在哪里..我不知道.
如何处理这类问题?是否有任何工具可以让我更清楚地了解内存的使用方式?
更新:宝石和操作系统
我正在使用以下宝石:
gem "require_all", "~> 1.3"
gem "thread", "~> 0.1"
gem "equalizer", "~> 0.0.9"
gem "digest-murmurhash", "~> 0.3", require: "digest/murmurhash"
gem "google-api-client", "~> 0.7", require: "google/api_client"
gem "aws-sdk", "~> 1.44"
Run Code Online (Sandbox Code Playgroud)
该应用程序部署在heroku上,但在Mac OS X 10.9.4上本地运行时,内存泄漏是显而易见的.
更新:泄漏
我已经升级了stringbuffer并分析了所有像@mtm建议的内容,现在没有leak工具识别的内存泄漏,随着时间的推移没有增加ruby堆大小,然而,进程内存仍在增长.最初我认为它在某些时候停止了增长,但几个小时之后它就超过了极限并且过程崩溃了.
当我net/http在开发中工作时,它非常慢.我已经安装了net-http-spygem以获取有关每个请求的一些信息,我发现"打开连接"部分占用的时间最多(超过10秒).此外,它不会使连接保持活动状态,因此需要在每次请求时重新打开它.
opening connection to maps.google.com...
# ~10 seconds
opened
Run Code Online (Sandbox Code Playgroud)
有什么方法可以net/http通过设置一些默认值来以某种方式提高库的性能?我不想要一个特定于请求的修复,但是需要一些可以解决全局问题的方法.我正在使用geokitgem在curent项目中,我不能改变它在内部处理请求的方式,除了知道它正在使用net/http,并且它在生产(Heroku)上工作得很好但在开发中非常慢.
我在Mac OS X Lion上使用ruby 1.9.2-p290.使用rbenv安装和管理Ruby.
以下是示例代码:
require 'net/http'
require 'uri'
time = Time.now.to_i
uri = URI.parse("http://maps.google.com/maps/geo?q=Chicago&output=xml&oe=utf-8")
Net::HTTP.get(uri)
puts (Time.now.to_i - time)
Net::HTTP.get(uri)
puts (Time.now.to_i - time)
Run Code Online (Sandbox Code Playgroud)
我放在哪里的URL并不重要.每个请求总是需要10秒钟.
Heroku最近减少了与生产数据库的可用连接数(从500到60).打开的连接消耗大量内存并导致问题,因此这似乎是朝着正确方向迈出的一步.
我的应用程序有超过100个并发进程,它们同时访问数据库.Heroku建议使用https://github.com/gregburek/heroku-buildpack-pgbouncer来解决此问题.
我无法找到关于如何做到这一点的适当指南.我能够安装并启用buildpack,但我不知道这些配置变量的作用以及它们如何工作.使用默认配置,我会遇到大量ActiveRecord::ConnectionTimeoutError错误.
有没有人有这方面的经验,如果可以请提供有关如何正确执行此操作以及如何配置需要配置的所有内容的分步指南?