
Duas questões:
Existe alguma maneira de desativar a troca para um determinado processo, ou seja, é possível matar um determinado processo se ele usar toda a memória primária disponível do sistema?
Como desativo a superalocação de memória em um sistema Linux?
Contexto:
Estou executando um aplicativo distribuído e gostaria que um processo fosse encerrado quando o sistema ficasse sem memória primária. O processo é bastante pesado na comunicação do disco rígido, pelo que considero razoável verificar o uso de memóriaprogramaticamente, como:
std::ifstream statm("/proc/self/statm");
size_t mem_virt, mem_rss, mem_shared;
statm >> mem_virt >> mem_rss >> mem_shared;
if (mem_virt == MAX_SYSTEM_PRIMARY_MEMORY) {
// kills current process
}
Mas se houvesse algum conjunto de linhas de comando capaz de desligar a troca para um determinado processo, seria definitivamente melhor.
No entanto, ainda não sei como desligar o excesso de comprometimento. Alguma ideia?
Responder1
Você pode proibir a troca em seu aplicativo chamando mlockall(MCL_CURRENT|MCL_FUTURE)
, consulte a página de manual.
Você pode desativar o overcommit:
$ sysctl vm.overcommit_memory=2 # policy number 2
$ sysctl vm.overcommit_ratio=0 # ratio = 0%
Executar sem swap geralmente é uma péssima ideia. Agora todos os mmaps anônimos serão forçados a ter suporte de RAM, mesmo que não sejam usados. O Unix precisa de troca, mesmo que nada seja realmente trocado.