Avisos de otimização para o servidor de muitos arquivos pequenos

1

Eu tenho a configuração nginx + php-fpm + apc. Sem DB. Na pasta de dados eu tenho um script php simples que quando chamado com o parâmetro filename verifica se o arquivo existe, se isso acontecer, então ele o libera, se não, então ele faz o download na mesma pasta e depois o entrega. A velocidade é muito importante, agora são necessários 70ms para gerar o arquivo no navegador.

Os arquivos são imagens com tamanho de 1-2kb. Com essa taxa em alguns meses, haverá alguns milhares de imagens nessa pasta. E esse script será chamado dezenas de vezes por segundo (talvez mais). Então, eu tenho medo que o servidor comece a lutar.

Você pode me aconselhar:

Ajustes de nginx

- Ajustes do sistema

-Devo executar algum tipo de manutenção de HDD agora e depois?

O que mais você recomendaria nessa situação?

RAM: 386MB (atualizável) CPU: Xeon E5506 @ 2.13GHz CentOS 6

Atualização # 1 Uma ideia interessante: Não faça o PHP checar se existe um arquivo - faça com que o nginx tente servir o arquivo diretamente, então volte ao PHP como um manipulador 404. Se você deixar o nginx para fazer o seu trabalho, ele deve servir facilmente ~ 1.000 imagens de 2kb / s sem ajustes.

    
por Jim 16.12.2011 / 22:25

3 respostas

1

É difícil ser específico, pois isso exigiria muito mais informações. Se as imagens não forem geradas dinamicamente em cada solicitação, faria sentido não passá-las por meio de um script a cada vez, ou seja, torná-las estáticas. Se as imagens não mudam com freqüência, eu tentaria armazenar a maioria delas na memória. Você pode evitar um monte de E / S de disco, já que muitas imagens pequenas podem ser colocadas na memória por serem tão pequenas.

Temos experiências muito boas com o uso do Verniz para isso. É um chamado cache de proxy reverso, o que significa que ele receberá solicitações recebidas dos clientes, verificará seu cache, servirá o objeto solicitado diretamente do cache ou o recuperará primeiro do servidor nginx de backend. O verniz pode lidar facilmente com muitos milhares de solicitações por segundo com uso muito baixo de CPU e E / S. Os tempos de resposta são muito rápidos. Estamos recebendo tempos de resposta de 20 a 30 ms, e metade disso é o que leva os elétrons a viajar para lá e para cá.

Coloque o verniz na frente do nginx e certifique-se de que cada imagem exclusiva tenha um URL exclusivo. Coloque alguns gigabytes de RAM em seu servidor e configure o Varnish para usar a maior parte dele em seu cache. Se as suas imagens forem 1-2kB, 1GB ou RAM podem armazenar em cache cerca de 500-1000 imagens. O verniz funciona bem com seu conjunto de regras padrão, mas é muito sintonizável, o que lhe dá uma vantagem sobre a maioria dos outros caches de proxy.

Certifique-se de que seu aplicativo não define cookies no domínio ou ajuste o verniz para descartar cookies para os URLs que apontam para as imagens, pois ele tomará o cuidado de não armazenar a solicitação em cache se ela contiver cookies. Além disso, faça com que seu aplicativo retorne os cabeçalhos de expiração (consulte "Cache-Control: max-age") que estão longe o suficiente no futuro para tornar o armazenamento em cache útil. É fácil definir uma duração máxima de semanas e, se um objeto precisar expirar, seu aplicativo poderá limpar o objeto do cache do Verniz ou apenas fornecer a nova imagem em um novo URL.

    
por 16.12.2011 / 23:01
1

Não faça o PHP checar se existe um arquivo - o nginx tenta servir o arquivo diretamente, e depois volta ao PHP como um manipulador 404. Se você deixar o nginx para fazer o seu trabalho, ele deve servir facilmente ~ 1.000 imagens de 2kb / s sem ajustes.

    
por 16.12.2011 / 23:20
0

Honestamente, se você está confiando no sistema operacional subjacente para informá-lo se existe um arquivo ... você terá problemas quando atingir um grande número de arquivos. Quanto mais arquivos você tiver em um diretório ... quanto mais tempo essas pesquisas levarem. Diferentes formatos de sistemas de arquivos podem melhorar o trabalho ... mas ainda é um esforço caro.

Ao verificar se existe um arquivo ... o sistema de arquivos verificará de cima para baixo cada arquivo até encontrar aquele que você está procurando. com ext2 (por exemplo) Se você está procurando zzzz ... você deve passar por todos os arquivos de um - > zzzz antes de encontrá-lo ..

Seria melhor fazer uma longa lista de ajustes para contornar essa pilha de dores de cabeça. Ou seja, armazenar em cache os resultados da pesquisa ... limitar o número de arquivos nos diretórios ... analisar os arquivos em vários diretórios ... etc ...

    
por 16.12.2011 / 23:01