Webrick ตอบสนองช้ามาก จะเร่งความเร็วได้อย่างไร?


88

ฉันมีแอปพลิเคชัน Rails ที่ฉันใช้งานบนเซิร์ฟเวอร์ของฉัน เมื่อฉันไปที่เดสก์ท็อประยะไกลและพยายามโหลดแอปพลิเคชันเซิร์ฟเวอร์จะใช้เวลา 3-4 นาทีในการตอบสนองด้วยหน้า HTML แบบธรรมดา อย่างไรก็ตามเมื่อฉันโหลดเพจในเครื่องบนเซิร์ฟเวอร์หน้านั้นจะปรากฏขึ้นภายในไม่กี่วินาที ฉันลอง ping เซิร์ฟเวอร์จากเดสก์ท็อประยะไกลของฉันและ ping จะประสบความสำเร็จในระยะเวลาที่เหมาะสม

ดูเหมือนว่าทั้งหมดนี้จะเริ่มต้นขึ้นหลังจากที่ฉันติดตั้งไคลเอนต์พื้นฐานและ SQLPLUS ของ Oracle ฉันควรสงสัย Oracle หรือไม่ มีใครมีประสบการณ์คล้าย ๆ นี้บ้าง?


2
บางทีตอนนี้ควรย้ายไปที่ serverfault แล้ว?
ศ. Falken

ไม่จำเป็นสิ่งนี้สามารถแก้ไขได้โดยการแก้ไขบรรทัดในไฟล์กำหนดค่า
Mosty Mostacho

2
@AmigableClarkKant Webrick เป็นเครื่องมือสำหรับนักพัฒนามากขึ้นดังนั้นดูเหมือนว่าจะดีกว่าที่จะอยู่ใน SO
เดวิด

ความดีและตลอดมาฉันก็อ้างปัญหากับ vmware เผาไหม้ในนรก webrick :(
prusswan

คำตอบ:


139

มีปัญหาเดียวกันที่นี่ (หนึ่งปีต่อมา) ภายใต้ 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

btw ฉันไม่มีคีย์นั้นดังนั้นฉันจึงเพิ่มเข้าไปและมันใช้งานได้
ecoologic

คุณเพิ่มไว้ที่ไหน ส่วนไหน?
Abe Petrillo

มันควรจะเป็นในส่วนทั่วไปตามruby-doc.org/stdlib/libdoc/webrick/rdoc/classes/WEBrick/...
David Grayson

10
รุ่นของทับทิมที่ฉันมีคือ Ruby-1.8.7-p330 และดูเหมือนจะไม่มีตัวเลือก DoNotReverseLookup สตริง "DoNotReverseLookup" ไม่ปรากฏใน config.rb ของ webrick หรือที่ใดก็ได้ใน ~ / .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หยุด daemon

ตอนนี้ Webrick รู้สึกเร็วมาก

ปัญหานี้มีรายงานเก่าใน Rails Lighthouseอย่างไรก็ตาม Ruby-on-Rails ได้ย้ายตั๋วไปยัง githubตั้งแต่นั้นมา น่าเสียดายที่ปัญหาเก่านี้ยังคงมีอยู่

โปรดทราบว่าหากคุณใช้งาน จริง ๆavahi-daemonเช่นค้นหาเครื่องพิมพ์และเครื่องสแกนบนเครือข่ายของคุณสิ่งนั้นจะไม่ทำงานอีกต่อไป


1
ขอบคุณมาก ๆ!! มันแก้ปัญหาของฉันบน Ubuntu 11.04 / 11.10 / 12.04
SMMousavi

1
คำตอบนี้ดูเหมือนจะเป็นฮีโร่ที่ไม่ได้ร้องสำหรับฉัน!
PCoder

1
สิ่งนี้ทำเพื่อฉันด้วย ใช้งานแอป OLD (1.8.7) บน Ubuntu 13.04
TerryS

1
การแก้ปัญหานี้ทำให้ฉันมีปัญหาจริง ๆ เช่นเดียวกับการหยุดสิ่งนี้ทำให้บริการเครือข่ายล่ม! ตรวจสอบ url forums.fedoraforum.org/showthread.php?t=124837
Isaiyavan Babu Karan

23

เพิ่งมีปัญหาเดียวกัน.

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

ทำเคล็ดลับให้ฉันด้วย ในกรณีที่คุณใช้ทับทิมภายใต้ rvm นี่คือเส้นทางที่จะไป:

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

1
ขอบคุณ! ก่อนที่ฉันจะพบคำตอบของคุณฉันค้นหา. rvm แล้วไม่พบ webrick และเปลี่ยน / usr / lib อันหนึ่งซึ่งไม่ได้ช่วยอะไร สิ่งนี้ได้ผล
B Seven

@KenBarber ค่อนข้างแน่ใจว่าไม่ใช่ทิศทางที่ดี แต่เพื่อให้มีวงจรการพัฒนาที่ดีและมีขนาดเล็กคุณสามารถปรับเปลี่ยนการติดตั้ง RVM ในพื้นที่ของคุณได้ และอย่างไรก็ตามมันเป็นเพียงโปรไฟล์ผู้ใช้ของคุณเท่านั้นคุณจะไม่รบกวนใครอีก ...
Kjellski

1
@Kjellski บางทีคุณอาจจะพูดถูก แต่มันไม่คงอยู่ผ่านการอัพเกรดและมันก็ไม่ใช่วิธีแก้ปัญหาที่คุณสามารถส่งต่อให้กับเพื่อนร่วมทีมของคุณได้อย่างง่ายดาย บางทีแพทช์ลิง on Rails ในกรณีนี้จะดีกว่ายัก อย่างไรก็ตามตอนนี้แก้ไขแล้ว: github.com/rails/rails/commit/… ...
Ken Barber

15

ตอนนี้ "Thin" เป็นตัวเลือกที่ยอดเยี่ยมสำหรับการทำงานทั้งในประเทศ และใน Heroku:

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

เว็บไซต์: http://code.macournoyer.com/thin/

คุณสามารถใช้งานได้โดยใส่ Gemfile ของคุณ:

gem "thin"

... และแล้วเรียกใช้มัดและเริ่มต้นเซิร์ฟเวอร์ของคุณด้วยหรือthin startrails s

อัปเดตเกี่ยวกับ Heroku

ตอนนี้ Thin ถือเป็นทางเลือกที่ไม่ดีสำหรับ Heroku ข้อมูลเพิ่มเติมที่นี่:

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

คำแนะนำของพวกเขา:

เปลี่ยนไปใช้เว็บแบ็กเอนด์พร้อมกันเช่น Unicorn หรือ Puma บน JRuby ซึ่งช่วยให้ dyno จัดการคิวคำขอของตัวเองและหลีกเลี่ยงการบล็อกคำขอยาว ๆ


โซลูชั่นที่สมบูรณ์แบบโดยไม่เปลี่ยนรหัสหรือสิ่งใด ๆ ในระบบ
Fernando Kosh

ปรากฎว่า Sinatra ใช้ thin แทน webrick โดยอัตโนมัติหากมีการติดตั้ง gem install thinสิ่งที่ผมต้องทำคือ โปรดดูsinatrarb.com/intro.html ขอแนะนำให้เรียกใช้ gem install thin ด้วยซึ่ง Sinatra จะรับถ้ามี แก้ไข: การปรับปรุงประสิทธิภาพอย่างมาก จาก 1.3s ถึง 0.05s
GuiSim

6

ฉันมีปัญหาที่คล้ายกันอย่างคลุมเครือซึ่งปรากฏให้เห็นเมื่อเข้าถึงเซิร์ฟเวอร์ WEBrick ผ่าน VPN คำขอจะใช้เวลานานโดยส่วนใหญ่ไม่มีอะไรเกิดขึ้นบนสาย เนื่องจากอัญมณีmongrelหรือthinอัญมณีไม่ทำงานกับ Ruby1.9 บน Windows และไม่มีทางที่ฉันจะรวบรวมข้อมูลจากแหล่งที่มาฉันจึงต้องติดกับ WEBrick

การแก้ไขคือการตั้งค่าพารามิเตอร์ config DoNotReverseLookupเป็นtrueเมื่อสร้างเซิร์ฟเวอร์ WEBrick:

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

5

คุณสามารถใช้Apacheหรือติดตั้งThinหรือติดตั้งใน Gemfile ของคุณ:gem 'thin'

นอกจากนี้คุณสามารถตรวจสอบรายชื่อของเว็บเซิร์ฟเวอร์สำหรับราง


2

กำลังพยายามทำสิ่งนี้กับ webrick บน 1.8.7 และไม่พบ config ที่จะเปลี่ยน อย่างไรก็ตามการโกงที่คุณสามารถใช้ได้คือการเพิ่มลงในไฟล์โฮสต์ของเซิร์ฟเวอร์ซึ่งกำลังเรียกใช้เราได้เลือกที่อยู่ IP ที่พยายามค้นหาแบบย้อนกลับ ..


เยี่ยมมาก จะดีกว่าแล้วแก้ไขไฟล์ webrick บางไฟล์ที่ต้องมีการเปลี่ยนแปลงหลังจากการอัพเดตแต่ละครั้ง
Petr

ในกรณีของฉันรายการที่จะเพิ่ม (สำหรับแขก Linux ที่ใช้ webrick) จะเป็นที่อยู่ IP ของโฮสต์ Windows
prusswan

2

ฉันประสบปัญหาความล่าช้า 10 วินาทีบ่อยครั้งกับ Sinatra ตัวอย่างข้อมูลนี้แก้ไขให้ฉัน

เพิ่มสิ่งนี้ใกล้ด้านบนสุดของ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ปัญหาในเครื่องเสมือนการพัฒนาในพื้นที่และต้องการเพิ่มข้อมูลเพิ่มเติม หน้าเว็บนี้อธิบายถึงข้อผิดพลาดการถดถอยใน Ruby core ที่ทำให้เกิดปัญหานี้ขึ้นสำหรับบางคน เน้นเป็นของฉัน ความยาวสั้น ๆ ทั้งหมดนี้คือมีคำขอดึง GitHub สำหรับการแก้ไข Ruby core สำหรับสิ่งนี้และหวังว่าจะได้รับการอนุมัติและรวมเข้าด้วยกันในการเปิดตัว Ruby ในเร็ว ๆ นี้:

หลังจากแก้ไขปัญหาไม่กี่ชั่วโมงปรากฎว่าเป็น! เห็นได้ชัดว่าบางแห่งตามวิวัฒนาการของ lib มาตรฐานของ Ruby จาก 1.8.6 เป็น 2.0.0 WEBrick ได้รับตัวเลือกการกำหนดค่าใหม่ที่ตั้งค่า:DoNotReverseLookupเป็นค่าnilเริ่มต้น จากนั้นลึกลงไปในความกล้าของรหัสการประมวลผลคำขอ WEBrick ของมันตั้ง ธงในอินสแตนซ์ซ็อกเก็ตเชื่อมต่อเข้ามาค่าของdo_not_reverse_lookup ตั้งแต่ค่านี้ซึ่งเป็น falsy ผลที่ออกมาเป็นเช่นเดียวกับการตั้งค่าให้เอาชนะโลกธง ดังนั้นหากคุณไม่มี: ในการกำหนดค่า WEBrick การค้นหา DNS แบบย้อนกลับจะเกิดขึ้นเสมอสำหรับการเชื่อมต่อใหม่แต่ละครั้งซึ่งอาจทำให้เกิดความหน่วงแฝงที่ร้ายแรงconfig[:DoNotReverseLookup]nilfalseSocket.do_not_reverse_lookupDoNotReverseLookup => true

ที่เกี่ยวข้องกับการค้นพบนี้เป็นคำขอดึง GitHub จากผู้เขียนที่เสนอวิธีแก้ไขปัญหาในซอร์สโค้ด Ruby WEBrick:แก้ไขข้อผิดพลาดการถดถอยใน WEBrick's: DoNotReverseLookup config option การใช้งาน # 731

วิธีแก้ไขตามที่ระบุไว้ในคำขอคือการเปลี่ยนบรรทัดที่ 181 lib/webrick/server.rbจากนี้:

sock.do_not_reverse_lookup = config[:DoNotReverseLookup]

สำหรับสิ่งนี้:

unless config[:DoNotReverseLookup].nil?

แบ่งปันที่นี่หากใครสะดุดกับหัวข้อคำถาม / คำตอบที่ได้รับการยกย่องและสนใจในความคืบหน้าในการแก้ปัญหานี้ใน Ruby core หวังว่าการดึงนี้จะถูกรวมเข้าด้วยกันหรือปัญหาพื้นฐานได้รับการจัดการไม่ทางใดก็ทางหนึ่งใน Ruby รุ่นถัดไป อาจจะ 2.1.6?


0

นี่เป็นคำตอบที่ล่าช้ามาก แต่ฉันใช้เวลาส่วนหนึ่งของวันในการแก้ไขปัญหานี้กับ Rails ที่ทำงานบน Vagrant การเปลี่ยนการค้นหา DNS ย้อนกลับไม่ได้ช่วยปรับปรุงเวลาในการร้องขอเลย การรวมกันของสองสิ่งทำให้การโหลดหน้าของฉันจาก ~ 20 วินาทีถึง ~ 3 วินาทีในโหมดการพัฒนา:

แทนที่ WEBrick ด้วย mongrel ฉันต้องใช้เวอร์ชันก่อนวางจำหน่ายมิฉะนั้นจะไม่ติดตั้ง:

sudo gem install mongrel --pre

จากนั้นเพิ่มลงใน Gemfile ของฉันสำหรับ 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


0

ในของฉันอาจจะเป็นสถานการณ์ที่หายากก็ทำงานหลังจากที่ฉันล้าง iptables ของฉันนี้ไม่ได้มีผลข้างเคียงใด ๆ เพราะผมไม่ได้มีกฎที่กำหนดเองใด ๆ (เพียงแค่เริ่มต้นอูบุนตูอนุญาตให้ทั้งหมด):

sudo iptables -F
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.