Webrick yanıt vermekte çok yavaş. Nasıl hızlandırılır?


88

Sunucumda çalıştırdığım bir Rails uygulamam var. Uzak bir masaüstüne gidip uygulamayı yüklemeye çalıştığımda, sunucunun basit bir HTML sayfasıyla yanıt vermesi 3-4 dakika sürüyor. Ancak, sayfayı yerel olarak sunucuya yüklediğimde, sayfa bir saniye içinde çıkıyor. Uzak masaüstümden sunucuya ping atmayı denedim ve pingler makul bir süre içinde başarılı oluyor.

Tüm bunlar, Oracle'ın temel istemcisini ve SQLPLUS'u kurduktan sonra başlamış görünüyor. Oracle'dan şüphelenmeli miyim? Buna benzer bir şey yaşayan var mı?


2
Belki bu şimdi serverfault'a taşınmalı?
Prof Falken

Gerek yok, bu sadece bir konfigürasyon dosyasındaki bir satırı değiştirerek çözülebilir
Mosty Mostacho

2
@AmigableClarkKant Webrick daha çok bir geliştirici aracıdır, bu yüzden SO'da kalmak daha iyi görünüyor.
David

Yanıtlar:


139

Aynı sorunu burada yaşıyorum (bir yıl sonra bile). Linux altında aşağıdakileri yapmanız gerekir:

/Usr/lib/ruby/1.9.1/webrick/config.rb dosyasını bulun ve düzenleyin.

Satırı değiştir

:DoNotReverseLookup => nil,

ile

:DoNotReverseLookup => true,

Webrick'i yeniden başlatın ve bir cazibe gibi çalışacaktır :)


21
Çalıştı! Yerel ağımızdaki başka bir bilgisayardan statik içerik sunarken Webrick'in yavaş olmasıyla ilgili sorunlar yaşadım. Bu onu çözdü. Tek fark, config.rb'nin ~ / .rvm / rubies / ruby-1.9.2-p180 / lib / ruby ​​/ 1.9.1 / webrick / config.rb içinde olmasıydı - çünkü RVM kullanıyoruz.
Slobodan Kovacevic

btw, o anahtara sahip değildim, bu yüzden yeni ekledim ve işe yaradı
ekolojik

nereye ekledin hangi bölüm?
Abe Petrillo


10
Sahip olduğum ruby ​​versiyonu ruby-1.8.7-p330 ve DoNotReverseLookup seçeneğine sahip görünmüyor. "DoNotReverseLookup" dizesi webrick'in config.rb dosyasında veya ~ / .rvm / rubies / ruby-1.8.7-p330 / lib / ruby ​​/ 1.8 içinde görünmez. Ruby-1.8.7-p330'da bu sorunu çözmenin güzel bir yolu var mı?
David Grayson

36

Aynı sorunu yaşadım. Benim için bu yazı çözümü tuttu. Ubuntu'daysanız avahi-daemon,.service avahi-daemon stopdaemon'u durdurur.

Webrick artık çok hızlı hissediyor .

Sorunun Rails Lighthouse'da eski bir raporu var , ancak Ruby-on-Rails o zamandan beri biletlerini github'a taşıdı ; Bu eski sorunun hala devam etmesi talihsiz bir durum.

Yine de, ağınızdaki yazıcıları ve tarayıcıları bulmak gibi bir şey için kullanırsanız , bunun artık işe yaramayacağını unutmayın.avahi-daemon


1
Çok teşekkürler!! Ubuntu 11.04 / 11.10 /
12.04'teki sorunumu çözdü

1
Bu cevap benim için bilinmeyen bir kahraman gibi görünüyor!
PCoder

1
Bu benim için de yaptı. Ubuntu
13.04'te

1
Bu çözüm aslında beni başımı belaya sokuyor, çünkü bunu durdurmak ağ hizmetlerinin çıldırmasına neden oluyor! aşağıdaki url forumlarını
Isaiyavan Babu Karan

23

Aynı sorunu yaşadım.

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

benim için de hile yaptı. Rvm altında Ruby çalıştırıyorsanız, işte gidilecek yol:

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

1
Teşekkürler! Cevabınızı bulmadan önce .rvm'yi aradım ve webrick'i bulamadım ve / usr / lib'yi değiştirdim ve bu yardımcı olmadı. Bu işe yaradı.
B Seven

@KenBarber Bunun iyi bir yön olmadığından oldukça eminim, ancak güzel ve küçük bir geliştirme döngüsüne sahip olmak için, yerel RVM kurulumunuzda yalnızca bu değişikliği yapmanız sorun değil. Ve bu arada, bu sadece kullanıcı profiliniz, başka kimseyi rahatsız etmeyeceksiniz ...
Kjellski

1
@Kjellski belki haklısınız, ancak yükseltmelerde ısrar etmiyor, geliştiricilerinize kolayca iletebileceğiniz bir çözüm değil. Belki de bu durumda Rails üzerindeki bir maymun yaması omuz silkmek daha iyidir . Her neyse, şimdi düzeltildi: github.com/rails/rails/commit/… ...
Ken Barber

15

"İnce" artık hem yerel olarak çalıştırmak için harika bir seçenek ve Heroku'da:

Heroku'da: https://devcenter.heroku.com/articles/rails3#webserver

Web sitesi: http://code.macournoyer.com/thin/

Gemfile'ınızı yerleştirerek yerel olarak kullanabilirsiniz:

gem "thin"

... ve sonra paketi çalıştırın ve sunucunuzu thin startveya ile başlatın rails s.

Heroku ile ilgili güncelleme

İnce artık Heroku için kötü bir seçim olarak görülüyor. Daha fazla bilgi burada:

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

Önerileri:

Dyno'nun kendi istek kuyruğunu yönetmesine ve uzun isteklerde engellemekten kaçınmasına olanak tanıyan JRuby'de Unicorn veya Puma gibi eşzamanlı bir web arka ucuna geçiş yapın.


Sistemdeki kodları veya hiçbir şeyi değiştirmeyerek mükemmel bir çözüm.
Fernando Kosh

Sinatra, kuruluysa otomatik olarak webrick yerine ince kullanıyor. Tek yapmam gereken şey gem install thin. Bkz sinatrarb.com/intro.html Ayrıca çalıştırmak gem için ince yükleme önerilir varsa Sinatra gelip alacak olan. DÜZENLEME: Önemli performans iyileştirmeleri. 1.3 saniyeden 0.05 saniyeye.
GuiSim

6

VPN aracılığıyla bir WEBrick sunucusuna erişirken ortaya çıkan, belli belirsiz benzer bir sorun yaşadım. İstekler uzun zaman alırdı, çoğu telde hiçbir şey olmazdı. Windows'da mongrelne thingemler ne de gemler Ruby1.9 ile çalışmadığından ve kendimi kaynaktan bir şeyler derlemeye karıştırmamın hiçbir yolu olmadığından, WEBrick'e bağlı kalmam gerekiyordu.

Düzeltme yapılandırma parametresini ayarlamak oldu DoNotReverseLookupiçin true, WEBrick sunucusunu oluştururken:

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


2

Bunu 1.8.7'de webrick ile yapmaya çalışıyordum ve değiştirilecek yapılandırmayı bulamadım. Bununla birlikte, kullanabileceğiniz bir hile, webrick'i çalıştıran sunucunun ana bilgisayar dosyasına, aramayı tersine çevirmeye çalıştığı ip adresini eklemektir.


Harika. Bu, her güncellemeden sonra değiştirilmesi gereken bazı webrick dosyasını düzenlemekten daha iyidir.
Petr

Benim durumumda eklenecek giriş (webrick çalıştıran Linux konuğu için) Windows ana bilgisayarının ip adresi olacaktır
prusswan

2

Sinatra ile sık sık 10 saniyelik gecikmeler yaşadım. Bu pasaj benim için çözdü.

Bunu app.rbdosyanızın üstüne yakın bir yere ekleyin

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

Kaynağa bakın


1

Bu, :DoNotReverseLookupyerel bir geliştirme sanal makinesinde sorunu çözmeme yardımcı olan ve ek bilgi eklemek isteyen eski bir soru ve cevap dizisidir . Bu web sayfası, Ruby çekirdeğindeki bazılarında bu sorunun ortaya çıkmasına neden olan regresyon hatasını açıklar ; vurgu benimdir; tüm bunlardan kısa bir süre sonra, bunun için bir Ruby çekirdeği düzeltmesi için bir GitHub çekme talebi var ve umarım yakında Ruby'nin bir sürümünde onaylanacak ve birleştirilecektir:

Birkaç saatlik sorun giderme işleminden sonra, olduğu ortaya çıktı! Görünüşe göre, Ruby'nin standart lib'sinin 1.8.6'dan 2.0.0'a gelişimi boyunca, WEBrick varsayılan :DoNotReverseLookupolarak ayarlanmış yeni bir konfigürasyon seçeneği edindi nil. Ardından, WEBrick'in talep işleme kodunun derinliklerinde do_not_reverse_lookup, gelen bağlantı soketi örneğindeki bayrağı değerine ayarlar config[:DoNotReverseLookup]. Bu değer nilyanlış olduğundan, etki, falseglobal Socket.do_not_reverse_lookupbayrağı geçersiz kılarak, ayarlanmasıyla aynıdır . Dolayısıyla, sahip olmadığınız sürece: DoNotReverseLookup => trueWEBrick yapılandırmanızda, ters DNS araması her yeni bağlantı için her zaman gerçekleşecek ve potansiyel olarak ciddi gecikmeye neden olacaktır.

Bu keşifle ilgili olarak yazardan gelen ve Ruby WEBrick kaynak kodundaki sorunun nasıl onarılacağını öneren bir GitHub çekme isteği var: WEBrick'in: DoNotReverseLookup yapılandırma seçeneği uygulaması # 731'deki regresyon hatasını düzeltin

İstekte ana hatlarıyla belirtildiği gibi çözüm, 181. satırı lib/webrick/server.rbburadan değiştirmektir :

sock.do_not_reverse_lookup = config[:DoNotReverseLookup]

Buna:

unless config[:DoNotReverseLookup].nil?

Bu saygın soru / cevap dizisine rastlayan ve bu sorunu Ruby çekirdeğinde çözme süreciyle ilgilenen biri varsa burada paylaşmak. Umarım bu çekiş birleştirilir veya altta yatan sorun Ruby'nin bir sonraki sürümünde bir şekilde ele alınır; belki 2.1.6?


0

Bu çok geç bir cevap ama günün büyük bir bölümünü bu sorunu Vagrant üzerinde çalışan Rails ile hata ayıklamakla geçirdim. Ters DNS aramasını değiştirmek aslında istek sürelerini hiç iyileştirmedi. Geliştirme modunda iki şeyin birleşimi sayfa yüklememi ~ 20 saniyeden ~ 3 saniyeye düşürdü:

WEBrick'i melez ile değiştirin. Ön sürüm sürümünü kullanmak zorunda kaldım, yoksa yüklenmedi:

sudo gem install mongrel --pre

Sonra onu dev için Gemfile'ıma ekle:

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

Sunucumu şöyle başlattım sonra:

rails server mongrel -e development

Bu, birkaç saniye, 5 veya 6 saniye kesinti yaptı, ancak yine de çok yavaştı. Bu kek üzerine krema : iyi Gemfile olarak bu eklentiyi -

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


0

Benim içinde muhtemelen nadir bir durum, bu benim iptables kızardı sonra özel kurallara (sadece varsayılan Ubuntu tüm izin) yoktu çünkü bu herhangi bir yan etkisi yoktu çalıştı:

sudo iptables -F
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.