Atenção: Toda e qualquer opinião dita nesse artigo não pode ser considerada como uma verdade absoluta e que se aplicará a todos os projetos.
Tem um bom tempo que costumo participar de projetos bem interessantes que envolvem hospedagem de alto tráfego. Eu sou apaixonado pelo assunto, sempre busco aprender novas ferramentas e abordagens que envolva colocar um projeto em um servidor ou infraestrutura para aguentar centenas e até milhares de acessos simultâneos.
Semanalmente recebo algumas propostas de serviços pelo e-mail ou pelo meu telefone de projetos que precisam ter um servidor mínimo para aguentar vários acessos, o padrão é sempre o mesmo: Plataformas WordPress e lojas Magento.
Que fique claro, existem inúmeras formas de implementar um ambiente para um projeto de alto tráfego. Existem inúmeras tecnologias, o que muda na verdade é a confiança e experiência que cada profissional tem em cada uma delas, e claro, o custo envolvido no projeto.
Atualmente existem vários conceitos e tecnologias no mercado envolvendo DevOps, Nuvem e até Multi-Cloud. Nesse laboratório em específico pensei em ser o mais simples possível, usando tecnologias tradicionais (open source) mas que ainda estão longes de serem ultrapassadas, que inclusive grandes portais e empresas utilizam no seu dia a dia.
Tecnologias Implementadas – Stack WordPress
Softwares Instalados
Ao realizar esse laboratório desenvolvi uma stack para automação de servidor WordPress com as tecnologias abaixo:
- MySQL 5.7
- PHP 7.2 e PHP-FPM
- Nginx
- SSL
- Instala o WordPress
- SFTP
- Redis Cache
- Varnish Cache
Obs: Caso queira adquirir algum tipo de automação, conheça meus serviços: Automações e DevOps
Sobre o Site
E todos os testes foram baseados na stack acima, no entanto realizei algumas variações de cache com nginx e varnish bem como plugins de otimização que mais se ajustava ao tipo de cache. Por exemplo:
- Para cache Nginx usamos o plugin: Nginx Helper + WP Fastest Cache
- Para cache Varnish usamos o plugin: Varnish Cache + WP Fastest Cache
- Para cache de objetos: Redis Cache
O site que trabalhamos tinha um tema gratuito que encontrei no wordpress. O objetivo era simular em um site que fosse o mais real possível, sem otimizações, com muitas postagens e imagens.
Falando em postagens, instalamos o plugin FakerPress e geramos 5 mil postagens aleatórias no site, cada postagem tinha um pouco de texto, categorias e imagens. Isso fez nosso site crescer um pouco.
Os resultados obtidos nesse laboratório não podem ser considerados 100% fieis, uma vez que cada provedor de VPS pode mudar sua arquitetura de hardware, como também o tipo de otimização nos softwares e servidor fará total diferença.
Outro ponto importante é que cada site pode ter um comportamento diferente, principalmente sites WordPress densos onde o código não tem um mínimo de otimização e qualidade.
Com as devidas otimizações no servidor e no site eu poderia ter resultados até 100x maiores. Como não realizei nenhuma otimização no servidor, veja os resultados apenas como uma possibilidade mínima de performance e resultados.
Teste de Carga Servidor WordPress
Sobre o Servidor
Para realizar os testes em laboratório eu escolhi o provedor Vultr para criar meu VPS. Eu costumo utilizar a Vultr pois é um provedor que une custo benefício e performance.
Os testes foram feitos em um VPS High Frequency
- 1 CPU
- 2 GB RAM
- Disco NVMe de 64GB
- DC Atlanta EUA
A classe de servidores High Frequency possuem processadores mais rápidos, e unindo com os discos NVMe temos muito mais poder de processamento dos dados, isso também faz uma diferença absurda.
Se quiser testar a plataforma, cadastre através do link abaixo para ganhar $100 dólar para gastar em servidores. Isso também irá me ajudar com $25 dólar para que eu continue fazendo artigos, tutoriais, vídeos e testes por lá.
Sobre o Teste
Para realizamos o teste de carga, utilizamos a ferramenta loader.io , que no seu plano gratuito podemos executar pequenos testes com até 10 mil conexões simultâneas. No entanto, ficamos limitados a usar apenas 1 URL e testes de no máximo 1 minuto.
Organizamos nosso teste da seguinte forma:
- Test type: Maintain client load
- Requests: GET -> HTTPS > site.com.br
- Máximo 5% de erro
- 15s de timeout
Teste de Carga: Instalação Default + Cache Nginx
O único cache que habilitamos foi o do Nginx a nível de servidor. No site não foi instalado e configurado nenhum plugin de cache (poderia melhorar consideravelmente). No entanto, meu objetivo é fazer todos os testes sem instalar ou alterar nenhuma linha no site.
200 conexões Simultâneas
Como podem notar na primeira imagem, o teste não chegou a concluir, não passamos dos 100 usuários online de forma simultânea. O tempo médio de resposta chegou a 12.644 ms , e isso é algo muito grande. A essa altura o site já não dava mais para ser navegável, pois estava lento ao extremo.
Como batemos mais de 19% de erro o teste foi encerrado, nosso limite máximo aceitável era de 5%. Na segunda imagem podemos perceber também como os processos de PHP ficaram disparados, consumindo muito CPU e memória RAM. Isso se dá pelo fato do Nginx estar processando todas as requisições e ainda tendo que repassar para o PHP-FPM as demandas e aguardar as respostas para cada uma das solicitações.
Sim! O Nginx sofreu, mas lembre que não fizemos otimizações nele.
Resultados: https://bit.ly/3jlHgeP
Teste de Carga: Instalação Default + Varnish Cache
Nesse segundo modelo de teste de carga eu habilitei o Varnish Cache para cache de página. Varnish é um poderoso software para cache de página. Dependendo da sua implementação, é possível melhorar a performance de um site wordpress ou loja magento absurdamente.
200 conexões Simultâneas
Nesse segundo teste habilitamos o Varnish Cache para fazer todo o cache de página do nosso site WordPress. Confesso que demoramos um pouco para encontrar um modelo de configuração mínima para que ele funcionasse bem, pois várias paginas entravam em cache e quando atualizávamos algo, o cache não era apagado, só era apagado se reiniciássemos o serviço no servidor, o que é algo ruim.
Assim que conseguimos ajustar isso começamos o teste. O varnish estava na porta 80 e o Nginx nas portas 8080 e 443.
Na primeira imagem podemos observar que atingimos o limite de 200 usuários simultâneos, que era o objetivo do teste. O tempo de resposta também foi muito bom, cerca de 225 ms. E eu consegui navegar pelo site externamente e internamente sem lentidões, realmente o cache do Varnish é incrível.
Na segunda imagem notamos vários processos do Varnish, mas poucos ou quase nenhum do PHP ou Nginx. Quem estava trabalhando era o Varnish, isso se dá pelo fato de que o varnish já tinha a página em cache, caso algo fosse atualizado ele iria repassar para o Nginx e o Nginx iria se comunicar com o PHP.
Também notamos a economia do Varnish, consumimos cerca de 500/600MB máximo de memória RAM do nosso servidor. Resultado incrível.
Resultados: https://bit.ly/3qzAwvs
1.000 conexões Simultâneas
Bom, já que 200 conexões não fez nem cócegas, que tal testarmos 1 mil conexões ? Confira os resultados.
Nesse teste fica notável que foi possível segurar as 1 mil conexões, houve alguns erros de timeout e rede (que poderiam ser resolvidos com otimizações). O tempo de resposta médio também aumentou um pouco, uma vez que eram 1 mil conexões rs, mas atingimos apenas 0,1% de erros dos 5% máximos. E detalhe, nenhum erro 400/500.
O site ficou levemente lento, mas dava para acessarmos tranquilamente. E lembre-se, estamos com um servidor muito pequeno! Mas atingimos bons resultados nesses testes envolvendo o Varnish.
Resultados: https://bit.ly/3w0PA6l
Conclusão
Sempre que tenho um tempo gosto de fazer esses testes rs. A cada teste descobrimos algo novo, um novo padrão ou modelo que podemos testar e até replicar em futuros projetos.
O Nginx é um webserver incrível, e quando unimos ele com o Varnish temos resultados absurdos. Se ambos forem implementados com máxima otimização, e incluindo também tunagens e otimizações em outros serviços como MySQL e PHP, temos mais performance ainda.
Espero fazer novos cases e testes explorando mais o poder dessas tecnologias. Se você gostou deixe ai nos comentários, pois isso me incentivará a criar mais conteúdos.
Abraços.
1 comentário
Muito interessante esse artigo. Seria muito bom ver um vídeo demonstrando esse cenário Alex. Sucesso!