Como limitar o uso de recursos para economizar CPU + RAM em um determinado processo?

24

Eu tenho um servidor dev no qual sshd às vezes pára de funcionar porque a máquina fica sem RAM. Sim, estamos com pouca memória e a atualização não é uma opção viável no momento. O que eu quero fazer é dizer à máquina: "Faça o que quiser, mas deixe de fora 20MB e alguma CPU por sshd !".

Como isso pode ser feito?

    
por phunehehe 07.06.2011 / 09:48

4 respostas

9

Provavelmente você pode conseguir algo assim usando cgroups com o Controlador de recursos de memória .

Eu acho que você colocaria todas as tarefas que consomem recursos em um limite (CPU & RAM) cgroup e deixe sshd "fora" para que não seja restrito.

(Adicionar mais swap, mesmo na forma de um arquivo de troca, pode ser uma boa opção).

    
por 07.06.2011 / 12:14
6

Ah, mas os cgroups são fáceis :) Instale o pacote libcgroup. Crie um /etc/cgconfig.conf:

mount {
    cpu     = /cgroup/cpu_and_mem;
    cpuacct = /cgroup/cpu_and_mem;
    memory  = /cgroup/cpu_and_mem;
}

group sshd {
        cpu {
                cpu.shares="500";
        }
        cpuacct {
                cpuacct.usage="0";
        }
        memory {
                memory.limit_in_bytes="1G";
        }
}

group nosshd {
        cpu {
                cpu.shares="500";
        }
        cpuacct {
                cpuacct.usage="0";
        }
        memory {
                memory.limit_in_bytes="1G";
        }
}

Inicie o processo cgconfig , que criará a hierarquia, cgroups e definirá os limites. Se isso der certo, você tem dois cgroups, ambos com 50% da CPU atribuída e 1G de memória disponível (não sei qual é a quantidade real de memória disponível; supondo que seja 2G neste exemplo). Agora você só precisa mover todas as tarefas (ou seja, todos os processos em execução no sistema) do grupo raiz para o nosshd cgroup:

cgroup]# cat tasks >> nosshd/tasks
cgroup]# echo > tasks

Então você só precisa obter o PID do processo sshd e movê-lo para o arquivo de tarefas sshd:

cgroup]# echo $PID >> sshd/tasks

Ta-da, você está feito. Agora você pode ter certeza de que o sshd sempre terá 50% da CPU e 1G de memória.

    
por 07.06.2012 / 20:47
1

Use renice para obter uma prioridade mais alta para sshd ou verifique a contabilidade. (acct) - > com isso você pode definir recursos para os usuários, então execute o sshd com s

    
por 08.06.2011 / 08:01
1

Uma solução mais geral para o problema do uso de recursos de aplicativos é executar seus aplicativos em um contêiner usando o Docker . Você pode, então, executar contêineres com limites de uso de CPU e memória semelhantes aos cgroups.

docker run -c=10 -m=1g my-container
    
por 01.06.2014 / 21:28