Webrick sangat lambat merespons. Bagaimana cara mempercepatnya?

88

Saya memiliki aplikasi Rails yang saya jalankan di server saya. Ketika saya pergi ke desktop jarak jauh dan mencoba memuat aplikasi, server memerlukan waktu 3-4 menit untuk merespons dengan halaman HTML sederhana. Namun, ketika saya memuat halaman secara lokal di server, halaman tersebut muncul hanya dalam satu detik. Saya mencoba melakukan ping ke server dari desktop jarak jauh saya dan ping berhasil dalam jangka waktu yang wajar.

Ini semua tampaknya dimulai setelah saya menginstal klien dasar Oracle dan SQLPLUS. Haruskah saya mencurigai Oracle? Adakah yang pernah mengalami hal serupa dengan ini?

Prof. Falken
sumber
2
Mungkin ini sekarang harus dipindahkan ke serverfault?
Prof. Falken
Tidak perlu, ini dapat diselesaikan hanya dengan memodifikasi baris dalam file konfigurasi
Mosty Mostacho
2
@AmigableClarkKant Webrick lebih merupakan alat pengembang, jadi tampaknya lebih baik tetap menggunakan SO.
David
ya ampun, dan selama ini saya mengaitkan masalah dengan vmware, burn in hell webrick :(
prusswan

Jawaban:

139

Mengalami masalah yang sama di sini (bahkan setahun kemudian). Di bawah linux Anda harus melakukan hal berikut:

Cari file /usr/lib/ruby/1.9.1/webrick/config.rb dan edit.

Ganti garisnya

:DoNotReverseLookup => nil,

dengan

:DoNotReverseLookup => true,

Mulai ulang webrick dan itu akan bekerja dengan sangat baik :)

Mosty Mostacho
sumber
21
Bekerja! Saya mengalami masalah dengan Webrick yang lambat saat menyajikan konten statis dari komputer lain di jaringan lokal kami. Ini menyelesaikannya. Satu-satunya perbedaan adalah config.rb ada di: ~ / .rvm / rubies / ruby-1.9.2-p180 / lib / ruby ​​/ 1.9.1 / webrick / config.rb - karena kami menggunakan RVM.
Slobodan Kovacevic
btw, saya tidak punya kunci itu, jadi saya hanya menambahkannya dan berhasil
ecoologic
dimana kamu menambahkannya? bagian apa?
Abe Petrillo
Seharusnya ada di bagian Umum menurut ruby-doc.org/stdlib/libdoc/webrick/rdoc/classes/WEBrick/… .
David Grayson
10
Versi ruby ​​yang saya miliki adalah ruby-1.8.7-p330 dan tampaknya tidak memiliki opsi DoNotReverseLookup. String "DoNotReverseLookup" tidak muncul di config.rb webrick atau di mana pun di ~ / .rvm / rubies / ruby-1.8.7-p330 / lib / ruby ​​/ 1.8. Apakah ada cara yang bagus untuk memperbaiki masalah ini di ruby-1.8.7-p330?
David Grayson
36

Punya masalah yang sama. Bagi saya, posting ini memegang solusinya. Jika Anda menggunakan Ubuntu, hentikan (atau hapus instalan) file avahi-daemon. service avahi-daemon stopmenghentikan daemon.

Webrick sekarang terasa sangat cepat.

Masalahnya memiliki laporan lama di Rails Lighthouse , namun, Ruby-on-Rails telah memindahkan tiket mereka ke github sejak saat itu; Agak disayangkan bahwa masalah lama ini masih berlanjut.

Sadarilah, bahwa jika Anda benar-benar menggunakan avahi-daemon untuk sesuatu, seperti menemukan printer dan pemindai di jaringan Anda, itu tidak akan berfungsi lagi.

Prof. Falken
sumber
1
Terima kasih banyak!! Ini memecahkan masalah saya di Ubuntu 11.04 / 11.10 / 12.04
SMMousavi
1
Nah jawaban ini sepertinya menjadi pahlawan tanpa tanda jasa bagi saya!
PCoder
1
Ini juga berlaku untuk saya. Menjalankan aplikasi OLD (1.8.7) di Ubuntu 13.04
TerryS
1
solusi ini benar-benar membuat saya kesulitan karena dengan menghentikan ini menyebabkan layanan jaringan menjadi gila! periksa url berikut forums.fedoraforum.org/showthread.php?t=124837
Isaiyavan Babu Karan
23

Baru saja mengalami masalah yang sama. Itu

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

melakukan trik untuk saya juga. Untuk berjaga-jaga jika Anda menjalankan ruby ​​di bawah rvm, berikut adalah jalan yang harus ditempuh:

~/.rvm/rubies/ruby-<version>/lib/ruby/<version>/webrick/config.rb
Kjellski
sumber
1
Terima kasih! Sebelum saya menemukan jawaban Anda, saya mencari .rvm dan tidak menemukan webrick, dan mengubah / usr / lib satu dan itu tidak membantu. Ini berhasil.
B Tujuh
@KenBarber Cukup yakin ini bukan arah yang baik, tetapi untuk mendapatkan siklus pengembangan yang bagus dan kecil, tidak apa-apa untuk melakukan modifikasi ini pada instalasi RVM lokal Anda. Dan omong-omong, itu hanya profil pengguna Anda, Anda tidak akan mengganggu orang lain ...
Kjellski
1
@Kjki mungkin Anda benar, tetapi itu tidak bertahan melalui peningkatan, juga bukan solusi yang dapat Anda bagikan dengan mudah ke sesama pengembang. Mungkin tambalan monyet di Rails dalam hal ini lebih baik mengangkat bahu . Pokoknya sudah diperbaiki sekarang: github.com/rails/rails/commit/… ...
Ken Barber
15

"Tipis" sekarang merupakan pilihan bagus untuk menjalankan keduanya secara lokal dan di Heroku:

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

Situs web: http://code.macournoyer.com/thin/

Anda dapat menggunakannya secara lokal dengan memasukkan Gemfile Anda:

gem "thin"

... lalu jalankan bundel dan mulai server Anda dengan thin startatau rails s.

Pembaruan di Heroku

Kurus sekarang dianggap sebagai pilihan yang buruk untuk Heroku. Informasi lebih lanjut di sini:

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

Rekomendasi mereka:

Beralih ke backend web bersamaan seperti Unicorn atau Puma di JRuby, yang memungkinkan dyno mengelola antrean permintaannya sendiri dan menghindari pemblokiran pada permintaan yang lama.

Jamon Holmgren
sumber
Solusi sempurna dengan tidak mengubah kode atau apapun dalam sistem.
Fernando Kosh
Ternyata Sinatra menggunakan thin bukan webrick secara otomatis jika sudah terpasang. Yang harus saya lakukan adalah gem install thin. Lihat sinatrarb.com/intro.html Direkomendasikan juga untuk menjalankan gem install thin, yang akan diambil Sinatra jika tersedia. EDIT: Peningkatan kinerja yang drastis. Dari 1,3 hingga 0,05.
GuiSim
6

Saya memiliki masalah yang samar-samar serupa yang terwujud dengan sendirinya saat mengakses server WEBrick melalui VPN. Permintaan akan memakan waktu lama, sebagian besar tidak terjadi apa-apa di kawat. Karena baik mongrelatau thinpermata bekerja dengan Ruby1.9 pada Windows dan tidak ada cara saya mendapatkan diri saya terlibat dalam kompilasi barang dari sumber, yang saya butuhkan untuk tetap dengan Webrick.

Perbaikannya adalah mengatur parameter config DoNotReverseLookupke true, saat membuat server WEBrick:

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

Anda dapat menggunakan Apacheatau menginstal Thin. Di Gemfile Anda:gem 'thin'

Anda juga dapat memeriksa daftar server web untuk rel .

Uladz Kha
sumber
2

Mencoba melakukan ini dengan webrick di 1.8.7 dan tidak dapat menemukan konfigurasi untuk diubah. Namun, cheat yang dapat Anda gunakan adalah menambahkan file host dari server yang menjalankan webrick, alamat ip yang mencoba membalikkan pencarian ..

patrickdavey
sumber
Bagus. Ini lebih baik daripada mengedit beberapa file webrick yang perlu diubah setelah setiap pembaruan.
Petr
Dalam kasus saya, entri yang akan ditambahkan (untuk tamu Linux yang menjalankan webrick) adalah alamat ip dari host Windows
prusswan
2

Saya sering mengalami penundaan 10 detik dengan Sinatra. Cuplikan ini menyelesaikannya untuk saya.

Tambahkan ini di dekat bagian atas app.rbfile Anda

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

Lihat sumber

neoneye
sumber
1

Ini adalah utas pertanyaan dan jawaban lama yang membantu saya memecahkan :DoNotReverseLookupmasalah pada mesin virtual pengembangan lokal dan ingin menambahkan info tambahan. Halaman web ini menjelaskan kesalahan regresi di inti Ruby yang menyebabkan masalah ini muncul untuk beberapa; penekanan adalah milikku; Singkatnya, ada permintaan GitHub untuk perbaikan inti Ruby untuk ini dan mudah-mudahan itu akan disetujui dan digabungkan dalam rilis Ruby yang segera:

Setelah beberapa jam pemecahan masalah, ternyata itu benar! Rupanya, di suatu tempat di sepanjang evolusi lib standar Ruby dari 1.8.6 ke 2.0.0, WEBrick memperoleh opsi konfigurasi baru :DoNotReverseLookupyang disetel nilsecara default. Kemudian, jauh di dalam inti kode pemrosesan permintaan WEBrick, itu menetapkan do_not_reverse_lookupbendera pada instance soket koneksi masuk ke nilai config[:DoNotReverseLookup]. Karena nilai ini nil, yang salah, efeknya sama dengan menyetelnya ke false, menimpa Socket.do_not_reverse_lookupbendera global . Jadi, kecuali Anda memiliki: DoNotReverseLookup => truedi konfigurasi WEBrick Anda, pencarian DNS terbalik akan selalu terjadi untuk setiap koneksi baru, berpotensi menyebabkan latensi yang serius.

Terkait dengan penemuan ini adalah permintaan penarikan GitHub dari penulis yang mengusulkan cara memperbaiki masalah di kode sumber Ruby WEBrick: Perbaiki bug regresi di WEBrick's: DoNotReverseLookup konfigurasi opsi konfigurasi # 731

Solusi yang diuraikan dalam permintaan adalah mengubah baris 181 lib/webrick/server.rbdari ini:

sock.do_not_reverse_lookup = config[:DoNotReverseLookup]

Untuk ini:

unless config[:DoNotReverseLookup].nil?

Berbagi di sini jika ada yang tersandung pada utas pertanyaan / jawaban yang dihormati ini dan tertarik dengan kemajuan dalam menyelesaikan masalah ini di inti Ruby. Mudah-mudahan penarikan ini akan digabungkan atau masalah yang mendasarinya akan ditangani dalam beberapa cara di rilis Ruby berikutnya; mungkin 2.1.6?

Giacomo 1968
sumber
0

Ini adalah jawaban yang sangat terlambat tetapi saya menghabiskan sebagian besar hari untuk men-debug masalah ini dengan Rails yang berjalan di Vagrant. Mengubah pencarian DNS terbalik tidak benar-benar meningkatkan waktu permintaan sama sekali. Kombinasi dua hal membuat halaman saya dimuat dari ~ 20 detik menjadi ~ 3 detik dalam mode pengembangan:

Ganti WEBrick dengan anjing kampung. Saya harus menggunakan versi prarilis atau tidak akan menginstal:

sudo gem install mongrel --pre

Kemudian tambahkan ke Gemfile saya untuk dev:

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

Mulai server saya seperti ini, lalu:

rails server mongrel -e development

Itu memotong beberapa detik, 5 atau 6 detik, tapi masih sangat lambat. Ini adalah lapisan gula pada kue - tambahkan ini juga ke Gemfile:

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

Dalam situasi saya yang mungkin jarang terjadi, itu berfungsi setelah saya memerah iptables saya, ini tidak memiliki efek samping karena saya tidak memiliki aturan khusus (hanya Ubuntu default yang mengizinkan semua):

sudo iptables -F
Nabil Kadimi
sumber