Desativa a troca de processo único e a supercomprometimento

2

Duas perguntas:

  1. Existe alguma maneira de desativar a troca por um determinado processo, ou seja, é possível matar um determinado processo se ele usar toda a memória principal do sistema disponível?

  2. Como desativo o supercomprometimento de memória em um sistema Linux?

Contexto :

Estou executando um aplicativo distribuído e gostaria de ter um processo cancelado quando o sistema ficou sem memória principal. O processo é bastante pesado na comunicação do disco rígido, pelo que acho razoável verificar o uso da memória programaticamente , 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 capazes de desligar o swap para um determinado processo, isso seria definitivamente melhor.

No entanto, ainda não sei como desativar o comprometimento excessivo. Alguma idéia?

    
por Rubens 19.08.2013 / 19:45

1 resposta

2

Você pode proibir a troca em seu aplicativo chamando mlockall(MCL_CURRENT|MCL_FUTURE) , consulte a página do manual.

Você pode desativar a supercomprometimento:

$ sysctl vm.overcommit_memory=2    # policy number 2
$ sysctl vm.overcommit_ratio=0     # ratio = 0%

Correr sem swap é geralmente uma idéia terrível. Agora todos os mmaps anônimos serão forçados a serem suportados pela RAM, mesmo que não sejam usados. O Unix precisa de swap, mesmo que nada seja realmente trocado.

    
por 19.08.2013 / 20:46