Go, contêineres e o escalonador do Linux
(riverphillips.dev)- 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 ambienteGOMAXPROCSpara 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 bibliotecaautomaxprocsda Uber pode definirGOMAXPROCSautomaticamente 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
Opiniões do Hacker News
--cpu-sharesGOMEMLIMITno Go e à ferramenta de configuração automática de limite de memória (automemlimit)kopela menção ao projeto