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

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

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

【问题讨论】:

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

标签: ruby-on-rails oracle sqlplus 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​​ 版本是 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】:

当通过 VPN 访问 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
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2013-08-18
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-07-17
                • 2011-01-17
                • 2013-04-20
                相关资源
                最近更新 更多