Reserva de memória da instância de contêiner do Linux no Amazon ECS
Quando o agente de contêiner do Amazon ECS registra uma instância de contêiner em um cluster, o agente deve determinar a quantidade de memória que a instância de contêiner tem disponível com a finalidade de reservar para as tarefas. Devido à sobrecarga de memória da plataforma e à memória ocupada pelo kernel do sistema, esse número é diferente da memória instalada anunciada para instâncias do Amazon EC2. Por exemplo, uma instância m4.large tem 8 GiB de memória instalada. No entanto, isso nem sempre significa que exatos 8.192 MiB de memória estão disponíveis para as tarefas quando a instância de contêiner é registrada.
Determinação de recursos de memória das instâncias gerenciadas do ECS
As instâncias gerenciadas do Amazon ECS usam uma abordagem hierárquica para determinar os requisitos de recursos de memória para tarefas. Ao contrário do ECS no EC2, que depende da introspecção de memória do Docker, as instâncias gerenciadas do ECS calculam os requisitos de memória diretamente da carga útil da tarefa durante as decisões de agendamento.
Quando o agente de instâncias gerenciadas do ECS recebe uma tarefa, ele calcula a necessidade de memória usando a seguinte ordem de prioridade:
-
Memória no nível da tarefa (prioridade mais alta): se a memória no nível da tarefa for especificada na definição de tarefa, o agente usará esse valor diretamente. Isso tem precedência sobre todas as configurações de memória no nível do contêiner.
-
Soma de memória no nível do contêiner (fallback): se a memória no nível da tarefa não for especificada (ou for 0), o agente somará os requisitos de memória de todos os contêineres na tarefa. Para cada contêiner, ele usa:
-
Reserva de memória (limite flexível): se um contêiner especificar
memoryReservationem sua configuração, o agente usará esse valor. -
Memória do contêiner (limite fixo): se
memoryReservationnão for especificado, o agente usará o campomemorydo contêiner.
-
exemplo Memória especificada no nível da tarefa
Quando a memória no nível da tarefa é especificada, ela tem precedência sobre as configurações no nível do contêiner:
{ "family": "my-task", "memory": "2048", "containerDefinitions": [ { "name": "container1", "memory": 1024, "memoryReservation": 512 } ] }
O agente reserva 2.048 MiB (a memória no nível da tarefa tem precedência).
exemplo Memória no nível do contêiner com reservas
Quando a memória no nível da tarefa não é especificada, o agente soma os requisitos de memória do contêiner:
{ "family": "my-task", "containerDefinitions": [ { "name": "container1", "memory": 1024, "memoryReservation": 512 }, { "name": "container2", "memory": 512 } ] }
O agente reserva 512 MiB (reserva de contêiner 1) + 512 MiB (memória de contêiner 2) = 1.024 MiB no total.
O agente de instâncias gerenciadas do ECS executa o cálculo de memória em três fases:
-
Recepção da tarefa: quando uma carga útil da tarefa chega do ambiente de gerenciamento do ECS, o agente calcula imediatamente a memória necessária.
-
Armazenamento de recursos: a necessidade de memória calculada é armazenada no modelo de tarefas para uso posterior em operações contábeis de recursos.
-
Decisão de agendamento: antes de aceitar uma tarefa, o agente verifica se há memória suficiente disponível. Se a memória disponível for insuficiente, a tarefa será rejeitada e permanecerá na fila de serviços do ECS até que os recursos estejam disponíveis.
nota
Diferentemente do ECS no EC2, as instâncias gerenciadas do ECS não usam a variável de configuração ECS_RESERVED_MEMORY. A reserva de memória para os processos do sistema é feita por meio do gerenciamento de recursos da plataforma subjacente, e o agente faz uma contabilidade precisa dos recursos com base nas definições das tarefas.
Na opção ECS no EC2, o agente de contêiner do Amazon ECS fornece uma variável de configuração denominada ECS_RESERVED_MEMORY, que pode ser usada para remover um número específico de MiB de memória do grupo alocado para as tarefas. Isso reserva de forma efetiva a memória para processos críticos do sistema.
Se você ocupar toda a memória em uma instância de contêiner com as tarefas, é possível que elas disputem a memória com processos essenciais do sistema e iniciem uma falha no sistema.
Por exemplo, se você especificar ECS_RESERVED_MEMORY=256 no arquivo de configuração do agente de contêiner, o agente registrará a memória total menos 256 MiB para essa instância, e 256 MiB de memória não poderão ser atribuídos para tarefas do ECS. Para obter mais informações sobre as variáveis de configuração do agente e como configurá-las, consulte Configuração do agente de contêiner do Amazon ECS e Inicialização de instâncias de contêiner do Linux no Amazon ECS para transmitir dados.
Se você especificar 8.192 MiB para a tarefa e nenhuma de suas instâncias de contêiner tiver 8.192 MiB ou mais de memória disponível para atender a esse requisito, a tarefa não poderá ser posicionada no cluster. Se estiver usando um ambiente de computação gerenciado, o AWS Batch deverá executar um tipo de instância maior para acomodar a solicitação.
O agente de contêiner do Amazon ECS usa a função ReadMemInfo() do Docker para consultar a memória disponível total para o sistema operacional. Tanto o Linux quanto o Windows oferecem utilitários de linha de comando para determinar a memória total.
exemplo - Determinar a memória total do Linux
O comando free retorna a memória total reconhecida pelo sistema operacional.
$free -b
Exemplo de saída para uma instância m4.large executando a AMI do Amazon Linux otimizada para Amazon ECS.
total used free shared buffers cached Mem:8373026816348180480 8024846336 90112 25534464 205418496 -/+ buffers/cache: 117227520 8255799296
Essa instância tem 8.373.026.816 bytes de memória total, ou seja, 7.985 MiB estão disponíveis para tarefas.
exemplo - Determinar a memória total do Windows
O comando wmic retorna a memória total reconhecida pelo sistema operacional.
C:\>wmic ComputerSystem get TotalPhysicalMemory
Exemplo de saída para uma instância m4.large executando a AMI do Windows otimizada para o Amazon ECS.
TotalPhysicalMemory8589524992
Essa instância tem 8.589.524.992 bytes de memória total, ou seja, 8.191 MiB estão disponíveis para tarefas.
Visualização da memória da instância de contêiner
É possível visualizar a quantidade de memória com a qual uma instância de contêiner é registrada no console do Amazon ECS (ou com a operação da API DescribeContainerInstances). Se estiver tentando maximizar a utilização de recursos fornecendo às suas tarefas o máximo de memória possível para um tipo de instância específico, você pode observar a memória disponível para essa instância de contêiner e atribuir essa quantidade de memória às tarefas.
Para visualizar a memória da instância de contêiner
Abra o console em https://console.aws.amazon.com/ecs/v2
. -
No painel de navegação, escolha Clusters e selecione o cluster que hospeda a instância de contêiner.
-
Escolha Infraestrutura e, em Instâncias de contêiner, selecione uma instância de contêiner.
-
A seção Recursos mostra a memória registrada e disponível para a instância de contêiner.
O valor da memória Registrada é o que a instância de contêiner registrou no Amazon ECS quando foi executada pela primeira vez, e o valor da memória Disponível é o que ainda não foi alocado para tarefas.