Configuração do Apache para visualização de página alta, usuários de sessão longa - variáveis KeepAlive e MaxRequest

1

Atualmente, estou executando um aplicativo da web que vê vários (~ 15) usuários fazendo login uma vez por dia e, em seguida, deixando o aplicativo da web aberto, onde é atualizado automaticamente com novos conteúdos a cada 5 minutos. Cada usuário tende a tê-lo aberto por cerca de 15 a 18 horas.

No entanto, em massa crítica (~ 30-40) os usuários começam a desacelerar drasticamente e o processo HTTPD começa a aumentar o uso da memória. Eu adicionei um cron job que reinicia o apache uma vez por hora, mas isso só ajuda um pouco. Todo o conteúdo é gerado dinamicamente e novo tempo de armazenamento, portanto, o armazenamento em cache de páginas não é uma opção.

Comecei a brincar com as opções Timeout, MaxRequest e KeepAlive, mas qualquer orientação seria muito apreciada, pois sempre deixei essas opções no padrão.

Aqui está o que eu tenho. Quaisquer gênios do apache têm idéias sobre como otimizar essa configuração para o cenário acima? Eu imaginei que um tempo limite longo é bom porque os tempos de carregamento às vezes podem ficar muito altos.

# Timeout: The number of seconds before receives and sends time out.

Timeout 200

# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.

KeepAlive On

# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.

MaxKeepAliveRequests 100

# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.

KeepAliveTimeout 60

# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# ServerLimit: maximum value for MaxClients for the lifetime of the server
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule prefork.c>
StartServers       16
MinSpareServers    10
MaxSpareServers   20
ServerLimit      256
MaxClients       256
MaxRequestsPerChild  4000
</IfModule>
    
por JiminyCricket 05.08.2010 / 20:25

2 respostas

0

(simplifiquei os números para maior clareza, especialmente a parte da memória é muito alta)

Sua família MaxRequestsPerChild atualmente é 4000, pois você recebe 50 usuários por dia, que todos atualizam a cada 5 minutos por 18 horas, totalizando 600 solicitações por hora e 10800 solicitações por dia. Para referência, um usuário usa 218 conexões por dia.

Isso significa que os processos filhos são reiniciados 2,7 vezes ao dia. Se o seu aplicativo usa 50M de memória por recarga e consegue liberar 49M dele 1M por atualização, 50M para 50 usuários e 4G para 4000 recarregamentos. E a criança será morta.

Você deve inspecionar a quantidade de memória que seu aplicativo usa e definir esses valores de acordo com isso.

Se o seu servidor tiver 20G de memória, o vazamento de 1M funcionaria, mas a alteração de MaxRequestsPerChild para, por exemplo, 1000 faria com que o consumo de memória antes do reinício da criança fosse quatro vezes menor.

Para uma observação, você pode querer reduzir MaxClients para algo como 100 e garantir que não haja mais usuários do que você pensa. Dessa forma, problemas acidentais não farão com que o servidor perca muitas solicitações. Esse KeepAliveTimeout pode ter algo como 15 segundos, já que os usuários atualizam apenas a cada 5 minutos.

    
por 22.10.2010 / 15:35
1

Acho que você precisa jogar com a diretiva MaxRequestsPerChild . Reiniciar o apache a cada hora não parece uma solução elegante para mim. MaxRequestsPerChild cada processo será reiniciado automaticamente assim que exibir o número de solicitações definido. Tente configurá-lo para 100?

Usar também um servidor da web muito mais leve (como o nginx ) para alimentar os clientes lentos e servir mídia estática vai tirar bastante carregar do apache.

    
por 05.08.2010 / 22:40