Desative a troca de processo único e supercomprometa-se

Desative a troca de processo único e supercomprometa-se

Duas questões:

  1. 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?

  2. 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.

informação relacionada