DevSecOps

9 out, 2017

5 passos para parar pagamentos excessivos pelos recursos de hospedagem Java Cloud

Publicidade

Os recursos em nuvem podem ser caros, especialmente quando você é forçado a pagar por recursos que não precisa; por outro lado, a escassez de recursos causa tempos de inatividade. O que um desenvolvedor faz? Neste artigo (versão completa no InfoQ), passaremos por cinco passos que permitem que você pague apenas pelos recursos que você realmente consome, sem ficar limitado à medida que os requerimentos de capacidade da sua aplicação escala.

Admita que você paga demais por VMs

Quase todos os fornecedores de nuvem oferecem a capacidade de escolher entre vários tamanhos de máquinas virtuais diferentes. Escolher o tamanho correto da VM pode ser uma tarefa difícil; se for muito pequeno, você pode desencadear problemas de desempenho ou até tempos de inatividade durante os aumentos de carga. Sobrealocar? Então, durante a carga normal ou os períodos inativos, todos os recursos não utilizados são desperdiçados. Esse cenário parece familiar com suas próprias aplicações hospedadas na nuvem?

Além disso, se você precisar adicionar apenas mais alguns recursos para a mesma VM, a única saída com a maioria dos fornecedores de nuvem atuais, é duplicar o tamanho da sua VM. Exacerbando o problema, você deve incorrer em tempo de inatividade quando se move, parando uma VM atual, executando todas as etapas de reimplantação ou migração de aplicativos e depois lidar com os inevitáveis desafios associados.

Descubra como ampliar e diminuir a eficiência

O escalonamento vertical otimiza a memória e o uso da CPU de qualquer instância, de acordo com sua carga atual. Se for configurado corretamente, isso funciona perfeitamente para ambos os monólitos, bem como para microsserviços.

Configurar o escalonamento vertical dentro de uma VM, adicionando ou removendo recursos ao mesmo tempo, sem tempo de inatividade, é uma tarefa difícil. As tecnologias de VM oferecem memory ballooning, mas isso não é totalmente automatizado, exigindo ferramentas para monitorar a pressão de memória no sistema operacional host e convidado, e depois ativando ampliação e diminuição, conforme apropriado. Mas isso não funciona bem na prática, pois o compartilhamento de memória deve ser automático para ser útil.

A tecnologia de container desbloqueia um novo nível de flexibilidade graças à sua partilha automática de recursos out-of-the-box entre os containers no mesmo host, com a ajuda de cgroups. Os recursos que não são consumidos dentro das barreiras de limite são automaticamente compartilhados com outros containers que rodam no mesmo node de hardware. E, ao contrário das VMs, os limites de recursos em containers podem ser facilmente escalados sem reiniciar as instâncias em execução.

Migre de máquinas virtuais para containers

Há um equívoco comum de que os containers são bons apenas para aplicativos greenfield (microsserviços e nativos da nuvem). Os casos de experiência e de uso, provam a possibilidade de migrar as cargas de trabalho existentes das máquinas virtuais para os containers sem reescrever ou redesenhar aplicações.

Para aplicações monolíticas e legadas, é preferível usar containers do sistema, para que você possa reutilizar arquitetura, configuração, etc, que foram implementadas no design original da VM. Use configurações de rede padrão, como multicast, execute vários processos dentro de um container, evite problemas com determinação de limites de memória incorretos, escreva no sistema de arquivos local e mantenha-o seguro durante o reinício do container, solucione problemas e analise logs de uma maneira já estabelecida, use uma variedade de ferramentas de configuração baseadas em SSH, e seja liberal ao confiar em outras tarefas importantes “old school”.

Para prosseguir com a migração, você precisa preparar as imagens de container necessárias. Para os containers do sistema, esse processo pode ser um pouco mais complexo do que para os containers de aplicação. Então, crie um você mesmo ou use um orquestrador como Jelastic com templates de container do sistema pré-configurados.

Cada componente de aplicação deve ser colocado dentro de um container isolado. Essa abordagem pode simplificar a topologia da aplicação em geral, pois algumas partes específicas do projeto podem se tornar desnecessárias dentro de uma nova arquitetura.

Ative o Gargage Collector com encolhimento de memória

Para dimensionar o Java verticalmente, não basta apenas usar containers; você também precisa configurar a JVM corretamente. Especificamente, o garbage collector que você selecionar deve fornecer encolhimento de memória no tempo de execução.

Tais pacotes GC agrupam todos os objetos vivos em conjunto, remove objetos lixo, descompõe e libera a memória não utilizada de volta para o sistema operacional, em contraste com o não encolhimento do GC ou opções de inicialização JVM não otimizadas, onde aplicativos Java mantêm toda a RAM dedicada e não podem ser dimensionados verticalmente de acordo com o carregamento do aplicativo.

Infelizmente, o coletor de lixo paralelo padrão do JDK 8 (XX:+UseParallelGC) não está encolhendo e não resolve o problema do uso de RAM ineficiente pela JVM.

Felizmente, isso é facilmente corrigido ao mudar para Garbage-First (-XX:+UseG1GC).

Os dois parâmetros a seguir configuram a escala vertical de recursos de memória:

  • set Xms – um passo de escala
  • set Xmx – um limite de escala máximo

Além disso, a aplicação deve invocar periodicamente o GC completo, por exemplo, System.gc(), durante uma fase de carga baixa ou inativa. Esse processo pode ser implementado dentro da lógica da aplicação ou automatizado com a ajuda do agente Jelastic GC externo.

No gráfico abaixo, mostramos o resultado da ativação das seguintes opções de inicialização JVM com crescimento de tempo delta de cerca de 300 segundos:

-XX:+UseG1GC -Xmx2g -Xms32m

Como você vê, a RAM reservada (laranja) aumenta lentamente, correspondendo ao crescimento do uso real (azul). E todos os recursos não utilizados dentro dos limites do Max Heap estão disponíveis para serem consumidos por outros containers ou processos executados no mesmo host e não desperdiçados ao permanecerem ociosos.

Escolha uma nuvem com o modelo Pay-as-You-Use

A computação em nuvem é muitas vezes comparada ao uso de eletricidade, na medida em que fornece recursos sob demanda e oferece um modelo “pay as you go”. Mas há uma grande diferença – sua conta elétrica não dobra quando você usa um pouco mais de energia!

A maioria dos fornecedores de nuvem fornece um modelo de cobrança “pay as you go”, o que significa que é possível começar com uma máquina menor e depois adicionar mais servidores à medida que o projeto cresce. Mas, como descrevemos acima, você não pode simplesmente escolher o tamanho que se ajusta às suas necessidades atuais e irá escalar com você, sem algumas etapas manuais adicionais e possíveis inatividades. Então, você continua pagando pelos limites – para uma máquina pequena no início, que então dobra de tamanho e, finalmente, escala horizontalmente para várias VMs subutilizadas.

Em contraste com isso, uma abordagem de cobrança “pay as you use” considera a carga nas instâncias da aplicação no momento presente, e fornece ou recupera todos os recursos necessários sobre o assunto, o que é possível graças à tecnologia de containers. Como resultado, você é cobrado com base no consumo real e não é necessário fazer reconfigurações complexas para aumentar a escala.

Perceber os benefícios da escala vertical ajuda a eliminar rapidamente um conjunto de problemas de desempenho, evita a complexidade desnecessária com a escala horizontal implementada de forma precipitada e diminui a perda de nuvem independentemente do tipo de aplicação – monolito ou microsserviço.

Leia uma versão completa do artigo no InfoQ e explore as possibilidades de usar recursos de forma eficiente. Veja como isso funciona em Jelastic Cloud.

***

Este artigo é do Jelastic Blog. Ele foi escrito por Ruslan Synytsky. A tradução foi feita pela Redação iMasters com autorização. Você pode conferir o original em: https://blog.jelastic.com/2017/08/29/stop-overpaying-for-java-cloud-hosting-resources/