Como faço perfil um servidor Linux + Apache + MySQL + PHP para velocidade?
Eu tenho um servidor com uma instância mediawiki fortemente modificada em execução no Ubuntu 8.04. É um pouco lento - eu não fiz nada para otimizar ainda, então tenho certeza que há muita fruta baixa para torná-lo um pouco mais rápido.
Mas para otimizar você precisa medir primeiro. Como faço para descobrir quais dos componentes (apache, php, mysql) ocupam o maior pedaço de tempo para servir uma página?
Bem, quando seu perfil algo parecido com isso para encontrar o gargalo, você precisa governar as coisas uma por uma. Você precisará de uma linha de base para obter comparações contra. Se você tiver a ferramenta "AB" instalada (vem com o Apache), você pode usar isso.
Para obter sua linha de base, recomendo obter a média de pelo menos algumas centenas de pedidos. Aqui está um exemplo:
$ ab -n 400 http://yousite/
Olhe através dos resultados para a linha de "tempo por solicitação", vai parecer algo como:
Time per request: 96.031 [ms] (mean)
Anote esse tempo como esta é a linha de base.
Para descartar o Apache como o culpado faz uma página estática no seu servidor (basta salvar o HTML de uma página que você considera lento/lento) e execute ab contra ele novamente.
Jogue alguns PHP para a página estática. Não precisa ser uma grande quantidade, mas deve estar realmente fazendo algum trabalho. O MediaWiki é muito bom código, então se houver um gargalo PHP em seu sistema, meu dinheiro estaria no carregamento real da pilha PHP na memória e executar o teste novamente.
Olhe para os três números e veja onde o maior salto é entre o próximo passo. Minha aposta seria no MySQL sendo o mais lento dos três, mas poderia muito bem ser que você está carregando muitas imagens em uma página que está desacelerando o tempo total de solicitação, caso em que você pode querer repensar o design do página.
Executamos uma boa instalação do MídiaWiki e notamos rapidamente que o MediaWiki se beneficia muito de ter uma instância memcachada. Caso contrário, ele deve carregar muitos arquivos de idioma e dados do usuário em todas as solicitações.
Também é extremamente importante é a configuração do módulo de pré-trabalho. Eu reduzi drasticamente os números na seção específica de /etc/apache2/apache2.conf. Desde então, eu tinha latência maciça, onde a página estaria parando por um minuto Antes de terminar o carregamento ... Rastreamento com módulos de traço e desenvolve do Drupal, ASWELL como perfil com Xdebug deixou-me sem noção. Eu configuro a APC e moddei o MySQL CONF, mas o culpado na verdade era os valores muito pequenos para o módulo de pré-trabalho. Eu levantei Aqueles a um nível moderado e suficiente e agora o servidor está de volta ao relâmpago rápido. Cuidado com esses números se você tiver tempos de execução inexplicáveis de alta página ....
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
# original values:
# MaxSpareServers 10
# MaxClients 150
# far too conservative experimental values:
# MaxSpareServers 5
# MaxClients 5
# good compromise:
MaxSpareServers 10
MaxClients 20
MaxRequestsPerChild 0
</IfModule>
Esses valores são para um ambiente de host virtual com 512MIB RAM + 256MIB SWAP .. Boa sorte encontrar o seu servidor otimizado;)
Zombat e Frank Farmer Tenha um par de boas sugestões (gosto da sugestão de consulta lenta, eu mesmo) em Stack Overflow 697802 . AB para o Apache também é bastante útil para testar as alterações que você faz.