Servidor sendo atingido com algumas solicitações por segundo

2

Eu gerencio um site de hospedagem de imagens. Meu servidor pode chegar a qualquer lugar entre 8 solicitações por segundo e 20 solicitações por segundo durante os horários de pico. Atualmente, estou executando um servidor no hardware atual:

Processador AMD Hexa-Core Velocidade 6 Núcleos x 2,8 GHz (3,3 Turbo Core) RAM 16 GB DDR3 Espaço no disco rígido ECC 1.000 GB (2 x 1.000 SATA) RAID de software RAID 1

Especificações completas link Eu pedi o XL6 servidor.

Eu não veiculo estaticamente as imagens, pois elas estão armazenadas em outro lugar no servidor. Eles são carregados dinamicamente em cada chamada com readfile (). O servidor tem sofrido uma surra recentemente e eu quero saber como posso otimizar o servidor para poder lidar com esse tipo de tráfego com facilidade.

Eu instalei o eaccelerator que parece estar ajudando, mas não ajudando o suficiente. Eu também tive X-SendFile instalado em um ponto, o que pareceu ajudar também, mas eu tive que removê-lo temporariamente por causa de problemas com o Apache, embora eu queira tentar recuperá-lo novamente.

Estou basicamente aqui pedindo conselhos para que eu possa usar meu servidor para lidar facilmente com 50 req por segundo (a menos que isso seja completamente irracional). Eu mesmo sou um desenvolvedor e não sei muito sobre linux / apache, embora eu conheça o básico. Eu também estou disposto a aprender. Obrigado por qualquer informação.

    
por MasterGberry 02.05.2012 / 08:08

3 respostas

5

Existem várias coisas que você pode fazer aqui. Por um lado, você menciona que você serve as imagens com readfile ()? Isso pode ser um culpado aqui, já que é o PHP que está servindo as imagens. Isso não é inerentemente muito mais lento do que servi-las estáticas e vem com vários benefícios (como o processamento dinâmico de imagens), mas você pode ter várias armadilhas como resultado. Do ponto de vista do servidor, é sempre muito mais rápido exibir imagens como estáticas.

Primeiro de tudo, é o seu script - aquele que retorna imagens - empurrando cabeçalhos corretos? Ou seja, você está enviando Cache-control e expira cabeçalhos que dizem aos agentes do usuário para armazenar imagens em cache? Seu tráfego pode vir do fato de suas imagens serem veiculadas o tempo todo ou com muita frequência. Envie também um cabeçalho Last-modified.

Você também pode enviar um cabeçalho Não modificado como uma resposta se um agente do usuário fizer uma solicitação para um arquivo e você souber que ele não foi modificado desde a data que o agente do usuário fornece.

Se você já configurou todos os cabeçalhos adequados e certificou-se de que os user-agents não estão solicitando inutilmente os dados que eles já possuem, então seu problema está no seu servidor web. Você fez algum teste de desempenho para ver se isso afeta apenas as imagens ou se afeta todas as solicitações em geral?

Eu sugiro tentar ver o quão poderoso seu servidor é ao servir solicitações regulares (PHP). Veja quanto tempo suas páginas demoram e compare-as com as solicitações de uma imagem. Eu sugiro uma boa ferramenta como Pylot para isso (é linha de comando, mas realmente útil).

(Note que, para comparação, é útil comparar uma página com tamanho X a uma imagem de tamanho X, de modo que a largura de banda seja igual e você possa apenas avaliar o desempenho).

EDITAR:

Os cabeçalhos de cache que informam aos agentes do usuário que fazem a solicitação para armazenar em cache o arquivo pelo maior tempo possível são os seguintes:

$lastModified=filemtime($myPicture); // File location of your image
$cacheDuration=31536000; // One year
// This tells user agent to keep the cache for one year
header('Cache-Control: public,max-age='.$cacheDuration);
header('Expires: '.gmdate('D, d M Y H:i:s',(time()+$cacheDuration)).' GMT');
// This tells the user agent the last modified time of your image
header('Last-Modified: '.gmdate('D, d M Y H:i:s',$lastModified).' GMT');

Exibição de cabeçalhos não modificados é um pouco mais complicada:

// Testing if the servers known last modified time is different from the last modified time of file on your server
// If those times are the same, then we will not return the image and just tell the user agent to use their cache
if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])>=$lastModified){
    // Cache headers (Last modified is never sent with 304 header, since it is often ignored)
    header('Cache-Control: public,max-age='.$cacheDuration);
    header('Expires: '.gmdate('D, d M Y H:i:s',(time()+$cacheDuration)).' GMT');
    // Returning 304 header
    header('HTTP/1.1 304 Not Modified');
    die();
}
    
por 02.05.2012 / 08:28
0

minha pergunta é, você realmente quer rotea-los através do PHP na saída? Isso é uma enorme quantidade de processamento multiplicado, considerando que cada página provavelmente visualiza várias imagens. então o PHP se torna o gargalo e é uma linguagem de script.

possivelmente pré-processe previamente as miniaturas para tamanhos específicos solicitados pelo site e armazene essas cópias. ocupa espaço extra, mas você obterá um pouco mais de velocidade se eu pensasse se as imagens pudessem se vincular diretamente a um arquivo em vez de serem veiculadas pelo PHP.

    
por 02.05.2012 / 08:38
0

Isso pode ser tanto uma pergunta quanto uma resposta, então talvez alguém com experiência possa avaliar isso. Um disco RAM seria de algum benefício nessa situação? Não sei quantas imagens você hospeda, mas e se você colocar as imagens mais acessadas (com o limite óbvio de quantas caberão no disco RAM) no disco RAM. Então, sempre que você ou um usuário adicionar ou editar uma foto, você fará a alteração em uma cópia permanente no disco, bem como na cópia armazenada na RAM. Com tantos pedidos chegando, você acha que cortar a etapa "ler do disco" ajudaria a acelerar as coisas.

    
por 02.05.2012 / 15:58