Webrick phản hồi rất chậm. Làm thế nào để tăng tốc độ?


88

Tôi có một ứng dụng Rails đang chạy trên máy chủ của mình. Khi tôi truy cập máy tính từ xa và cố gắng tải ứng dụng, máy chủ sẽ mất khoảng 3-4 phút để phản hồi với một trang HTML đơn giản. Tuy nhiên, khi tôi tải trang cục bộ trên máy chủ, trang sẽ hiển thị chỉ sau một giây. Tôi đã thử ping máy chủ từ máy tính để bàn từ xa của mình và ping sẽ thành công trong một khoảng thời gian hợp lý.

Tất cả điều này dường như đã bắt đầu sau khi tôi cài đặt ứng dụng khách cơ bản của Oracle và SQLPLUS. Tôi có nên nghi ngờ Oracle không? Có ai đã trải qua bất cứ điều gì tương tự như thế này?


2
Có lẽ điều này bây giờ nên được chuyển sang serverfault?
Giáo sư Falken

Không cần, điều này có thể được giải quyết bằng cách đơn giản thay đổi một dòng trong một tập tin cấu hình
Mosty Mostacho

2
@AmigableClarkKant Webrick giống một công cụ dành cho nhà phát triển hơn, vì vậy có vẻ tốt hơn là bạn nên tiếp tục sử dụng SO.
David

lòng tốt, và tất cả cùng tôi cho rằng sự vấn đề để vmware, đốt trong địa ngục webrick :(
prusswan

Câu trả lời:


139

Có cùng một vấn đề ở đây (thậm chí một năm sau đó). Trong linux bạn phải làm như sau:

Tìm tệp /usr/lib/ruby/1.9.1/webrick/config.rb và chỉnh sửa nó.

Thay thế dòng

:DoNotReverseLookup => nil,

với

:DoNotReverseLookup => true,

Khởi động lại webrick và nó sẽ hoạt động như một sự quyến rũ :)


21
Đã làm việc! Tôi gặp sự cố với việc Webrick chạy chậm khi cung cấp nội dung tĩnh từ một máy tính khác trong mạng cục bộ của chúng tôi. Điều này đã giải quyết nó. Sự khác biệt duy nhất là config.rb ở: ~ / .rvm / rubies / ruby-1.9.2-p180 / lib / ruby ​​/ 1.9.1 / webrick / config.rb - vì chúng tôi đang sử dụng RVM.
Slobodan Kovacevic

btw, tôi không có chìa khóa đó, vì vậy tôi chỉ cần thêm nó và nó làm việc
ecoologic

bạn đã thêm nó ở đâu? Phần nào?
Abe Petrillo

Nó được cho là nằm trong phần Chung theo ruby-doc.org/stdlib/libdoc/webrick/rdoc/classes/WEBrick/… .
David Grayson

10
Phiên bản ruby ​​mà tôi có là ruby-1.8.7-p330 và nó dường như không có tùy chọn DoNotReverseLookup. Chuỗi "DoNotReverseLookup" không xuất hiện trong config.rb của webrick hoặc bất cứ nơi nào trong ~ / .rvm / rubies / ruby-1.8.7-p330 / lib / ruby ​​/ 1.8. Có cách nào hay để khắc phục sự cố này trong ruby-1.8.7-p330 không?
David Grayson

36

Có cùng một vấn đề. Đối với tôi, bài đăng này có giải pháp. Nếu bạn đang sử dụng Ubuntu, hãy dừng (hoặc gỡ cài đặt) avahi-daemon. service avahi-daemon stopdừng daemon.

Webrick bây giờ cảm thấy rất nhanh.

Vấn đề có một báo cáo cũ trong Rails Lighthouse , tuy nhiên, Ruby-on-Rails đã chuyển vé của họ sang github kể từ đó; Thật không may là vấn đề cũ này vẫn tồn tại.

Tuy nhiên, hãy lưu ý rằng nếu bạn thực sự sử dụng avahi-daemon cho việc gì đó, chẳng hạn như tìm máy in và máy quét trên mạng của mình, điều đó sẽ không hoạt động nữa.


1
Cảm ơn rất nhiều!! Nó đã giải quyết được sự cố của tôi trên Ubuntu 11.04 / 11.10 / 12.04
SMMousavi

1
Vâng, câu trả lời này dường như là người hùng thầm lặng đối với tôi!
PCoder

1
Điều này đã làm điều đó cho tôi, quá. Chạy một (1.8.7) ứng dụng OLD trên Ubuntu 13.04
TerryS

1
giải pháp này thực sự khiến tôi gặp rắc rối vì việc ngừng hoạt động này khiến các dịch vụ mạng hoạt động kém! kiểm tra url sau forums.fedoraforum.org/showthread.php?t=124837
Isaiyavan Babu Karan

23

Chỉ có cùng một vấn đề. Các

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

đã làm các mẹo cho tôi quá. Chỉ trong trường hợp bạn đang chạy ruby ​​dưới rvm, đây là con đường để đi cho:

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

1
Cảm ơn! Trước khi tôi tìm thấy câu trả lời của bạn, tôi đã tìm kiếm .rvm và không tìm thấy webrick, và đã thay đổi / usr / lib và điều đó không giúp được gì. Điều này đã hiệu quả.
B Bảy

@KenBarber Khá chắc rằng đó không phải là một hướng tốt, nhưng để có một chu kỳ phát triển nhỏ và tốt đẹp, bạn chỉ cần thực hiện sửa đổi này đối với cài đặt RVM cục bộ của mình. Và bằng cách này, nó chỉ là hồ sơ người dùng của bạn, bạn sẽ không bận tâm bất cứ ai khác ...
Kjellski

1
@Kjellski có lẽ bạn đúng, nhưng nó không tồn tại qua các lần nâng cấp, cũng không phải là giải pháp mà bạn có thể dễ dàng chuyển cho các nhà phát triển đồng nghiệp của mình. Có lẽ một bản vá khỉ trên Rails trong trường hợp này là nhún vai tốt hơn . Dù sao nó cố định bây giờ: github.com/rails/rails/commit/... ...
Ken Barber

15

"Thin" hiện là một lựa chọn tuyệt vời để chạy cục bộ cả hai và trên Heroku:

Trên Heroku: https://devcenter.heroku.com/articles/rails3#webserver

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

Bạn có thể sử dụng nó cục bộ bằng cách đưa vào Gemfile của bạn:

gem "thin"

... và sau đó chạy gói và khởi động máy chủ của bạn bằng thin starthoặc rails s.

Cập nhật về Heroku

Thin hiện được coi là một lựa chọn không tồi cho Heroku. Thông tin thêm tại đây:

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

Khuyến nghị của họ:

Chuyển sang phần phụ trợ web đồng thời như Unicorn hoặc Puma trên JRuby, cho phép dyno quản lý hàng đợi yêu cầu của riêng mình và tránh chặn các yêu cầu dài.


Một giải pháp hoàn hảo bằng cách không thay đổi mã hoặc bất kỳ thứ gì trong hệ thống.
Fernando Kosh

Hóa ra Sinatra sử dụng thin thay vì webrick tự động nếu nó được cài đặt. Tất cả những gì tôi phải làm là gem install thin. Xem sinatrarb.com/intro.html Bạn cũng nên chạy gem install thin, Sinatra sẽ chọn nếu có. EDIT: Cải thiện hiệu suất mạnh mẽ. Từ 1,3 giây đến 0,05 giây.
GuiSim

6

Tôi đã gặp phải sự cố tương tự rõ ràng tự biểu hiện khi truy cập máy chủ WEBrick thông qua VPN. Yêu cầu sẽ mất nhiều thời gian, hầu hết là không có gì xảy ra trên dây. Vì không phải gem nào mongrelcũng thinhoạt động với Ruby1.9 trên Windows và không đời nào tôi bị cuốn vào việc biên dịch nội dung từ nguồn, nên tôi cần gắn bó với WEBrick.

Cách khắc phục là đặt tham số cấu hình DoNotReverseLookupthành true, khi tạo máy chủ WEBrick:

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


2

Đã cố gắng làm điều này với webrick trên 1.8.7 và không thể tìm thấy cấu hình để thay đổi. Tuy nhiên, một thủ thuật gian lận mà bạn có thể sử dụng là thêm vào tệp máy chủ của máy chủ đang chạy webrick địa chỉ ip mà nó đang cố gắng tra cứu ngược lại ..


Tuyệt quá. Điều này tốt hơn là chỉnh sửa một số tệp webrick cần thay đổi sau mỗi lần cập nhật.
Petr

Trong trường hợp của tôi mục được bổ sung (đối với máy khách Linux chạy webrick) sẽ là địa chỉ IP của các máy chủ Windows
prusswan

2

Tôi thường xuyên bị trễ 10 giây với Sinatra. Đoạn mã này đã giải quyết nó cho tôi.

Thêm cái này gần đầu app.rbtệp của bạn

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

Xem nguồn


1

Đây là một chuỗi câu hỏi và câu trả lời cũ đã giúp tôi giải quyết :DoNotReverseLookupvấn đề trên một máy ảo phát triển cục bộ và muốn thêm thông tin bổ sung. Trang web này giải thích lỗi hồi quy trong lõi Ruby dẫn đến sự cố này xuất hiện đối với một số người; nhấn mạnh là của tôi; Điểm ngắn gọn của tất cả những điều này là có một yêu cầu kéo GitHub cho bản sửa lỗi lõi Ruby cho vấn đề này và hy vọng nó sẽ được chấp thuận và hợp nhất trong một bản phát hành sớm của Ruby:

Sau vài giờ khắc phục sự cố, hóa ra là như vậy! Rõ ràng, ở đâu đó dọc theo sự phát triển của lib tiêu chuẩn của Ruby từ 1.8.6 lên 2.0.0, WEBrick đã có được một tùy chọn cấu hình mới :DoNotReverseLookupđược đặt thành nilmặc định. Sau đó, nằm sâu trong ruột mã xử lý yêu cầu của WEBrick, nó đặt do_not_reverse_lookupcờ trên phiên bản ổ cắm kết nối đến thành giá trị config[:DoNotReverseLookup]. Vì giá trị này nillà sai, nên hiệu ứng giống như việc đặt nó thành false, ghi đè Socket.do_not_reverse_lookupcờ chung. Vì vậy, trừ khi bạn có: DoNotReverseLookup => truetrong cấu hình WEBrick của mình, việc tra cứu DNS ngược sẽ luôn xảy ra cho mỗi kết nối mới, có khả năng gây ra độ trễ nghiêm trọng.

Liên quan đến khám phá này là một yêu cầu kéo GitHub từ tác giả đề xuất cách khắc phục sự cố trong mã nguồn Ruby WEBrick: Sửa lỗi hồi quy trong thực hiện tùy chọn cấu hình DoNotReverseLookup của WEBrick # 731

Giải pháp như được nêu trong yêu cầu là thay đổi dòng 181 lib/webrick/server.rbtừ dòng này:

sock.do_not_reverse_lookup = config[:DoNotReverseLookup]

Về điều này:

unless config[:DoNotReverseLookup].nil?

Chia sẻ ở đây nếu có ai tình cờ gặp chuỗi câu hỏi / câu trả lời được đánh giá cao này và quan tâm đến tiến trình giải quyết vấn đề này trong Ruby core. Hy vọng rằng sự kéo này sẽ được hợp nhất hoặc vấn đề cơ bản được xử lý theo một cách nào đó trong bản phát hành tiếp theo của Ruby; có thể là 2.1.6?


0

Đây là một câu trả lời rất muộn nhưng tôi đã dành một phần thời gian tốt trong ngày để gỡ lỗi vấn đề này với Rails chạy trên Vagrant. Việc thay đổi tra cứu DNS ngược không thực sự cải thiện thời gian yêu cầu. Sự kết hợp của hai điều đã khiến trang của tôi tải từ ~ 20 giây đến ~ 3 giây trong chế độ phát triển:

Thay thế WEBrick bằng mongrel. Tôi phải sử dụng phiên bản phát hành trước nếu không sẽ không cài đặt được:

sudo gem install mongrel --pre

Sau đó thêm nó vào Gemfile của tôi dành cho nhà phát triển:

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

Khởi động máy chủ của tôi như thế này sau đó:

rails server mongrel -e development

Điều đó cắt đi một vài giây, 5 hoặc 6 giây, nhưng nó vẫn chậm kinh khủng. Đây là lớp đóng băng trên bánh - hãy thêm cái này vào Gemfile:

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


0

Trong tôi có lẽ tình huống hiếm hoi, nó làm việc sau khi tôi đỏ ửng iptables của tôi, điều này đã không có bất kỳ tác dụng phụ vì tôi không có bất kỳ quy tắc tùy chỉnh (chỉ mặc định Ubuntu cho phép tất cả):

sudo iptables -F
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.