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


88

我有一个正在服务器上运行的Rails应用程序。当我进入远程桌面并尝试加载应用程序时,服务器会花费3-4分钟的时间来响应简单的HTML页面。但是,当我在服务器上本地加载页面时,该页面仅会显示一秒钟。我尝试从远程桌面ping服务器,并且在合理的时间内ping操作成功。

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


2
也许现在应该将其移至serverfault了?
Falken教授

不需要,只需修改配置文件中的一行即可解决
Mosty Mostacho 2012年

2
@AmigableClarkKant Webrick更多的是开发人员工具,因此最好还是继续使用。
大卫

天哪,我一直把问题归结为vmware,在地狱里烧坏了webrick :(
prusswan 2012年

Answers:


139

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

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

更换线

:DoNotReverseLookup => nil,

:DoNotReverseLookup => true,

重新启动webrick,它将像魅力一样起作用:)


21
工作了!当从本地网络中的另一台计算机上提供静态内容时,Webrick速度较慢时出现问题。这解决了。唯一的不同是config.rb位于:〜/ .rvm / rubies / ruby​​-1.9.2-p180 / lib / ruby​​ / 1.9.1 / webrick / config.rb-因为我们使用的是RVM。
Slobodan Kovacevic

顺便说一句,我没有那个钥匙,所以我只添加了它就可以了
生态2011年

您在哪里添加的?什么部分?
日安倍·佩特里罗


10
我拥有的ruby版本是ruby-1.8.7-p330,它似乎没有DoNotReverseLookup选项。字符串“ DoNotReverseLookup”不会出现在webrick的config.rb中或〜/ .rvm / rubies / ruby​​-1.8.7-p330 / lib / ruby​​ / 1.8中的任何位置。有什么好的方法可以在ruby-1.8.7-p330中解决此问题?
David Grayson

36

有同样的问题。对我来说,这个职位保留了解决方案。如果您使用的是Ubuntu,请停止(或卸载)avahi-daemonservice avahi-daemon stop停止守护程序。

Webrick现在感觉非常快。

这个问题在Rails Lighthouse中有一个旧的报告,但是从那时起,Ruby-on-Rails已将他们的票移到了github上。不幸的是,这个老问题仍然存在。

但是请注意,如果您实际使用 avahi-daemon某些东西(例如在网络上查找打印机和扫描仪),将无法再使用。


1
非常感谢!!它解决了我在Ubuntu 11.04 / 11.10 / 12.04上的问题
SMMousavi'5

1
好吧,这个答案似乎是我的无名英雄!
PCoder 2012年

1
这也为我做到了。在Ubuntu 13.04上运行OLD(1.8.7)应用程序
TerryS 2013年

1
这个解决方案实际上使我陷入麻烦,因为停止这样做会导致网络服务崩溃!检查以下网址forums.fedoraforum.org/showthread.php?t=124837
Isaiyavan Babu Karan

23

只是有同样的问题。的

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

也为我做了把戏。以防万一,您在rvm下运行ruby,这是要走的路:

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

1
谢谢!在找到答案之前,我搜索了.rvm,但没有找到webrick,然后将/ usr / lib更改为一个,但这没有帮助。这工作了。
B

@KenBarber可以肯定这不是一个好方向,但是为了有一个不错的小型开发周期,可以只对本地RVM安装进行此修改。顺便说一下,这只是您的用户个人资料,您不会打扰其他人……
Kjellski 2013年

1
@Kjellski也许您是对的,但是它不会通过升级持续存在,也不是您可以轻松地传递给其他开发人员的解决方案。在这种情况下,也许在Rails上放一个猴子补丁会更好地耸耸肩。无论如何,现在它已修复:github.com/rails/rails/commit/… ...
Ken Barber

15

现在,“ Thin”是在本地运行两者的绝佳选择 在Heroku上

在Heroku上:https://devcenter.heroku.com/articles/rails3#webserver

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

您可以通过在Gemfile中放入本地文件来使用它:

gem "thin"

...,然后运行bundle并使用thin start或启动服务器rails s

Heroku更新

现在,Thin被认为是Heroku 的错误选择。此处有更多信息:

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

他们的建议:

切换到并发Web后端,例如JRuby上的Unicorn或Puma,这将使dyno可以管理自己的请求队列并避免阻塞长请求。


通过不更改代码或系统中的任何内容的完美解决方案。
费尔南多·科什

事实证明,如果安装了Sinatra,它将自动使用Thin代替webrick。我要做的就是gem install thin。请参见sinatrarb.com/intro.html 。建议也运行gem install Thin,Sinatra将在可用的情况下进行安装。编辑:极大的性能改进。从1.3s到0.05s。
GuiSim 2014年

6

通过VPN访问WEBrick服务器时,我也遇到了类似的类似问题。请求将花费很长时间,大多数情况下,网络上什么都没有发生。由于Windows上的Ruby1.9 mongrelthingems都不起作用,而且我也无法让自己陷入从源代码进行编译的麻烦,因此我需要坚持使用WEBrick。

整个解决方案的配置参数设置DoNotReverseLookuptrue,创建WEBrick服务器时:

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


2

试图在1.8.7上使用webrick进行此操作,但找不到要更改的配置。但是,您可以使用的一种作弊方式是将正在尝试反向查找的IP地址添加到运行webrick的服务器的hosts文件中。


大。最好编辑一些每次更新后需要更改的webrick文件。
Petr 2012年

在我的情况下,要添加的条目(对于运行webrick的Linux来宾)将是Windows主机的ip地址
prusswan 2012年

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

查看资料


1

这是一个古老的问答线程,可帮助我:DoNotReverseLookup在本地开发虚拟机上解决此问题,并希望添加其他信息。该网页说明了 Ruby核心中的回归错误该错误导致某些人出现此问题。重点是我的;长此以往,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标志相同。因此,除非DoNotReverseLookup => true在WEBrick配置中具有:,否则将始终对每个新连接进行反向DNS查找,从而可能导致严重的延迟。

与该发现相关的是作者的GitHub拉取请求,提出了如何修复Ruby WEBrick源代码中的问题:修复WEBrick的:DoNotReverseLookup配置选项实现#731中的回归错误。

请求中概述的解决方案是从中更改第181行lib/webrick/server.rb

sock.do_not_reverse_lookup = config[:DoNotReverseLookup]

对此:

unless config[:DoNotReverseLookup].nil?

如果有人偶然发现了这个广受好评的问题/答案线程,并且对在Ruby core中解决此问题的进展感兴趣,请在此处共享。希望在下一个版本的Ruby中可以合并此请求,或者以某种方式解决潜在的问题。也许是2.1.6?


0

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

用杂种代替WEBrick。我必须使用预发行版本,否则将无法安装:

sudo gem install mongrel --pre

然后将其添加到我的Gemfile中进行开发:

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


0

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

sudo iptables -F
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.