2 pontos por GN⁺ 2023-11-09 | 1 comentários | Compartilhar no WhatsApp
  • Aplicações Go em contêineres: Desenvolvedores Go frequentemente implantam aplicações em contêineres que precisam de limites de CPU para evitar monopolizar os recursos do host.
  • Runtime do Go e limites de CPU: O runtime do Go não reconhece inerentemente os limites de CPU do contêiner, o que pode causar uso excessivo e problemas de desempenho.
  • Coletor de lixo (GC) do Go: O GC do Go roda de forma concorrente, mas precisa de pausas curtas de "stop-the-world" durante o término da varredura e o término da marcação para garantir a integridade dos dados.
  • Escalonador do Linux - CFS: O Completely Fair Scheduler (CFS) do Linux aloca tempo de CPU proporcionalmente, e os processos recebem tempo de CPU correspondente aos núcleos permitidos.
  • Problema entre Go e CFS: O Go cria uma thread do SO por núcleo de CPU, mas ignora o limite de CPU do contêiner, o que pode aumentar o tempo de "stop-the-world" do GC.
  • Configuração de GOMAXPROCS: Usar a variável de ambiente GOMAXPROCS para alinhar as threads do SO do Go ao limite de CPU do contêiner pode reduzir a latência do GC.
  • Automação do GOMAXPROCS: A biblioteca automaxprocs da Uber pode definir GOMAXPROCS automaticamente com base nos limites do contêiner, simplificando a configuração.
  • Melhorias futuras no runtime do Go: Há uma issue aberta no GitHub para integrar ao runtime do Go o reconhecimento automático de limites de CPU.

Conclusão: Configurar corretamente os limites de CPU e o GOMAXPROCS é importante para usar recursos de forma eficiente e manter o desempenho de aplicações Go em contêineres.

1 comentários

 
GN⁺ 2023-11-09
Opiniões do Hacker News
  • Discussão sobre usar reserva de CPU em vez de limite de CPU em ambientes de contêiner
  • Problema de detecção incorreta do número de núcleos por aplicações dentro do contêiner
  • Explicação detalhada das configurações de cgroup CFS do Docker e recomendação de usar --cpu-shares
  • Relatos de problemas com o escalonador CFS dentro de contêineres e curiosidade sobre o novo escalonador
  • Menção à introdução do GOMEMLIMIT no Go e à ferramenta de configuração automática de limite de memória (automemlimit)
  • Compartilhamento de desafios no gerenciamento de limites de CPU em implantações Go dentro de clusters Kubernetes
  • Agradecimento ao mantenedor da ferramenta ko pela menção ao projeto
  • Pergunta sobre a capacidade do runtime do Go de reconhecer limites de CGroups e se outros runtimes têm comportamento semelhante
  • Discussão sobre reduzir a latência do GC executando trabalho concorrente antes de alcançar pontos seguros
  • Menção a ajustes feitos pela equipe do .NET CLR para cenários semelhantes em ambientes de contêiner