Estou planejando alugar um servidor físico e executar o MySQL dentro de um contêiner LXC nesse servidor. Eu gostaria de controlar o uso máximo de memória para a instância do MySQL usando os limites do cgroup:
lxc.cgroup.memory.limit_in_bytes = 8192M
Isso controlará efetivamente a quantidade de memória que o contêiner pode usar, mas top
ou free
dentro do contêiner ainda relatará a memória geral para o host LXC (servidor físico). Não sou um especialista em como o Linux gerencia a memória em geral, mas presumo que - em uma máquina física - o Linux começará a trocar se perceber que está prestes a atingir um limite de memória física. O Linux lida com o limite de memória "efetivo" (seja limite de cgroup ou limite físico) da mesma maneira, independentemente de ser executado dentro de um contêiner ou em um host físico?
lxc - espaços de nomes do kernel
cgroups - subsistema do kernel que monitora o consumo de recursos e limites
O sistema interno do contêiner lxc não conhece os limites do cgroup no sistema operacional do host. O kernel do Linux (no host) limitará o consumo de recursos pelo cgroup.
lxc e cgroup - dois subsistemas de kernel independentes. Podemos usar cgroup sem lxc e lxc sem cgroup.
Openvz - Possui um conjunto de patches de kernel para exibição correta dos limites do contêiner no contêiner, mas eles não levam em kernel de baunilha
Não há Linux rodando dentro do contêiner, pois o Linux é o kernel e você o compartilha com o host. Seus aplicativos (como free e top) leem as informações do sistema de /proc e, assim, obtêm detalhes sobre o host, pois o lxc não falsifica os recursos limitados por padrão (em contraste com, por exemplo, o OpenVZ). Tudo bem, a menos que seu aplicativo se comporte de maneira diferente, dependendo dos números de ram/swap/cpu. Se o seu aplicativo tentar alocar mais memória do que a disponível para o contêiner, ele será desativado como qualquer outro aplicativo em um ambiente sem contêiner.
Se você quiser ver os recursos limitados dentro do contêiner, faça o seguinte no host:
Em seguida, reinicie o contêiner. O LXCFS emulará alguns arquivos em /proc do contêiner e os aplicativos verão os recursos limitados (cpu, ram, swap) corretamente.
Mais informações na página inicial do lxcfs: https://linuxcontainers.org/lxcfs/