34 pontos por xguru 2022-11-29 | 2 comentários | Compartilhar no WhatsApp
  • A Netflix migrou um microserviço Java com uso intenso de CPU de m5.4xl (16 vCPU) para m5.12xl (48 vCPU)
  • Como o número de vCPUs era 3 vezes maior, esperava-se aproximadamente 3 vezes mais desempenho, mas a taxa de processamento aumentou apenas 25%
    • Pior ainda, a latência caiu 50%, e tanto o padrão de CPU quanto o de latência ficaram muito mais "irregulares" (choppy)
  • Um texto que organiza, até o nível mais baixo, a jornada para resolver isso

Processo de resolução

  • Decidiram comparar o nó rápido com o nó lento
  • Com Flame Graph e profiling da JVM (usando JFR - Java Flight Recorder), não foi possível identificar a diferença
  • Como não havia nada estranho nos níveis de aplicação/OS/JVM, passaram a examinar os PMC (Performance Monitoring Counters, contadores PMU) fornecidos pela instância m5.12xl
  • Um dos problemas era "False Sharing" — um padrão que surge quando 2 núcleos leem ou escrevem variáveis não relacionadas que compartilham a mesma linha de cache L1
    • No código do JDK, resolveram esse problema sem mudar a funcionalidade, apenas inserindo bytes de padding para alterar o layout dos dados
  • Outro problema era "True Sharing" — leitura e escrita da mesma variável por várias threads/núcleos
    • Para resolver isso, evitaram escrever na variável compartilhada e contornaram o cache de superclasse secundária da JVM
  • Depois de aplicar os dois patches, a velocidade ficou 3,5 vezes maior do que no início
  • Durante a resolução desse problema, descobriram o bug JDK-8180450, que estava dormente havia 5 anos

Conclusão

  • Existe uma tendência de considerar a JVM um ambiente de execução altamente otimizado, capaz de competir com linguagens orientadas a desempenho como C++
  • Isso vale para a maioria das cargas de trabalho, mas, em cargas específicas, o comportamento pode ser afetado não só pela implementação da aplicação, como também pela própria implementação da JVM
  • Neste caso, os PMC foram usados para encontrar e corrigir um gargalo no código nativo da JVM, elevando em mais de 3 vezes a taxa de processamento dessa carga de trabalho
  • Para esse tipo de problema de desempenho, a capacidade de inspecionar a execução no nível da microarquitetura da CPU é a única solução
  • O Intel vTune oferece insights valiosos mesmo apenas com os principais PMC expostos em instâncias como a m5.12xl
  • Se todas as instâncias da nuvem oferecessem um conjunto abrangente de PMC junto com PEBS (Processor Event-Based Sampling), seria possível obter ganhos de desempenho ainda maiores com análises mais profundas

2 comentários

 
roxie 2022-12-05

Nossa, sério...

 
ragingwind 2022-12-05

Deve ter sido emocionante quando a hipótese foi validada e a correção funcionou.