À primeira vista, a única coisa em que consigo pensar é que em algum lugar ao longo do processamento da linha (pelo sistema) do cgconfig.conf se tornou mais rigoroso. Em vez de definir os limites como uma string entre aspas, o que acontece se você remover as aspas. Então, algo como:
group memtest {
memory {
memory.limit_in_bytes = 209715200;
memory.soft_limit_in_bytes = 104857600;
}
}
Depois da contemplação, acho que memory.limit_in_bytes limita apenas a memória física do usuário, mas permite que a troca seja usada. É possível que tudo que você precisa fazer seja definir memory.memsw.limit_in_bytes
como o mesmo valor que memory.limit_in_bytes
, então algo como:
group memtest {
memory {
memory.limit_in_bytes = 209715200;
memory.memsw.limit_in_bytes = 209715200;
memory.soft_limit_in_bytes = 104857600;
}
}
memory.memsw.limit_in_bytes inclui memória do usuário E swap. Então, se você quiser um espaço de swap, deve-se definir memory.memsw.limit_in_bytes
igual a memory.limit_in_bytes
Quando você executa ulimit -S -v 200000
que restringe a memória virtual (troca, dados compartilhados e RAM físico) a um valor específico, para que o aplicativo não tenha espaço suficiente. No entanto, as configurações normais do sistema que você tinha não limitavam o espaço de troca, de modo que ele provavelmente tinha bastante espaço para usar a memória máxima do usuário + mais espaço de troca não utilizado.
Se você tivesse desativado o swap (e não usado ulimit) antes de fazer seus testes, eu esperaria que seu programa não tivesse alocado a memória solicitada.