Уэбрик очень медленно отвечает. Как ускорить это?
У меня есть приложение Rails, которое я запускаю на своем сервере. Когда я захожу на удаленный рабочий стол и пытаюсь загрузить приложение, серверу требуется 3-4 минуты, чтобы ответить простой HTML-страницей. Однако, когда я загружаю страницу локально на сервере, страница появляется через секунду. Я попытался пропинговать сервер с моего удаленного рабочего стола, и пинг прошел успешно за разумное время.
Кажется, все это началось после того, как я установил базовый клиент Oracle и SQLPLUS. Должен ли я подозревать Oracle? Кто-нибудь испытывал что-либо подобное этому?
12 ответов
Имея такую же проблему здесь (даже через год). Под Linux вы должны сделать следующее:
Найдите файл /usr/lib/ruby/1.9.1/webrick/config.rb и отредактируйте его.
Заменить линию
:DoNotReverseLookup => nil,
с
:DoNotReverseLookup => true,
Перезапустите вебрик, и он будет работать как шарм:)
Была такая же проблема. Для меня этот пост занимал решение. Если вы используете Ubuntu, остановите (или удалите) avahi-daemon
, service avahi-daemon stop
останавливает демона
Вебрик теперь чувствует себя очень быстро.
У этой проблемы есть старый отчет в Rails Lighthouse, однако с тех пор Ruby-on-Rails перенесли свои билеты в github; К сожалению, эта старая проблема сохраняется до сих пор.
Имейте в виду, что если вы действительно используете avahi-daemon
например, поиск принтеров и сканеров в вашей сети, которые больше не будут работать.
Просто была такая же проблема.
...
:DoNotReverseLookup => true,
...
сделал трюк для меня тоже. На тот случай, если вы используете ruby под rvm, вот путь для:
~/.rvm/rubies/ruby-<version>/lib/ruby/<version>/webrick/config.rb
"Тонкий" теперь отличный вариант для запуска как локально и на Heroku:
Сайт: http://code.macournoyer.com/thin/
Вы можете использовать его локально, вставив свой Gemfile:
gem "thin"
... а затем запустите bundle и запустите свой сервер с thin start
или же rails s
,
Обновление на Heroku
Тонкий сейчас считается плохим выбором для Heroku. Больше информации здесь:
https://blog.heroku.com/archives/2013/4/3/routing_and_web_performance_on_heroku_a_faq
Их рекомендация:
Переключитесь на параллельный веб-сервер, такой как Unicorn или Puma на JRuby, который позволяет dyno управлять собственной очередью запросов и избегать блокировки на длинные запросы.
У меня была неопределенно похожая проблема, которая проявлялась при доступе к серверу WEBrick через VPN. Запросы будут занимать много времени, в большинстве случаев ничего не происходит на проводе. Так как ни mongrel
ни thin
gems работал с Ruby1.9 в Windows, и я никак не мог втянуть себя в компиляцию исходного кода, мне нужно было придерживаться WEBrick.
Исправление было установить параметр конфигурации DoNotReverseLookup
в true
, при создании сервера WEBrick:
server = HTTPServer.new {:DoNotReverseLookup => true, ...}
Ты можешь использовать Apache
или установить Thin
, В вашем Gemfile: gem 'thin'
Или вы можете проверить список веб-серверов для рельсов.
Я часто испытывал 10-секундные задержки с Синатрой. Этот фрагмент решил это для меня.
Добавьте это в верхней части вашего 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
Посмотреть источник
Пытался сделать это с помощью webrick на 1.8.7 и не смог найти конфигурацию для изменения. Однако чит можно использовать для добавления в файл hosts на сервере, на котором выполняется webrick, IP-адрес, который он пытается отменить поиск.
Это старая ветка вопросов и ответов, которая помогла мне решить :DoNotReverseLookup
проблема на локальной виртуальной машине разработки и хотел добавить дополнительную информацию. Эта веб-страница объясняет ошибку регрессии в ядре Ruby, которая приводит к появлению этой проблемы для некоторых; акцент мой; Короче говоря, есть запрос на GitHub для исправления ядра Ruby, и, надеюсь, он будет одобрен и объединен в скором выпуске Ruby:
После нескольких часов поиска неисправностей, оказалось, что это так! По-видимому, где-то в процессе эволюции стандартной библиотеки Ruby с 1.8.6 до 2.0.0, WEBrick приобрел новую опцию конфигурации
:DoNotReverseLookup
это установлено вnil
по умолчанию. Затем, в глубине души кода обработки запросов WEBrick, он устанавливаетdo_not_reverse_lookup
флаг на экземпляре сокета входящего соединения со значениемconfig[:DoNotReverseLookup]
, Поскольку это значениеnil
, что ложно, эффект такой же, как установка егоfalse
переопределяя глобальныйSocket.do_not_reverse_lookup
флаг. Итак, если у вас нет:DoNotReverseLookup => true
в вашей конфигурации WEBrick обратный поиск DNS всегда будет происходить для каждого нового соединения, что может вызвать серьезную задержку.
С этим открытием связан запрос от автора на GitHub, в котором предлагается исправление проблемы в исходном коде Ruby WEBrick: исправление ошибки регрессии в реализации опции конфигурации WEBrick's:DoNotReverseLookup #731
Решение, как указано в запросе, состоит в том, чтобы изменить строку 181 в lib/webrick/server.rb
из этого:
sock.do_not_reverse_lookup = config[:DoNotReverseLookup]
К этому:
unless config[:DoNotReverseLookup].nil?
Делитесь здесь, если кто-то наткнется на эту хорошо продуманную ветку вопросов / ответов и заинтересован в прогрессе в решении этой проблемы в ядре Ruby. Надеемся, что это извлечение будет объединено или основная проблема будет решена каким-либо образом в следующем выпуске Ruby; может быть 2.1.6?
Это очень поздний ответ, но я потратил большую часть дня на отладку этой самой проблемы, когда Rails работал на Vagrant. Изменение обратного просмотра DNS фактически не улучшило время запроса. Сочетание двух вещей увеличило загрузку моей страницы с ~20 секунд до ~3 секунд в режиме разработки:
Заменить WEBrick на дворнягу. Мне пришлось использовать предварительную версию, иначе она не установилась:
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
Здесь нет DoNotReverseLookup
опция в ruby 1.8.x вебрик. Решение состоит в том, чтобы поставить:
Socket.do_not_reverse_lookup = true
где-то в начале вашего сценария.
Источник: WEBrick и Socket.do_not_reverse_lookup: рассказ в двух действиях
В моей, вероятно, редкой ситуации, это работало после того, как я сбросил свои iptables, у этого не было никаких побочных эффектов, потому что у меня не было никаких пользовательских правил (только Ubuntu по умолчанию разрешает все):
sudo iptables -F