Vou postar uma visão do lado do fornecedor.
Tivemos esse cliente que tinha esse problema recorrente, em que o desempenho do software caía a cada poucas horas, a uma taxa realmente péssima, e voltava algumas horas depois.
O perfilador de bulitina no sistema indicou que a velocidade do CPU do sistema (ou possivelmente memória) era repugnantemente lenta, algo como 100MHZ em vez do esperado 2GHZ. Duplicar a CPU fornecida pela VM não alterou o sintoma e eles pensaram que estávamos desperdiçando.
Como eles não conseguiam uma CPU mais rápida (mais CPUs não ajudariam), nós tentamos trocar as máquinas virtuais TEST e PROD. O problema apareceu no teste no dia seguinte. Em seguida, tentamos promover um dos clientes para uma instância autônoma (sem servidor). Nenhum problema nessa estação de trabalho enquanto o servidor estava sufocando.
Eles produziram relatórios do host da VM, indicando que não há problemas de desempenho, e tentaram novamente afirmar que se tratava de um problema de aplicativo.
Por fim, eu [um engenheiro] (eu não tive nenhum suporte daqueles em funções de suporte dedicado) pedi especificamente uma caixa física. O cliente gritou assassinato sangrento, mas sem ninguém ter qualquer outra solução potencial que eles fizeram. O que você sabe, o problema desapareceu magicamente?
Nós nunca descobrimos qual era o problema. Todos os programas de benchmark mostraram-se normais, mas o criador de perfil de aplicativos estava nos dizendo que os recursos de computação simplesmente não eram adequados. Há uma espécie de assinatura específica que procuramos no perfil agora. Se virmos isso, sabemos antes de chegarmos mais longe, o problema é a interação da VM, mas ela simplesmente não era conhecida na época.
Eles com certeza pensaram que eu estava cheio disso. Eu não estava. Eu estava sem opções.
EDIT, atualização anos depois:
Com mais e mais clientes querendo rodar em VMs e gerenciamento dispostos a tentar resolver o problema a todo custo, conseguimos um bom hardware de VM. Consegui construir um programa de gravação de VM especializado que funcionava no espaço do usuário (e não exigia privilégios) em duas VMs de núcleo único com 512 MB de RAM, que conseguiu drenar 1/3 do desempenho de memória de outra VM de núcleo único com apenas 4 total de núcleos fora de 16 em uso no host da VM e a maioria de seu RAM ainda está livre. O programa não levantou alarmes e não mostrou nada fora do comum no host da VM nem em nenhum dos convidados, exceto pelo fato de o acesso à memória ser lento.
Agora, podemos dizer aos clientes que sabemos que há um problema com as VMs e não é nosso software. Ainda recebemos solicitações de clientes de tempos em tempos para softwares compatíveis com VM. Eu me pergunto por que o gerenciamento não permite que o suporte diga a eles que somos capazes de desenvolver um software que retarda todas as outras VMs no mesmo host.
O mais assustador é que a técnica envolvida é uma transformação simples de uma técnica de programação bem conhecida, envolvendo sincronização livre de bloqueio. Centenas de fornecedores de software podem ter esse dispositivo de drenagem de VMs em seu software e não sabem disso. Conseguir um bloqueio de instruções atômicas que seriamente contestado deveria ser raro, mas não impossível. A parte divertida de tudo é que eu estava recebendo o bloqueio para contestar VMs ACROSS.