Webrickの応答が非常に遅い。スピードアップするには?


88

サーバーで実行しているRailsアプリケーションがあります。リモートデスクトップに移動してアプリケーションを読み込もうとすると、サーバーは3〜4分でシンプルなHTMLページで応答します。しかし、サーバーにローカルでページをロードすると、ページは1秒で表示されます。リモートデスクトップからサーバーにpingを実行したところ、pingは妥当な時間内に成功しています。

Oracleの基本的なクライアントとSQLPLUSをインストールした後、これはすべて始まっているようです。Oracleを疑うべきですか?誰かがこれに似た経験をしましたか?


2
たぶん、これは今やserverfaultに移動されるべきですか?
Falken教授、2011

必要はありません。これは、構成ファイルの行を変更するだけで解決できます
Mosty Mostacho

2
@AmigableClarkKant Webrickはより開発者向けのツールなので、SOを使い続ける方が良いようです。
デビッド

良さ、そしてずっと私は問題をvmwareに起因し、地獄のウェブリックで焼く:(
prusswan

回答:


139

ここでも同じ問題があります(1年後でも)。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

ところで、私はそのキーを持っていなかったので、それを追加しただけで機能しました
ecoologic

どこに追加しましたか?どのセクション?
阿部ペトリロ

ruby-doc.org/stdlib/libdoc/webrick/rdoc/classes/WEBrick/…によると、それはGeneralセクションにあるはずです。
David Grayson

10
私が持っているルビのバージョンは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-daemonます。service avahi-daemon stopデーモンを停止します。

Webrickは非常にスピーディーになりました。

この問題はRails Lighthouseの古いレポートにありますが、Ruby-on-Railsはそれ以来、チケットをgithubに移動しています。この古い問題がまだ続くのはちょっと残念です。

ただし、実際に ネットワーク上でプリンターやスキャナー見つけるなどavahi-daemon使用しては機能しなくなります。


1
どうもありがとう!!Ubuntu 11.04 / 11.10 / 12.04での私の問題は解決されました
SMMousavi、

1
さて、この答えは私にとっては縁の下の力持ちのようです!
PCoder 2012年

1
これも私のために行いました。Ubuntu 13.04でOLD(1.8.7)アプリを実行
TerryS '25

1
このソリューションでは、これを停止することでネットワークサービスが混乱するため、実際に私を困らせます!次のURLを確認してください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

1
@Kjellskiはあなたが正しいと思うかもしれませんが、アップグレードしても持続しません。また、他の開発者に簡単に渡すことができるソリューションでもありません。おそらく、この場合のRailsのサルパッチは、肩をすくめる方が良いでしょ。とにかく修正されました:github.com/rails/rails/commit/… ...
Ken Barber

15

「薄い」はローカルで両方を実行するための優れたオプションになりました そしてHeroku

Herokuの場合:https://devcenter.heroku.com/articles/rails3#webserver

ウェブサイト:http : //code.macournoyer.com/thin/

Gemfileに入力することで、ローカルで使用できます。

gem "thin"

...次にbundleを実行し、thin startまたはでサーバーを起動しますrails s

Herokuの更新

今やシンはHerokuにとって悪い選択と考えられています。詳細はこちら:

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

彼らの推薦:

JRubyでUnicornやPumaのような並行Webバックエンドに切り替えます。これにより、dynoは独自のリクエストキューを管理し、長いリクエストでのブロックを回避できます。


システム内のコードなどを変更しないことによる完全なソリューション。
Fernando Kosh、2014年

Sinatraがインストールされている場合、自動的にwebrickではなくthinを使用することが判明しました。私がしなければならなかったすべてはですgem install thinsinatrarb.com/intro.htmlを 参照してください。可能であればSinatraが取得するgem install thinも実行することをお勧めします。編集:大幅なパフォーマンスの向上。1.3秒から0.05秒まで。
GuiSim 2014

6

VPNを介してWEBrickサーバーにアクセスするときに現れる、漠然と同様の問題がありました。リクエストには長い時間がかかりますが、ほとんどの場合、ネットワーク上で何も起こりません。どちらものでmongrelthin宝石は、Windows上でRuby1.9で働いていないし、私は自分自身のソースからのものをコンパイルするに巻き込まなっていた方法はありませんでした、私はWEBrickに固執する必要がありました。

修正は、WEBrickサーバーを作成するときに、configパラメーターDoNotReverseLookupをに設定することでしたtrue

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


2

1.8.7のwebrickでこれを行おうとしていて、変更する構成が見つかりませんでした。ただし、使用できるチートは、webrickを実行しているサーバーのhostsファイルに、逆引きしようとしているIPアドレスを追加することです。


すごい。これは、更新のたびに変更が必要なwebrickファイルを編集するよりも優れています。
Petr

私の場合、追加するエントリ(webrickを実行しているLinuxゲストの場合)は、WindowsホストのIPアドレスになります
prusswan

2

シナトラで頻繁に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、ローカル開発仮想マシンで問題を解決するのに役立ち、さらに情報を追加したいと考えていました。このWebページでは、この問題を引き起こすRubyコアの回帰エラーについて説明しています。強調は私のものです。このすべてが長く続くのは、Rubyコアの修正に対するGitHubプルリクエストがあり、それが承認され、Rubyの近日リリースにマージされることです。

数時間のトラブルシューティングの後、それがそうであることが判明しました!どうやら、Rubyの標準libが1.8.6から2.0.0に進化したどこかで、WEBrickはデフォルトで:DoNotReverseLookup設定さnilれる新しい構成オプションを取得しました。次に、WEBrickのリクエスト処理コードの根底 do_not_reverse_lookupで、着信接続ソケットインスタンスのフラグをの値に設定しconfig[:DoNotReverseLookup]ます。この値はnilであり、これは偽物であるため、効果はに設定してfalse、グローバルSocket.do_not_reverse_lookupフラグを上書きするのと同じです。したがって、DoNotReverseLookup => trueWEBrick構成では、新しい接続ごとにDNS逆ルックアップが常に発生し、深刻な遅延が発生する可能性があります。

この発見に関連するのは、Ruby WEBrickソースコードの問題を修復する方法を提案している作成者からのGitHubプルリクエストです。WEBrickの:DoNotReverseLookup構成オプション実装の回帰バグを修正します#731

リクエストで概説されている解決策は、181行目をこれから変更することlib/webrick/server.rbです:

sock.do_not_reverse_lookup = config[:DoNotReverseLookup]

これに:

unless config[:DoNotReverseLookup].nil?

このよく知られた質問/回答スレッドにつまずいて、Rubyコアでこの問題を解決する際の進捗状況に興味がある場合は、ここで共有してください。うまくいけば、このプルがマージされるか、根本的な問題が次のRubyのリリースで何らかの方法で処理されることを期待しています。たぶん2.1.6?


0

これは非常に遅い答えですが、私は一日の大部分を、Vagrantで実行されているRailsでこの非常に問題をデバッグすることに費やしました。逆DNSルックアップを変更しても、実際にはリクエスト時間が改善されませんでした。開発モードでは、2つの要素の組み合わせにより、ページの読み込みに最大20秒から最大3秒かかりました。

WEBrickをmongrelに置き換えます。プレリリース版を使用しなければ、インストールできませんでした。

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.