Webrick 的响应速度很慢。如何加快速度?

Posted

技术标签:

【中文标题】Webrick 的响应速度很慢。如何加快速度?【英文标题】:Webrick is very slow to respond. How to speed it up? 【发布时间】:2010-11-12 12:11:19 【问题描述】:

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

这一切似乎都是在我安装了 Oracle 的基本客户端和 SQLPLUS 之后开始的。我应该怀疑甲骨文吗?有没有人遇到过类似的情况?

【问题讨论】:

也许现在应该将其移至 serverfault? 不用了,只要在配置文件中修改一行即可解决 @AmigableClarkKant Webrick 更像是一个开发者工具,所以最好继续使用 SO。 天哪,一直以来我都将问题归咎于 vmware,烧死 webrick :( 【参考方案1】:

这里有同样的问题(甚至一年后)。在linux下你必须做以下事情:

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

换行

:DoNotReverseLookup => nil,

:DoNotReverseLookup => true,

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

【讨论】:

成功了!从本地网络中的另一台计算机提供静态内容时,Webrick 速度很慢。这解决了它。唯一的区别是 config.rb 位于:~/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/webrick/config.rb - 因为我们使用的是 RVM。 顺便说一句,我没有那个密钥,所以我只是添加它并且它有效 你在哪里添加的?什么部分? 根据ruby-doc.org/stdlib/libdoc/webrick/rdoc/classes/WEBrick/…应该在General部分。 我拥有的 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 中有什么好的方法可以解决这个问题吗?【参考方案2】:

遇到了同样的问题。对我来说,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,那将不再有效。

【讨论】:

非常感谢!!它解决了我在 Ubuntu 11.04/11.10/12.04 上的问题 嗯,这个答案对我来说似乎是无名英雄! 这也是为我做的。在 Ubuntu 13.04 上运行 OLD (1.8.7) 应用程序 这个解决方案实际上给我带来了麻烦,因为停止它会导致网络服务发疯!检查以下网址forums.fedoraforum.org/showthread.php?t=124837【参考方案3】:

刚刚遇到同样的问题。

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

也为我做了诀窍。 以防万一你在 rvm 下运行 ruby​​,这里是要走的路:

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

【讨论】:

谢谢!在找到您的答案之前,我搜索了 .rvm 并没有找到 webrick,并更改了 /usr/lib 之一,但没有帮助。这行得通。 @KenBarber 很确定这不是一个好的方向,但是为了有一个好的和小的开发周期,只需对本地 RVM 安装进行此修改是可以的。顺便说一句,这只是您的用户个人资料,您不会打扰其他人... @Kjellski 也许你是对的,但它不会通过升级持续存在,也不是你可以轻松传递给你的开发人员的解决方案。在这种情况下,Rails 上的猴子补丁可能会更好耸耸肩。无论如何,它现在已修复:github.com/rails/rails/commit/… ...【参考方案4】:

“Thin”现在是在本地和在 Heroku 上运行的绝佳选择:

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

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

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

gem "thin"

...然后运行 ​​bundle 并使用 thin startrails s 启动您的服务器。

Heroku 更新

Thin 现在被认为是 Heroku 的一个糟糕选择。更多信息在这里:

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

他们的建议:

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

【讨论】:

一个完美的解决方案,不改变系统中的代码或任何东西。 事实证明,如果安装了 Sinatra,它会自动使用 Thin 而不是 webrick。我所要做的就是gem install thin。请参阅sinatrarb.com/intro.html 建议同时运行 gem install thin,如果可用,Sinatra 会选择它。 编辑:显着的性能改进。从 1.3s 到 0.05s。【参考方案5】:

当通过 *** 访问 WEBrick 服务器时,我遇到了一个类似的问题。请求会花费很长时间,其中大部分都没有在线上发生任何事情。 由于 mongrelthin gems 都不能在 Windows 上使用 Ruby1.9,而且我无法卷入从源代码编译的东西,所以我需要坚持使用 WEBrick。

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

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

【讨论】:

【参考方案6】:

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

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

【讨论】:

【参考方案7】:

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

【讨论】:

太棒了。这比编辑一些需要在每次更新后更改的 webrick 文件更好。 在我的情况下,要添加的条目(对于运行 webrick 的 Linux 客户机)将是 Windows 主机的 IP 地址【参考方案8】:

我在使用 Sinatra 时经常遇到 10 秒的延迟。这个 sn-p 为我解决了。

将此添加到您的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

【讨论】:

【参考方案9】:

这是一个旧的问答线程,它帮助我解决了本地开发虚拟机上的:DoNotReverseLookup 问题,并希望添加更多信息。 This web page explains the regression error 在 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 =&gt; true 在你的 WEBrick 配置中,反向 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 的下一个版本中,这个 pull 将被合并或以某种方式处理潜在的问题;也许是 2.1.6?

【讨论】:

【参考方案10】:

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

将 WEBrick 替换为 mongrel。我必须使用预发布版本,否则无法安装:

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】:

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

Socket.do_not_reverse_lookup = true

脚本开头的某处。

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

【讨论】:

【参考方案12】:

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

sudo iptables -F

【讨论】:

以上是关于Webrick 的响应速度很慢。如何加快速度?的主要内容,如果未能解决你的问题,请参考以下文章

如何提高电脑运行速度

如何加快https的访问速度

我的MacBook air运行速度很慢怎么办

如何在显示大量文本时加快滚动响应速度

如何通过 IP 地址查询加快国家检测速度?

KNN - 我如何加快速度?