Lembre-se de como eu disse:
The system uses lxc containers for compartmentalisation, but that shouldn't matter here.
Bem, acontece que o importava. Ou melhor, os cgroups no coração da matéria lxc.
A máquina host só vê reinicializações para atualizações de kernel. Então, quais foram os últimos kernels usados? 3.19, substituído por 4.0.5 há 2 meses e ontem com 4.1.3. E o que aconteceu ontem? Processos ficando memk esquerda, direita e centro. Verificando /var/log/kern.log
, os processos afetados estavam em cgroups com 512M de memória. Espere, 512 milhões? Isso não pode estar certo (quando o requisito esperado é de cerca de 4G!). Acontece que isso é exatamente o que configuramos nas configurações do lxc quando configuramos tudo isso meses atrás.
Então, o que aconteceu é que 3,19 ignorou completamente o limite de memória para cgroups; 4.0.5 sempre paginado se o cgroup exigia mais do que o permitido (esta é a questão central desta questão) e somente o 4.1.3 faz um full memkiller-sweep.
O swappiness do sistema host não teve influência sobre isso, já que nunca esteve perto de estar fora da memória física.
A solução:
Para uma alteração temporária, você pode modificar diretamente o cgroup, por exemplo, para um contêiner lxc chamado box1
o cgroup é chamado lxc/box1
e você pode executar (como root na máquina host):
$ echo 8G > /sys/fs/cgroup/memory/lxc/box1/memory.limit_in_bytes
A solução permanente é configurar corretamente o contêiner em /var/lb/lxc/...
lxc.cgroup.memory.limit_in_bytes = 8G
Moral da história: sempre verifique sua configuração. Mesmo se você acha que não pode ser o problema (e leva um erro / inconsistência diferente no kernel para realmente falhar).