2009-07-21 32 views
89

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

Điều này dường như đã bắt đầu sau khi tôi cài đặt máy khách cơ bản của Oracle và SQLPLUS. Tôi có nên nghi ngờ Oracle? Có ai có kinh nghiệm gì tương tự như vậy không?

+2

Có lẽ điều này bây giờ sẽ được chuyển đến serverfault? –

+0

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

+2

@AmigableClarkKant Webrick của một công cụ phát triển, do đó, có vẻ tốt hơn để ở trên SO. – David

Trả lời

6

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

Việc sửa chữa là để thiết lập các tham số cấu hình DoNotReverseLookup để true, khi tạo server WEBrick:

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

cảm ơn vì mẹo, đã gửi sai tập tin cấu hình, +1 –

140

Có cùng một vấn đề ở đây (thậm chí một năm sau đó). Dưới 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.

Thay thế dòng

:DoNotReverseLookup => nil, 

với

:DoNotReverseLookup => true, 

Restart webrick và nó sẽ làm việc như một nét duyên dáng :)

+2

Cảm ơn người đàn ông tốt của tôi, điều này đã sửa nó cho tôi – smoove

+21

Đã làm việc! Tôi đã gặp vấn đề với Webrick đang chậm khi phục vụ 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 được vấn đề này.Chỉ khác biệt duy nhất là config.rb là: ~/.rvm/rubies/ruby-1.9.2-p180/lib /ruby/1.9.1/webrick/config.rb - bởi vì chúng tôi đang sử dụng RVM –

+0

cảm ơn bạn rất nhiều! Bây giờ tôi có thể giải quyết vấn đề tức là ... :( – ecoologic

24

Chỉ cần có cùng một vấn đề. Số điện thoại

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

cũng làm như vậy cho tôi. Chỉ trong trường hợp bạn đang chạy ruby ​​theo rvm, dưới đây là đường dẫn đến:

~/.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 một và điều đó không giúp được gì. Điều này làm việc. –

+0

Tôi không chắc chắn sửa đổi lõi Ruby là một hướng tốt. –

+0

@KenBarber Khá chắc chắn nó không phải là một hướng tốt, nhưng để có một chu kỳ phát triển tốt đẹp và nhỏ nó không quan trọng để làm chỉ sửa đổi này để cài đặt RVM địa phương của bạn. Và nhân tiện, nó chỉ là hồ sơ người dùng của bạn, bạn sẽ không làm phiền ai khác ... – Kjellski

36

Có cùng vấn đề. Đối với tôi, this post đã tổ chứ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 stop dừng trình nền.

Webrick hiện cảm thấy rất nhanh chóng.

Sự cố có số old report in Rails Lighthouse, tuy nhiên, Ruby-on-Rails đã di chuyển their tickets to github kể từ đó; Không may là vấn đề cũ này vẫn còn tồn tại.

Xin lưu ý rằng nếu bạn thực sự hãy sử dụngavahi-daemon cho mục đích nào đó, như finding printers and scanners trên mạng của bạn, điều đó sẽ không hoạt động nữa.

+1

Cảm ơn rất nhiều !! Nó giải quyết vấn đề của tôi trên Ubuntu 11.04/11.10/12.04 –

+1

Vâng câu trả lời này có vẻ là anh hùng vô danh đối với tôi! – PCoder

+1

Điều này cũng làm cho tôi. Chạy một ứng dụng OLD (1.8.7) trên Ubuntu 13.04 – TerryS

2

Đã cố gắng thực hiện việc 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 cheat bạn có thể sử dụng là để thêm vào các tập tin host của máy chủ đang chạy webrick địa chỉ ip nó đang cố gắng đảo ngược tra cứu ..

+0

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

+0

Trong trường hợp của tôi, mục nhập sẽ được thêm vào (đối với khách Linux đang chạy webrick) sẽ là địa chỉ ip của máy chủ Windows – prusswan

15

"Thin" bây giờ là một lựa chọn tuyệt vời để chạy cả trong nước và trên Heroku:

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

website: http://code.macournoyer.com/thin/

bạn có thể sử dụng nó tại địa phương bằng cách đặt trong Gemfile của bạn:

gem "thin" 

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

Cập nhật trên Heroku

Thin hiện nay được coi là một xấu lựa chọn cho Heroku. Biết thêm thông tin ở đây:

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

khuyến nghị của họ:

Đổi thành một backend web đồng thời như Unicorn hoặc Puma trên JRuby, cho phép người Dyno để quản lý hàng đợi yêu cầu riêng của mình và tránh bị chặn trên dài yêu cầu.

+0

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. –

+0

Biến Sinatra sử dụng mỏng 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 http://www.sinatrarb.com/intro.html _Đề nghị cũng nên chạy gem install thin, mà Sinatra sẽ nhận nếu có._ EDIT: Cải tiến hiệu năng mạnh mẽ. Từ 1,3 đến 0,05. – GuiSim

5

Bạn có thể sử dụng Apache hoặc cài đặt Thin. Trong Gemfile của bạn: gem 'thin'

Hoặc bạn có thể kiểm tra danh sách web-servers for rails.

0

Trong lẽ tình huống hiếm hoi của tôi, 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 
2

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

Thêm này gần phía trên cùng của tập tin app.rb 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 source

0

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

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

sudo gem install mongrel --pre 

Sau đó thêm nó vào Gemfile tôi cho dev:

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

Started máy chủ của tôi như thế này thì:

rails server mongrel -e development 

Điều đó cắt giảm một vài giây, 5 hoặc 6 giây, nhưng nó vẫn còn chậm khủng khiếp. Đây là đóng băng trên bánh - thêm này cũng như để các Gemfile:

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

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

Sau một vài giờ xử lý sự cố, nó bật ra rằng nó đã được! Rõ ràng, ở đâu đó dọc theo sự phát triển của lib chuẩn của Ruby từ 1.8.6 đến 2.0.0, WEBrick đã có được tùy chọn cấu hình mới :DoNotReverseLookup được đặt thành nil theo mặc định. Sau đó, sâu trong đường dẫn mã xử lý yêu cầu của WEBrick, nó đặt cờ do_not_reverse_lookup trên ví dụ socket kết nối đến với giá trị config[:DoNotReverseLookup]. Vì giá trị này là nil, bị lỗi, hiệu ứng cũng giống như đặt thành false, ghi đè cờ toàn cầu Socket.do_not_reverse_lookup. Vì vậy, trừ khi bạn có: DoNotReverseLookup => true trong cấu hình WEBrick của bạn, đảo ngược Tra cứu DNS 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 phát hiện này là a GitHub pull request from the author đề nghị làm thế nào để sửa chữa vấn đề này trong mã nguồn của Ruby WEBrick: Fix regression bug in WEBrick's :DoNotReverseLookup config option implementation #731

Các giải pháp như đã nêu trong yêu cầu là thay đổi dòng 181 trong lib/webrick/server.rb từ này:

sock.do_not_reverse_lookup = config[:DoNotReverseLookup] 

Để này:

unless config[:DoNotReverseLookup].nil? 

Chia sẻ ở đây nếu có ai tình cờ gặp được chuỗi câu hỏi/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 lõi Ruby. Hy vọng rằng kéo này sẽ được sáp nhập 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ó lẽ 2.1.6?

Các vấn đề liên quan