Melhorando na configuração do servidor

1

Estou tentando melhorar o desempenho de uma instalação do Drupal (6) sob carga. Um servidor web, um servidor db (MySQL5) ambos são Single Socket Quad Intel Xeon 2.5GHz com 16GB de RAM. No servidor da web, estou executando o APC para melhorar o desempenho do PHP. Executando um servidor memcached com 6 compartimentos no servidor de banco de dados. Usando o Apache Solr para poder pesquisar, Solr também mora no servidor de banco de dados.

O afunilamento parece ser o Apache no servidor da Web, pois ele fica sem memória sob a carga. Nenhum processo único parece sobrecarregar muito os recursos do sistema disponíveis.

Qualquer entrada seria muito apreciada. Se houver perguntas que eu possa responder sobre a configuração, por favor, pergunte.

Obrigado!

    
por rrlange 26.09.2009 / 18:13

4 respostas

3

Já que estamos falando de PHP, eu suponho que você esteja usando o MPM do Prefork Apache. As atitudes de Rasmus Lerdorf em multithreading , você deve continuar usando o Apache prefork ou uma configuração similar sem thread com outro servidor HTTP (como o nginx).

4 vitórias rápidas vêm à mente. Eu não posso dizer da pergunta original do OP se isso já foi feito - se não, essas 4 melhorias devem trazer uma melhora substancial.

a) Mova a entrega de arquivos estáticos (CSS, imagens, etc) para longe de suas instâncias do PHP Apache. Com o Prefork MPM, quando você envia uma única imagem para um usuário, todo um filho do Apache com o tempo de execução PHP inteiro é mantido ocupado para enviar aquela imagem única. Isso poderia ser um processo Apache de 20 a 40 MB ocupado por 0,1 a 3 segundos enquanto o usuário baixa essa imagem - no mesmo tempo em que a instância do Apache poderia ter servido dezenas ou centenas de páginas dinâmicas. Sugestão: configure um servidor dedicado para recursos estáticos ou use um CDN barato como o Amazon CloudFront.

b) Desative HTTP keepalives na instância do Apache que serve conteúdo dinâmico (Drupal). O keepalive HTTP é ótimo e tem seus usos, mas, novamente, com keepalives em & O Apache prefork MPM, um navegador de usuário final único, manterá o "bloking" (isto é, ocupando) um filho do Apache por longos períodos.

c) Verifique se você está enviando os cabeçalhos HTTP apropriados , especialmente se o conteúdo estático, como imagens, CSS, etc., é capaz de armazenar em cache. Caso contrário, o navegador do usuário reduzirá esse conteúdo estático em cada exibição de página, o que é um desperdício total. Use Yahoo! YSlow , RED de Mark Nottingham ou ferramentas similares.

d) Configure outro servidor da Web e use apenas DNS round robin para distribuir a carga entre os dois servidores da web. Eu suponho que o Drupal pode manter o estado da sessão armazenado no banco de dados MySQL (a maioria dos aplicativos PHP pode)? Em caso afirmativo, o armazenamento de sessão será atendido e você poderá usar o round robin de DNS.

O round robin de DNS não é ideal. Não manipula uma falha de um servidor, não garante uma distribuição de carga perfeita. Mas é fácil de configurar e geralmente funciona bem o suficiente para uma configuração simples com 2 ou talvez 3 servidores da Web.

    
por 26.09.2009 / 21:31
0

Você pode configurar nginx ou lighttpd para servir arquivos estáticos (css / js / images / videos) na frente do servidor apache.

Outra técnica é o cache de páginas estáticas. Eu acho que o Módulo Boost pode fazer algo assim. Ou se você tiver tempo e recursos, crie seus próprios módulos drupal para gerar arquivos html estáticos, em vez das páginas dinâmicas do php.

    
por 26.09.2009 / 21:02
0

Você já tentou pressflow é o Drupal com alguns ajustes de desempenho e escalabilidade.

    
por 14.10.2009 / 13:41
-1

Abandone o Apache em favor de algo mais leve como o nginx?

    
por 26.09.2009 / 18:33