Webrick的回应非常缓慢。如何加快速度?

时间:2009-07-21 00:46:27

标签: ruby-on-rails oracle sqlplus webrick

我有一个Rails应用程序,我正在我的服务器上运行。当我转到远程桌面并尝试加载应用程序时,服务器需要3-4分钟才能响应一个简单的HTML页面。但是,当我在服务器上本地加载页面时,页面只会在一秒钟内显示。我尝试从远程桌面ping服务器,ping在合理的时间内成功。

在安装了Oracle的基本客户端和SQLPLUS后,这一切似乎已经开始了。我应该怀疑甲骨文吗?有没有人经历过类似的事情?

12 个答案:

答案 0 :(得分:140)

在这里遇到同样的问题(甚至一年后)。在linux下,您必须执行以下操作:

查找文件/usr/lib/ruby/1.9.1/webrick/config.rb并进行编辑。

替换

:DoNotReverseLookup => nil,

:DoNotReverseLookup => true,

重新启动webrick,它会像魅力一样工作:)

答案 1 :(得分:36)

有同样的问题。对我来说,this post持有解决方案。如果您使用的是Ubuntu,请停止(或卸载)avahi-daemonservice avahi-daemon stop停止守护进程。

Webrick现在感觉非常快速。

问题有一个old report in Rails Lighthouse,但是Ruby-on-Rails从那时起已经移动了their tickets to github;不幸的是,这个老问题仍然存在。

请注意,如果您实际上使用 avahi-daemon来处理某些内容,例如网络上的finding printers and scanners,那将无法使用。

答案 2 :(得分:23)

刚遇到同样的问题。在

...
:DoNotReverseLookup => true,
...

也为我做了伎俩。 万一你在rvm下运行ruby,这里有路径:

~/.rvm/rubies/ruby-<version>/lib/ruby/<version>/webrick/config.rb

答案 3 :(得分:15)

&#34;薄&#34;现在是运行本地和Heroku 的绝佳选择:

<德尔> 在Heroku上: https://devcenter.heroku.com/articles/rails3#webserver

网站: http://code.macournoyer.com/thin/

您可以通过放入Gemfile在本地使用它:

gem "thin"

...然后运行捆绑包并使用thin startrails s启动您的服务器。

Heroku更新

瘦身现在被认为是Heroku的选择。更多信息:

https://blog.heroku.com/archives/2013/4/3/routing_and_web_performance_on_heroku_a_faq

他们的建议:

  

切换到JRuby上的Unicorn或Puma等并发Web后端,允许dyno管理自己的请求队列,避免长时间请求阻塞。

答案 4 :(得分:6)

我有一个模糊的类似问题,在通过VPN访问WEBrick服务器时表现出来。请求将花费很长时间,其中大部分都没有发生任何事情。 既然mongrelthin宝石在Windows上都不能与Ruby1.9一起工作,而且我无法卷入编译源代码的东西,我需要坚持使用WEBrick。

修复是在创建WEBrick服务器时将配置参数DoNotReverseLookup设置为true

server = HTTPServer.new {:DoNotReverseLookup => true, ...}

答案 5 :(得分:5)

您可以使用Apache或安装Thin。在您的Gemfile中:gem 'thin'

或者您可以查看web-servers for rails的列表。

答案 6 :(得分:2)

尝试使用webrick在1.8.7上执行此操作,但无法找到要更改的配置。但是,你可以使用的作弊是添加到正在运行的服务器的hosts文件webrick它试图反向查找的ip地址..

答案 7 :(得分:2)

我经常与Sinatra经历10秒的延迟。这个片段为我解决了。

将其添加到app.rb文件

的顶部附近
class Rack::Handler::WEBrick
    class << self
        alias_method :run_original, :run
    end
    def self.run(app, options={})
        options[:DoNotReverseLookup] = true
        run_original(app, options)
    end
end

请参阅source

答案 8 :(得分:1)

这是一个老问答线程,它帮助我解决了本地开发虚拟机上的:DoNotReverseLookup问题,并希望添加其他信息。 Ruby核心中的This web page explains the regression error会导致某些问题出现;重点是我的;所有这一切的缺点是有一个GitHub请求Ruby核心修复这个,希望它将被批准并合并在很快发布的Ruby中:

  

经过几个小时的故障排除后,原来是这样!   显然,在Ruby的标准库的演变过程中   1.8.6到2.0.0,WEBrick获得了一个新配置选项:DoNotReverseLookup,默认设置为nil。然后,在深处   WEBrick的请求处理代码的内容,它设置了   传入连接套接字实例上的do_not_reverse_lookup标志   到config[:DoNotReverseLookup]的值。 由于此值为nil,   这是假的,效果与设置为false相同,   覆盖全局Socket.do_not_reverse_lookup标志。所以,除非   你的WEBrick配置中有:DoNotReverseLookup => true,反向   可能会对每个新连接进行DNS查找   导致严重的延迟。

与此发现相关的是a GitHub pull request from the author,提出如何修复Ruby WEBrick源代码中的问题:Fix regression bug in WEBrick's :DoNotReverseLookup config option implementation #731

请求中列出的解决方案是更改lib/webrick/server.rb中的第181行:

sock.do_not_reverse_lookup = config[:DoNotReverseLookup]

对此:

unless config[:DoNotReverseLookup].nil?

如果有人偶然发现这个备受好评的问题/答案线程并且对在Ruby核心中解决此问题的进展感兴趣,请在此处分享。希望这个拉动将被合并,或者在下一个Ruby版本中以某种方式处理底层问题;也许2.1.6?

答案 9 :(得分:0)

在我的可能罕见的情况下,它在刷新我的iptables后起作用,这没有任何副作用,因为我没有任何自定义规则(只是默认的Ubuntu允许所有):

sudo iptables -F

答案 10 :(得分:0)

这是一个非常晚的答案,但我花了大部分时间调试这个问题,Rails在Vagrant上运行。更改反向DNS查找实际上并没有改善请求时间。在开发模式下,我的页面加载从大约20秒到大约3秒的组合:

用mongrel替换WEBrick。我不得不使用预发布版本,否则它将无法安装:

sudo gem install mongrel --pre

然后将其添加到我的Gemfile for dev:

group :test, :development do
  gem 'mongrel'
end

然后开始我的服务器:

rails server mongrel -e development

关闭了几秒钟,5秒或6秒,但它仍然非常缓慢。 这是锦上添花 - 将此添加到Gemfile中:

group :development do
  gem 'rails-dev-boost', :git => 'git://github.com/thedarkone/rails-dev-boost.git'
end

答案 11 :(得分:0)

ruby​​ 1.8.x webrick中没有DoNotReverseLookup选项。解决方案是:

Socket.do_not_reverse_lookup = true

脚本开头的某个地方。

来源:WEBrick and Socket.do_not_reverse_lookup: A Tale in Two Acts