
Eu tenho um servidor Ubuntu rodando o Apache2 que espero ser atingido por cerca de 500-1000 usuários (simultâneos) por um período limitado de tempo. O servidor serve uma mistura de páginas php personalizadas (bastante leves) conectadas a um banco de dados postgresql (cerca de 20 Mb de tamanho) e conteúdo estático. O hardware é estável e bastante robusto:
- Intel Xeon E5420 a 2,5 GHz
- 12 GB de RAM
Durante os rushes anteriores neste servidor, aumentei o ServerLimit, os MaxClients para os módulos MPM e diminuí o Timeout e o KeepAliveTimeout. Funcionou, mas foi lento e tenho a sensação de que mais pode ser feito. Como você sugeriria configurar o servidor Apache para lidar com esse tipo de carga?
Responder1
Seu gargalo nesse cenário será o PHP e o que ele está fazendo com o banco de dados. Se você estiver abrindo uma nova conexão com cada chamada, é mais do que provável que você atinja paredes de E/S no acesso ao disco mais do que qualquer outra coisa. Sua melhor aposta é ter o banco de dados e o conteúdo estático em um disco RAM e confirmar as alterações necessárias no banco de dados no disco. Mantenha também um mecanismo de cache de consulta eficiente usando uma pesquisa rápida de hash dedicada à RAM no PHP para não sobrecarregar o postgresql com ciclos de processamento desnecessários relacionados a pesquisas de cache de consulta. Embora o postgresql provavelmente seja mais eficiente no cache de consultas do que o seu próprio código, ele não é tão rápido quanto nunca precisar estar conectado.
Responder2
Seu servidor deve ser capaz de lidar com as coisas facilmente. Apenas algumas notas:
- O uso de SSL aumentará seus requisitos computacionais. Portanto, use HTTP simples.
- Usar o MPM pré-fork aumentará seus requisitos de memória. Portanto, use o trabalhador MPM.
- Usar mais simultaneidade com mais núcleos melhorará o desempenho.
- Dedique mais RAM ao seu banco de dados PostgreSQL.
Estas são apenas diretrizes genéricas.