O bom
Sua solução é a correta e deve ser realmente à prova do futuro; usando o systemd para controlar as configurações do cgroup de serviços, por exemplo. CPUQota.
[Unit]
Description=Virtual Distributed Ethernet
[Service]
ExecStart=/usr/bin/ddcommand
CPUQuota=10%
[Install]
WantedBy=multi-user.target
Veja o man systemd.resource-control
para configurações de cgroup mais úteis no systemd.
O ruim
Há duas ressalvas, porém, que eu ( e possivelmente alguns outros ) acertei. Essas ressalvas são realmente difíceis de rastrear, já que não parece haver informações facilmente encontradas sobre isso, que é a principal razão para essa resposta.
Advertência 1:
A configuração CPUQuota
só está disponível desde o systemd 213, consulte o link
* The CFS CPU quota cgroup attribute is now exposed for
services. The new CPUQuota= switch has been added for this
which takes a percentage value. Setting this will have the
result that a service may never get more CPU time than the
specified percentage, even if the machine is otherwise idle.
Este é, por exemplo, um problema com o Debian Jessie que só vem com o systemd 208. Como alternativa, pode-se configurar cpu.cfs_period_us
e cpu.cfs_quota_us
manualmente usando cgcreate
e cgset
do pacote cgroup-bin , por exemplo.
sudo cgcreate -g cpu:/cpulimited
sudo cgset -r cpu.cfs_period_us=50000 cpulimited
sudo cgset -r cpu.cfs_quota_us=10000 cpulimited
sudo cgexec -g cpu:cpulimited /usr/bin/ddcommand
Advertência 2
Para que as configurações cpu.cfs_period_us
e cpu.cfs_quota_us
estejam disponíveis, o Kernel precisa ser compilado com config-flag CONFIG_CFS_BANDWIDTH
. Infelizmente, o kernel 3.16.x para o Debian Jessie não é compilado com este sinalizador por padrão, veja este solicitação de recurso .
Isto estará disponível em Debian Stretch . Também é possível usar o kernel de jessie-backports , que deve ter o sinalizador ativado.
Espero que esta resposta ajude algumas pessoas com o mesmo problema que eu ...
PS: Uma maneira fácil de testar se o CPUquota está funcionando em seu ambiente é:
$ apt-get install stress
$ systemd-run -p CPUQuota=25% --slice stress --cpu <your cpu count>
e observe com top
ou htop
, a carga deve ser distribuída (uniformemente) em todos os processadores / núcleos, totalizando 25%.
Alternativa
Como uma ferramenta alternativa, pode-se usar o cpu-limit, que deve estar disponível na maioria das distros, por exemplo.
$ apt-get install cpulimit
$ cpulimit -l 10 -P /usr/bin/ddcommand
Funciona enviando SIGSTOP
e SIGCONT
para o comando anexado para pausar e retomar sua operação.
AFAIK foi difícil controlar vários processos separados / autônomos simultaneamente com isso, em como agrupá-los juntos , mas também pode haver solução para isso ...