Webrick é muito lento para responder. Como acelerar?

88

Eu tenho um aplicativo Rails que estou executando no meu servidor. Quando vou para uma área de trabalho remota e tento carregar o aplicativo, o servidor leva cerca de 3-4 minutos para responder com uma página HTML simples. No entanto, quando eu carrego a página localmente no servidor, a página aparece em apenas um segundo. Tentei fazer o ping do servidor de minha área de trabalho remota e os pings estão funcionando com êxito em um período de tempo razoável.

Tudo parece ter começado depois que instalei o cliente básico da Oracle e o SQLPLUS. Devo suspeitar da Oracle? Alguém experimentou algo semelhante a isso?

Prof. Falken
fonte
2
Talvez isso agora deva ser movido para serverfault?
Prof. Falken de
Não há necessidade, isso pode ser resolvido simplesmente modificando uma linha em um arquivo de configuração
Mosty Mostacho
2
@AmigableClarkKant Webrick é mais uma ferramenta de desenvolvedor, então parece melhor permanecer no SO.
David
Deus, e o tempo todo atribuí o problema ao vmware, queimar no inferno webrick :(
prusswan 01 de

Respostas:

139

Tendo o mesmo problema aqui (mesmo um ano depois). No Linux, você deve fazer o seguinte:

Procure o arquivo /usr/lib/ruby/1.9.1/webrick/config.rb e edite-o.

Substitua a linha

:DoNotReverseLookup => nil,

com

:DoNotReverseLookup => true,

Reinicie o webrick e funcionará perfeitamente :)

Mosty Mostacho
fonte
21
Funcionou! Tive problemas com a lentidão do Webrick ao servir conteúdo estático de outro computador em nossa rede local. Isso resolveu tudo. A única diferença era que config.rb estava em: ~ / .rvm / rubies / ruby-1.9.2-p180 / lib / ruby ​​/ 1.9.1 / webrick / config.rb - porque estamos usando RVM.
Slobodan Kovacevic
btw, eu não tinha essa chave, então eu apenas adicionei e funcionou
ecoologic
onde você adicionou isso? que seção?
Abe Petrillo
Deve estar na seção Geral de acordo com ruby-doc.org/stdlib/libdoc/webrick/rdoc/classes/WEBrick/… .
David Grayson
10
A versão do ruby ​​que tenho é ruby-1.8.7-p330 e não parece ter a opção DoNotReverseLookup. A string "DoNotReverseLookup" não aparece no config.rb do webrick ou em qualquer lugar em ~ / .rvm / rubies / ruby-1.8.7-p330 / lib / ruby ​​/ 1.8. Existe alguma maneira legal de corrigir esse problema no ruby-1.8.7-p330?
David Grayson
36

Tive o mesmo problema. Para mim, este post foi a solução. Se você estiver no Ubuntu, pare (ou desinstale) o avahi-daemon. service avahi-daemon stoppára o daemon.

Webrick agora parece muito rápido.

O problema tem um relatório antigo no Rails Lighthouse , entretanto, Ruby-on-Rails mudou seus tickets para o github desde então; É uma pena que esse velho problema ainda persista.

Porém, esteja ciente de que se você realmente usar avahi-daemon para algo, como localizar impressoras e scanners em sua rede, isso não funcionará mais.

Prof. Falken
fonte
1
Muito obrigado !! Resolveu meu problema no Ubuntu 11.04 / 11.10 / 12.04
SMMousavi
1
Bem, esta resposta parece ser o herói anônimo para mim!
PCoder de
1
Isso fez isso por mim também. Executando um aplicativo OLD (1.8.7) no Ubuntu 13.04
TerryS
1
esta solução realmente me coloca em problemas, pois interromper isso faz com que os serviços de rede enlouqueçam! verifique o seguinte url forums.fedoraforum.org/showthread.php?t=124837
Isaiyavan Babu Karan
23

Só tive o mesmo problema. o

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

fez o truque para mim também. Apenas no caso de você estar executando Ruby sob o rvm, aqui está o caminho a seguir:

~/.rvm/rubies/ruby-<version>/lib/ruby/<version>/webrick/config.rb
Kjellski
fonte
1
Obrigado! Antes de encontrar sua resposta, pesquisei .rvm e não encontrei o webrick, alterei o / usr / lib e isso não ajudou. Isso funcionou.
B, 7 de
@KenBarber Com certeza não é uma boa direção, mas para ter um ciclo de desenvolvimento pequeno e bom, é normal fazer apenas esta modificação em sua instalação RVM local. E a propósito, é apenas o seu perfil de usuário, você não vai incomodar mais ninguém ...
Kjellski
1
@Kjellski talvez você esteja certo, mas não persiste durante as atualizações, nem é uma solução que você possa repassar facilmente para seus colegas desenvolvedores. Talvez um patch monkey no Rails neste caso seja melhor encolher os ombros . De qualquer forma, está corrigido agora: github.com/rails/rails/commit/… ...
Ken Barber
15

"Thin" agora é uma ótima opção para executar localmente e no Heroku:

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

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

Você pode usá-lo localmente, colocando em seu Gemfile:

gem "thin"

... e então execute bundle e inicie seu servidor com thin startou rails s.

Atualização no Heroku

Thin agora é considerado uma escolha ruim para Heroku. Mais informações aqui:

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

Sua recomendação:

Mude para um back-end da web concorrente, como Unicorn ou Puma no JRuby, que permite ao dinamômetro gerenciar sua própria fila de solicitações e evitar o bloqueio de solicitações longas.

Jamon Holmgren
fonte
Uma solução perfeita por não alterar códigos ou nada no sistema.
Fernando Kosh
Acontece que o Sinatra usa o thin em vez do webrick automaticamente se estiver instalado. Tudo que eu tive que fazer é gem install thin. Consulte sinatrarb.com/intro.html . Recomenda-se também executar o gem install thin, que Sinatra selecionará se disponível. EDIT: melhorias drásticas de desempenho. De 1.3s a 0.05s.
GuiSim
6

Tive um problema vagamente semelhante que se manifestou ao acessar um servidor WEBrick por meio de uma VPN. Os pedidos levariam muito tempo, a maioria sem acontecer nada na transmissão. Já que nem mongrelnem thingems funcionavam com Ruby1.9 no Windows e não havia como eu me envolver em compilar coisas do código-fonte, eu precisava ficar com o WEBrick.

A correção foi definir o parâmetro de configuração DoNotReverseLookuppara true, ao criar o servidor WEBrick:

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

Você pode usar Apacheou instalar Thin. Em seu Gemfile:gem 'thin'

Além disso, você pode verificar a lista de servidores web para trilhos .

Uladz Kha
fonte
2

Estava tentando fazer isso com o webrick em 1.8.7 e não conseguia encontrar a configuração para alterar. No entanto, um truque que você pode usar é adicionar ao arquivo hosts do servidor que está executando o webrick o endereço IP que está tentando reverter a pesquisa.

patrickdavey
fonte
Ótimo. Isso é melhor do que editar algum arquivo webrick que precisa ser alterado após cada atualização.
Petr
No meu caso, a entrada a ser adicionada (para o convidado Linux executando o webrick) seria o endereço IP do host do Windows
prusswan 01 de
2

Eu experimentei atrasos de 10 segundos freqüentemente com Sinatra. Este trecho resolveu para mim.

Adicione isto próximo ao topo do seu app.rbarquivo

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

Veja a fonte

neoneye
fonte
1

Este é um antigo tópico de perguntas e respostas que me ajudou a resolver o :DoNotReverseLookupproblema em uma máquina virtual de desenvolvimento local e queria adicionar informações adicionais. Esta página da web explica o erro de regressão no núcleo Ruby que faz com que esse problema apareça para alguns; ênfase é minha; Resumindo, há uma solicitação de pull do GitHub para uma correção do núcleo Ruby para isso e esperançosamente será aprovado e mesclado em uma versão em breve do Ruby:

Depois de algumas horas de solução de problemas, descobriu-se que sim! Aparentemente, em algum momento ao longo da evolução da lib padrão do Ruby de 1.8.6 para 2.0.0, WEBrick adquiriu uma nova opção de configuração :DoNotReverseLookupque é definida como nilpadrão. Então, nas entranhas do código de processamento de solicitação do WEBrick, ele define o do_not_reverse_lookupsinalizador na instância do soquete de conexão de entrada com o valor de config[:DoNotReverseLookup]. Como esse valor é nil, o que é falso, o efeito é o mesmo que configurá-lo como false, substituindo o Socket.do_not_reverse_lookupsinalizador global . Portanto, a menos que você tenha: DoNotReverseLookup => truena configuração do WEBrick, a pesquisa reversa de DNS sempre acontecerá para cada nova conexão, potencialmente causando latência séria.

Relacionado a esta descoberta está uma solicitação de pull do GitHub do autor propondo como reparar o problema no código-fonte do Ruby WEBrick: Corrigir bug de regressão no WEBrick: Implementação da opção de configuração DoNotReverseLookup # 731

A solução, conforme descrito na solicitação, é alterar a linha 181 lib/webrick/server.rbdesta:

sock.do_not_reverse_lookup = config[:DoNotReverseLookup]

Para isso:

unless config[:DoNotReverseLookup].nil?

Compartilhando aqui se alguém tropeçar neste tópico bem considerado de perguntas / respostas e estiver interessado no progresso na resolução deste problema no núcleo Ruby. Esperançosamente, essa atração será mesclada ou o problema subjacente será tratado de alguma forma na próxima versão do Ruby; talvez 2.1.6?

Giacomo1968
fonte
0

Esta é uma resposta muito tardia, mas eu passei uma boa parte do dia depurando esse mesmo problema com Rails rodando em Vagrant. Alterar a pesquisa DNS reversa não melhorou de fato os tempos de solicitação. Uma combinação de duas coisas levou meu carregamento de página de aproximadamente 20 segundos a aproximadamente 3 segundos no modo de desenvolvimento:

Substitua WEBrick por mongrel. Tive que usar a versão de pré-lançamento ou não iria instalar:

sudo gem install mongrel --pre

Em seguida, adicione-o ao meu Gemfile para dev:

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

Iniciei meu servidor assim:

rails server mongrel -e development

Isso cortou alguns segundos, 5 ou 6 segundos, mas ainda era terrivelmente lento. Esta foi a cereja do bolo - adicione isso também ao Gemfile:

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

Em minha situação provavelmente rara, funcionou depois de liberar meus iptables, isso não teve nenhum efeito colateral porque eu não tinha nenhuma regra personalizada (apenas o padrão do Ubuntu permite todos):

sudo iptables -F
Nabil Kadimi
fonte