alocação de memória do docker-machine

5

Temos um aplicativo Rails bastante complexo que está prestes a ser implantado em um único host físico. O host tem 8 núcleos e 128 GB de RAM.

O aplicativo é dockerizado, com 4 tipos de contêineres

  • Rails inc. servidor da web
  • Banco de dados Postgres
  • Redis DB
  • Contêiner de trabalho (Resque)

Espera-se que os contêineres Rails e Worker sejam dimensionados trazendo mais contêineres dentro da máquina docker.

No ambiente de desenvolvimento, a memória é alocada para todo o docker-machine:

docker-machine create -d virtualbox --virtualbox-memory 8192 default

É possível controlar a quantidade de memória que os recipientes individuais estão limitados?

Por exemplo, aloque 16GB ao Postgres, mas limite os contêineres do Rails a 4GB. Que tipo de memória mínima deve ser alocada para o host do servidor que executa o docker-machine e isso é possível?

EDITAR

Perguntas relacionadas:

Como lidar com o gerenciamento de memória do Docker?

Docker + Apache, como funciona o uso da memória?

EDIT 2

Esta resposta link indica que os contêineres alocarão memória conforme necessário. Esta não tem sido minha experiência no ambiente de desenvolvimento (por padrão, o docker-machine recebeu 2 GB).

    
por ardochhigh 12.02.2016 / 13:07

1 resposta

4

Como mencionado na resposta à pergunta em sua segunda edição, os contêineres não são como VMs, pois geralmente você não reserva memória para eles, como faria com as máquinas virtuais. Como todos eles são executados no mesmo sistema operacional, ele pode despachar memória conforme necessário para diferentes processos, como se eles não estivessem sendo executados em um contêiner. Isto é, a memória é agrupada para todos os processos, independentemente dos contêineres.

O que você definiu no exemplo acima com docker-machine era o pool de memória total do host 'virtual'. No seu caso de produção, serão todos os 128 GB (a menos que você planeje também usar o docker-machine ou as VMs para segmentá-lo).

No entanto, os contêineres também são uma ótima maneira de usar os recursos cgroups (grupos de controle) do kernel, que permitem configurar o gerenciamento de recursos para todo o sistema de contêineres. Isso não permite que você 'reserve' memória a um contêiner, mas, em vez disso, você pode definir limites superiores para toda a memória do seu contêiner para não consumir memória que possa ser usada por outros (no caso de vazamento ou bug, por exemplo) ).

Com o Docker, dependendo do back-end do contêiner usado, você pode definir os limites básicos de memória da seguinte forma:

  • Ao executar o libcontainer padrão do Docker, executando os contêineres com a opção -m ou -memory
  • Ao executar o provedor LXC herdado, executando os contêineres com a opção LXC lxc.cgroup.cpuset.memory = amount usando - lxc-conf

Você pode encontrar mais informações sobre o uso de cgroups no Docker aqui: link

O artigo também contém slides de uma introdução às funcionalidades do cgroups.

    
por 14.02.2016 / 19:24

Tags