Atenção: Toda e qualquer opinião dita nesse artigo não pode ser considerada como uma verdade absoluta, uma vez que no mundo da tecnologia podemos resolver um problema de várias formas. Todos os dados informados foram testados em laboratório, e não em ambiente de produção.
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!