Inicialização lenta do servidor ao usar Phusion Passenger e Rails

87

Para entrar no vagão da banda do Phusion Passenger, configuramos um servidor de teste para um pequeno aplicativo rails para testar as coisas.

Até agora tem sido muito bom de usar, torna a instalação / configuração e implantação de aplicativos uma brisa. O problema é que o site que estamos usando não é acessado com muita frequência e parece desligar os servidores em segundo plano. O que significa que quando alguém vai ao site, eles têm uma espera muito longa até que um novo servidor seja inicializado para lidar com a solicitação. Nós lemos a documentação, tentamos algumas configurações diferentes (modos smart / smart-lv2, passageidletime etc) e ainda não encontramos uma solução real.

Depois de examinar os resultados do Google, não conseguimos encontrar informações úteis. Atualmente, temos um cron job que faz solicitações de vez em quando na tentativa de manter os servidores em execução.

Alguém mais está enfrentando esse problema e você tem algum conselho para corrigi-lo?

tsdbrown
fonte
Também encontrei esta pepita no site do Passenger Doc: modrails.com/documentation/…
dewrich
@dewrich Eu encontrei uma ferramenta ( wekkars.com ) que faz exatamente o que seu cronjob está fazendo
SteenhouwerD

Respostas:

119

O que está acontecendo é que seu aplicativo e / ou ApplicationSpawners estão fechando devido ao tempo limite. Para processar sua nova solicitação, o Passenger deve iniciar uma nova cópia do seu aplicativo, o que pode levar vários segundos, mesmo em uma máquina rápida. Para corrigir o problema, existem algumas opções de configuração do Apache que você pode usar para manter seu aplicativo ativo.

Aqui está especificamente o que fiz em meus servidores. O PassengerSpawnMethod e PassengerMaxPreloaderIdleTime são as opções de configuração mais importantes em sua situação.

# Speeds up spawn time tremendously -- if your app is compatible. 
# RMagick seems to be incompatible with smart spawning
# Older versions of Passenger called this RailsSpawnMethod
PassengerSpawnMethod smart

# Keep the application instances alive longer. Default is 300 (seconds)
PassengerPoolIdleTime 1000

# Keep the spawners alive, which speeds up spawning a new Application
# listener after a period of inactivity at the expense of memory.
# Older versions of Passenger called this RailsAppSpawnerIdleTime
PassengerMaxPreloaderIdleTime 0

# Just in case you're leaking memory, restart a listener 
# after processing 5000 requests
PassengerMaxRequests 5000

Usando o modo de geração "inteligente" e desligando PassengerMaxPreloaderIdleTime, o Passenger manterá 1 cópia do seu aplicativo na memória o tempo todo (após a primeira solicitação após iniciar o Apache). ApplicationOuvintes individuais serão forkremovidos desta cópia, o que é uma operação muito barata. Acontece tão rapidamente que você não consegue dizer se seu aplicativo teve ou não que gerar um ouvinte.

Se seu aplicativo for incompatível com geração inteligente, eu recomendo manter um PassengerPoolIdleTime grande e acessar seu site periodicamente usando curl e cronjob ou monit ou algo assim para garantir que o ouvinte permaneça vivo.

O Guia do usuário do passageiro é uma referência incrível para essas e outras opções de configuração.

editar : Se seu aplicativo for incompatível com geração inteligente, existem algumas novas opções que são muito boas

# Automatically hit your site when apache starts, so that you don't have to wait
# for the first request for passenger to "spin up" your application. This even
# helps when you have smart spawning enabled. 
PassengerPreStart http://myexample.com/
PassengerPreStart http://myexample2.com:3500/

# the minimum number of application instances that must be kept around whenever 
# the application is first accessed or after passenger cleans up idle instances
# With this option, 3 application instances will ALWAYS be available after the
# first request, even after passenger cleans up idle ones
PassengerMinInstances 3

Portanto, se você combinar PassengerPreStart e PassengerMinInstances, o Passenger ativará 3 instâncias imediatamente após o carregamento do apache e sempre manterá pelo menos 3 instâncias ativadas, de modo que seus usuários raramente (ou nunca) verão um atraso.

Ou, se você estiver usando o spawning inteligente (recomendado) PassengerMaxPreloaderIdleTime 0já, você pode adicionar PassengerPreStartpara obter o benefício adicional da inicialização imediata.

Muito obrigado aos heróis de phusion.nl !

John Douthat
fonte
Muito obrigado pela sua resposta. Acredito que tentamos a maioria dessas configurações, mas talvez não na combinação correta. Vou fazer o teste amanhã e reverter.
tsdbrown
Isso é incrível. Eu estava tendo o mesmo problema com a instalação do meu Nginx / Phusion Passenger e isso me ajudou tremendamente.
Scott Anderson
Tentei essa configuração e não vi melhorias de desempenho, mas nosso aplicativo está usando RMagick. Existem soluções alternativas para isso? Por que não funciona com RMagick?
Chip Castle
1
RailsSpawnMethodfoi descontinuado em favor de PassengerSpawnMethod modrails.com/documentation/…
paulus
Olá, estou tendo o mesmo problema e gostaria de tentar essa configuração, mas não sei onde essa configuração deve ser colocada. obrigado!
joseramonc
41

Apenas no caso de haver algum usuário do servidor nginx se deparando com esta questão, ambas as diretivas 'PassengerMaxRequests' e 'PassengerStatThrottleRate' não se traduzem em nginx. No entanto os outros fazem:

rails_spawn_method smart;
rails_app_spawner_idle_time 0;
rails_framework_spawner_idle_time 0;
passenger_pool_idle_time 1000;

HTH!

EDIT rails_spawn_methodestá obsoleto no passageiro 3 em vez de usar

passenger_spawn_method smart; 

tudo o resto é bom até agora.

Gav
fonte
7
Obrigado por isso. Uma coisa a notar é que eu tive que preencher o passageiro_pool_idle_time em meu nginx.conf principal com as outras configurações globais em vez de apenas na configuração do site específico onde o rails foi habilitado.
Scott Anderson
mas erro no passageiro 4:"passenger_max_preloader_idle_time" directive is duplicate
TangMonk
2

RÉ:

# Additionally keep a copy of the Rails framework in memory. If you're 
# using multiple apps on the same version of Rails, this will speed up
# the creation of new RailsAppSpawners. This isn't necessary if you're
# only running one or 2 applications, or if your applications use
# different versions of Rails.
RailsFrameworkSpawnerIdleTime 0

Apenas algo a acrescentar e pode ser útil.

O método de spawn padrão na versão atual é "smart-lv2", que ignora o spawner do framework, então definir o tempo limite do spawner do framework não teria efeito de qualquer maneira, a menos que você definisse explicitamente o método de spawn como "smart".

Fonte: http://groups.google.com/group/phusion-passenger/browse_thread/thread/c21b8d17cdb073fd?pli=1

Shuoling Liu
fonte
1

Se o seu host for um servidor compartilhado, como o meu, você não pode alterar as configurações e está preso a um cron job.


fonte
Felizmente não é para esta aplicação em particular. Mas terei isso em mente no futuro, obrigado.
tsdbrown
1

Eu também tive esse problema, mas não consegui alterar as configurações do passageiro porque não tinha permissão de gravação neste arquivo. Encontrei uma ferramenta ( http://www.wekkars.com ) que mantém meu aplicativo respondendo rapidamente. Talvez isso também possa ser uma solução para você.

SteenhouwerD
fonte
0

verifique a versão do passageiro. era RailsSpawnMethod <string>para versões antigas.

Se sim (se bem me lembro), substitua Passenger por Rails em todas as diretivas de configuração ou procure por documentos antigos de passageiros para obter mais detalhes

JmJ
fonte