Tive um problema contínuo ao executar um aplicativo da web Java Tomcat em um contêiner docker (que chamo de 'tarefa' neste artigo) hospedado em um ECS (serviço de contêiner elástico) na AWS.
Notamos que a tarefa sobe para 97% do uso da CPU (usando as métricas da AWS) e, embora às vezes volte a diminuir para um uso mais baixo da CPU por conta própria, a tarefa geralmente é encerrada.
Felizmente, o ECS gera uma nova tarefa do docker e inicia o aplicativo novamente (embora leve de 5 a 10 minutos para que tudo fique online, o que é uma grande quantidade de tempo durante nosso dia de produção!)

Não temos nenhum limite superior na tarefa ECS configurada (talvez devêssemos?) - em um projeto anterior, aumentamos a CPU no host ECS de 8 vCPU para 32 vCPU e, com certeza, esta tarefa docker em particular subiu para o 97% da CPU host do ECS persistentemente durante todo o projeto.

Esta semana aumentamos a CPU de 8 vCPU para 16 vCPU (e uma memória de 64 GB).
E estão vendo a mesma coisa. Aumentei o limite de memória flexível da tarefa para 4 GB (originalmente definido para 2 GB) e posso ver que o uso de memória aumenta, mas definitivamente não ultrapassa cerca de 6 GB.

Indo pelo rastreamento de pilha (que é muito longo para postar), não há erro de falta de memória registrado pelo aplicativo tomcat / java.
Geralmente começa com um erro JDBC (conexões máximas / pool esgotados), então as coisas são canceladas, o sistema de registro é desligado, etc.

O host ECS está desligando a tarefa ou a tarefa está desligando-se após atingir as restrições de CPU / memória (java / tomcat desligando-se)? Além disso, em nosso log de agente ECS, posso ver uma declaração sobre 'Saída 143' - é o encerramento da tarefa do ECS ou o próprio contêiner está saindo? Seria melhor definir um limite superior de CPU na tarefa (em relação à memória JVM, usando o que estiver disponível para ela)?

no answer