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

25

Eu tenho um servidor de desenvolvimento no qual sshdàs vezes para de funcionar porque a máquina fica sem memória 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 20 MB e um pouco de CPU sshd!".

Como isso pode ser feito?

phunehehe
fonte
O Sshd não deve explodir assim, normalmente é um daemon muito bem comportado. Verifique se está atualizado para o mais recente / melhor. O que você está fazendo com isso? Você está canalizando dados massivos através dele?
Marcin
2
@ Marcin Eu não acho que estou fazendo nada grande, edição de texto. Mesmo se sshdfor bem comportado, acho que ficaria preso se não houvesse CPU / RAM suficiente para usar, não?
phunehehe
Quando o linux fica sem memória, ele começa a matar os processos para recuperar a memória. Você pode estar vendo o OOM em ação (falta de memória). Eu não sei por que ele decidiu matar seu sshd de forma consistente. Você já viu o sshd realmente vazar (aumentar de tamanho) horrivelmente antes de explodir ou funciona bem em um momento e está morto no seguinte?
Marcin
@Marcin as chances são de que, se ele está OOM, o sistema está atolado tanto que o sshd simplesmente não pode responder, não é um problema do sshd, mas um problema com sua carga. Infelizmente não sei a resposta para isso.
Xenoterracide
@phunehehe você tem certeza de que o problema não é a memória do ssh e a sua carga não passa do telhado? sshd dá algum erro? qual é a carga na caixa? e o que está causando a falta de memória no sistema.
Xenoterracide

Respostas:

9

Provavelmente, você pode conseguir algo assim usando cgroups com o controlador de recurso de memória .

Eu acho que você colocaria todas as suas tarefas que consomem recursos em um número limitado (CPU e RAM) cgroupe deixaria sshd"fora" para que não ficasse restrito.

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

Esteira
fonte
Ainda estou hesitante, não parece fácil (estragado pelo Ubuntu).
phunehehe
ah, certamente não é fácil :-) Adicionar swap é de longe mais fácil.
Mat
@phunehehe bem-vindo a ser um administrador de sistema, não é fácil. Mas agora você tem que aprender a fazer coisas não fáceis.
Xenoterracide
6

Ah, mas o cgroups é fácil :) 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 cgconfigprocesso que criará a hierarquia, cgroups e defina 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 sabe 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 chup de nosshd:

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

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

cgroup]# echo $PID >> sshd/tasks

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

mart1n
fonte
1

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

MSpike
fonte
Eu acrescentaria ionicea isso também, e provavelmente começaria o sshd com bom, não renegando-o mais tarde.
Xenoterracide
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 executar contêineres com limites de uso de CPU e memória semelhantes aos cgroups.

docker run -c=10 -m=1g my-container
Sean Fujiwara
fonte