Freqüentemente, uma instalação de nosso aplicativo baseado no Debian-estável no local é executada em uma máquina virtual - normalmente no VMware ESXi. No caso geral, não temos visibilidade ou influência sobre o ambiente de virtualização e não temos acesso, por exemplo, ao cliente VMware vCenter ou equivalente. Eu me concentro no VMware aqui, porque esse é de longe o mais comum que vemos.
Gostaríamos de:
- Informe ao administrador do VMware de um cliente: Você pode executar nosso aplicativo, por exemplo, no seu ambiente VMware ESX, desde que atenda aos critérios de desempenho X, Y e Z.
- Ser capaz de determinar se os critérios X, Y e Z são de fato atendidos continuamente (por exemplo, agora ), mesmo em um sistema em execução (não podemos parar nosso aplicativo e executar benchmarks, e um benchmark inicial não será suficiente, pois o desempenho em ambientes virtuais muda com o tempo).
- Tenha certeza de que, se os critérios X, Y e Z forem atendidos, teremos recursos de HW virtual adequados para executar nosso aplicativo com desempenho satisfatório.
Agora, o que são X, Y e Z?
Vimos várias vezes que quando há problemas de desempenho, o problema não está no nosso aplicativo, mas no ambiente de virtualização. Por exemplo, outra máquina virtual usa toneladas de CPU, memória ou SAN nas quais os discos são realmente armazenados, e usa muito por algo que não seja nosso aplicativo. Atualmente, não temos como provar ou refutar isso.
Teoricamente, também é possível que, às vezes, nossa aplicação seja lenta ... ;-)
Como se determina a causa raiz dos nossos problemas de desempenho: ambiente virtual ou aplicativo?
Normalmente existem três áreas para problemas de desempenho CPU, memória e E / S de disco.
CPU
Por exemplo, no VMware, o administrador pode especificar Reserva e Limite, expresso em MHz, mas é, por exemplo, 512 MHz em um host ESX exatamente igual a 512 MHz em outro host ESX, possivelmente em um cluster ESX completamente diferente?
E como se mede se realmente conseguimos isso? Enquanto nosso aplicativo está em execução, talvez possamos ver que estamos com 212% de utilização da CPU em 4 CPUs. Isso ocorre porque nosso aplicativo está fazendo muito ou porque outra VM no mesmo host está executando uma tarefa intensiva da CPU e usando toda a CPU?
Memória (Balão?)
Se pedirmos, por exemplo, 16 GB de RAM, que geralmente é configurado, mas por causa dos balões , na verdade, temos apenas 4 GB e, surpresa, nosso aplicativo tem um desempenho ruim.
Pode-se perguntar às ferramentas VMware sobre o balão atual, mas descobrimos que ele geralmente está (ou pelo menos é impreciso). Vimos exemplos em que o sistema operacional acha que há 16 GB de RAM total, a soma da memória residente (RSS) de todos os processos é 4 GB de RAM, mas há apenas 2 GB de RAM livre, mesmo quando as ferramentas do VMware nos dizem que há 0 balão: - (
Além disso, apenas adicionar RSS não é válido, pois pode haver facilmente RAM compartilhada, por exemplo, memória de cópia na gravação, de modo que 512 MB + 512 MB não significa necessariamente 1 GB, mas pode significar algo menos. Portanto, não se pode simplesmente subtrair o RSS de todos os processos para obter uma medida da quantidade de RAM livre e, assim, detectar balões de forma confiável. Pode-se detectar alguns casos de balão, mas há outros casos em que o balão está em vigor, mas não é detectável por esse método.
E / S de disco
Acho que poderíamos representar graficamente ao longo do tempo o número de leituras e gravações do disco, o número de bytes lidos e gravados e o% de espera de E / S. Mas isso nos dará uma imagem precisa da E / S do disco? Imagino que se houver um minerador de bitcoin em execução em outra VM usando toda a CPU, nossa% de espera de IO aumentará, mesmo que a SAN subjacente ofereça exatamente o mesmo desempenho, simplesmente porque nossos recursos de CPU diminuem e, portanto, a espera de IO ( que é medido em% ) sobe.
Então, em resumo, qual idioma podemos usar para descrever, por exemplo, um administrador da VMware, qual desempenho precisamos, de maneira portátil e mensurável?
"It runs fine with x, y, and z"
não é preciso o suficiente. Você precisa dizer a seus clientes exatamente o que seu aplicativo exige. Se eles dar-lhe os recursos e as aplicativo executa mal, em seguida, a questão não é "What do we need from a resource perspective?"
, mas"Why is it performing poorly even though the proper resources have been allocated?"