Como definir o limite da CPU para determinado processo permanentemente. Cpulimit e nice 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. Há um processo que é muito importante, mas não precisa ser executado com alta prioridade. Desejo limitar permanentemente o uso da CPU no processo , não no usuário. Este processo é executado pela função exec (é função php, nã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 de destino encontrado".

Eu sou bastante iniciante, então, por favor, assuma que não sei quase nada.

Rafal
fonte
Você pode nos dizer o que tentou? O cgroups pode fazer isso por você.
Pantera
Quanto à configuração, você pode executar o cgsnapshot -spara recuperar as informações sem gravar o arquivo de configuração manualmente, o último dos quais não é recomendado.
Mingliang Liu
Deseja realmente acelerar o processo, ou seja, certifique-se de que nunca exceda uma quantidade de tempo definida?
Ken afiada
Eu usei esse método e funcionou para mim .. ubuntuforums.org/showthread.php?t=992706
Mustafa Salman

Respostas:

19

Na ausência de detalhes solicitados ...

Aqui está como eu uso o cgroups no ubuntu.

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

Eu adicionei informações para a memória e isso será um FAQ, se você não precisar, não use.

1) Instale cgroup-bin

sudo apt-get install cgroup-bin

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

3) Faça um cgroup para o 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 recebem 1024 unidades de CPU (compartilhamentos), de modo a limitar a cerca de 10% da 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 (altere 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

Supondo que os cgroups estejam 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 no seu cgroup. Mude novamente $ USER para o nome do 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, execute novamente seu processo com cgexec -g cpu:$USER command <options>

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

Exemplo

bodhi @ ufbt: ~ $ cgexec -g cpu: bodhi sleep 100 &

[1] 1499

bodhi @ ufbt: ~ $ cat / sys / fs / cgroup / cpu / bodhi / tasks

1499

Para obter informações adicionais, consulte: http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Resource_Management_Guide/

Pantera
fonte
2
Consegui terminar a parte 1. Está funcionando, mas você deve adicionar informações de que o processo é limitado apenas enquanto outro processo precisar de CPU / memória. Não é óbvio - e levo muito tempo para descobrir (como eu sou iniciante). Entendo corretamente que "Configuração" é salvar as configurações mesmo após a reinicialização?
Rafal
1
Fico feliz por você ter resolvido isto. Existe uma curva de aprendizado =) Sim, a configuração é manter as configurações durante a inicialização.
Pantera
Quando eu uso o cgroup na linha de comando, ele funciona bem. Mas quando executo o mesmo comando da função exec no php: (<? Php exec ("cgexec -g cpu: GroupHere NameOfProcess InputFile OutputFile OutputFile"); ele não funciona. A única diferença é que na linha de comando eu uso arquivos que estão em pasta estou em ea partir php eu uso caminho longo a esses arquivos Alguma idéia do que pode ser um problema que eu uso mesmo usuário em ambos os casos.?.
Rafal
1
@ Rafal: Eu não seu primeiro comentário está correto, a memória deve ser limitada, mesmo que nenhum outro processo esteja ocupando muita memória.
Flimm
1
@Flimm Apenas dois processos estavam em execução quando eu estava testando esta solução - apache e processo que deveria ser limitado. Quando nenhuma conexão do apache estava ativa ou havia apenas uma conexão com o apache, esse processo limitado ocupou 100% da CPU. Ele ficou limitado apenas quando várias conexões com o apache foram ativadas (eu fiz isso atualizando muito o site novamente no navegador). Então talvez não tenha sido executado nenhum outro processo.
Rafal