Uso de CPUQuota no systemd

4

Estou tentando colocar um limite rígido no uso da CPU para um comando dd. Eu criei o seguinte arquivo de unidade

[Unit]
Description=Virtual Distributed Ethernet

[Service]
ExecStart=/usr/bin/ddcommand
CPUQuota=10%

[Install]
WantedBy=multi-user.target

que chamam o seguinte script simples

#!/bin/sh
dd if=/dev/zero of=/dev/null bs=1024k

Como eu vi neste guia , o uso da CPU para o meu O serviço dd não deve exceder os 10%. Mas quando executo o comando system-cgtop , o uso é de cerca de 70-75%.

Alguma idéia do que estou fazendo errado e como posso corrigi-lo?

Quando executo systemctl show dd obtenho os seguintes resultados em relação à CPU

CPUShares=18446744073709551615
StartupCPUShares=18446744073709551615
CPUQuotaPerSecUSec=100ms
LimitCPU=18446744073709551615
    
por SteveGr2015 19.04.2015 / 23:09

1 resposta

6

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 ...

    
por 14.06.2017 / 20:05