Como definir o limite de cpu para determinado processo permanentemente. Cpulimit e bom não funcionam

12

Existem muitas perguntas semelhantes, mas nenhuma delas me ajuda com o meu problema.

Eu tenho o Ubuntu 11.10 no servidor (é a versão desktop). Eu tenho um site em execução nele. Existe um processo que é muito importante, mas não precisa ser executado com alta prioridade. Quero limitar permanentemente o uso da CPU para o processo , não para o usuário. Este processo é executado pela função exec (é a função php, não o processo do sistema).

Então eu vejo duas opções: 1. Adicione algum tipo de limite sempre que a função for executada. 2. Limite o uso da CPU permanentemente para este processo.

Eu tentei usar "nice" e cpulimit, mas nada parece funcionar. Nice não tem nenhum efeito e cpulimit (com -e) diz: "nenhum processo alvo encontrado".

Eu sou um iniciante, então, por favor, eu não conheço quase nada.

    
por Rafal 11.01.2012 / 15:48

1 resposta

19

Na ausência de detalhes solicitados ...

Aqui está como eu uso o cgroups no Ubuntu.

Ao longo deste post, você precisará alterar a variável "$ USER" para o usuário que está executando o processo

Adicionei informações para a memória, bem como isso será uma FAQ, se você não precisar dela, não a use.

1) Instale cgroup-bin

sudo apt-get install cgroup-bin

2) Reinicie. cgroups está agora localizado em /sys/fs/cgroup

3) Crie um cgroup para seu usuário (o proprietário do processo)

# Change $USER to the system user running your process.
sudo cgcreate -a $USER -g memory,cpu:$USER

4) Seu usuário pode gerenciar recursos. Por padrão, os usuários obtêm 1024 unidades de cpu (compartilhamentos), portanto, para limitar a cerca de 10% de cpu, a memória está em bytes ...

# About 10 % cpu
echo 100 > /cgroup/cpu/$USER/cpu.shares

# 10 Mb
echo 10000000 > /cgroup/memory/$USER/memory.limit_in_bytes

5) Inicie seu processo (troque exec para cgexec)

# -g specifies the control group to run the process in
# Limit cpu
cgexec -g cpu:$USER command <options> &

# Limit cpu and memory
cgexec -g memory,cpu:$USER command <options> &

Configuração

Assumindo que os cgroups estão trabalhando para você;)

Edite /etc/cgconfig.conf , adicione seu cgroup personalizado

# Graphical
gksudo gedit /etc/cgconfig.conf

# Command line
sudo -e /etc/cgconfig.conf

Adicione seu cgroup. Novamente altere $ USER para o nome de usuário que possui o processo.

group $USER {
# Specify which users can admin (set limits) the group
perm {    
    admin {
        uid = $USER;
    }
# Specify which users can add tasks to this group
    task {
        uid = $USER;
    }
}
# Set the cpu and memory limits for this group
cpu {
    cpu.shares = 100;
    }
memory {
    memory.limit_in_bytes = 10000000;
    }
}

Você também pode especificar grupos gid=$GROUP , /etc/cgconfig.conf é bem comentado.

Agora, mais uma vez, execute seu processo com cgexec -g cpu:$USER command <options>

Você pode ver seu processo (por PID) em /sys/fs/cgroup/cpu/$USER/tasks

Exemplo

% bl0ck_qu0te%

Para informações adicionais, consulte: link

    
por Panther 12.01.2012 / 00:18