Não é possível localizar o subsistema de rede no cgroup no Ubuntu 12.04 LTS

4

Estou tentando usar o cgroups para limitar a largura de banda da rede de um processo, conforme descrito em esta resposta . No entanto, não consigo encontrar os "arquivos" aos quais eles se referem. Eu estou usando o Ubuntu 12.04 LTS com o cgroup-bin instalado. cgroups são montados automaticamente em / sys / fs / cgroup, no entanto, eu vejo apenas os seguintes subsistemas:

$ ls -l /sys/fs/cgroup/
total 0
drwxr-xr-x 3 root root 0 Mar  8 09:51 cpu
drwxr-xr-x 3 root root 0 Mar  8 09:51 cpuacct
drwxr-xr-x 3 root root 0 Mar  8 09:51 devices
drwxr-xr-x 3 root root 0 Mar  8 09:51 freezer
drwxr-xr-x 3 root root 0 Mar  8 09:51 memory

Além disso, tentei montar manualmente o subsistema "net" sem sucesso:

# mkdir -p /sys/fs/cgroup/net
# mount -t cgroup -o net net /sys/fs/cgroup/net/
mount: special device net does not exist

Alguém pode ajudar?

    
por user1202136 08.03.2013 / 10:43

1 resposta

11

Eu sei de apenas 2 cgroups relacionados à rede, net_prio (defina a prioridade do tráfego de rede) e net_cls (marca os pacotes para permitir a identificação pelo Linux tc ).

  • net_prio foi introduzido no Linux Kernel 3.3, então é normal que você não o veja no Ubuntu LTS 12.04 a menos que você instale a pilha de habilitação de hardware LTS (que te dá um Linux Kernel 3.5), veja em o fim.
  • net_cls , eu não sei quando foi introduzido, mas há um módulo para ele com o 3.2 Kernel fornecido com o Ubuntu 12.04 LTS.

configuração net_cls

Como definir net_cls obviamente não é feito automaticamente. Primeiro verifique se você tem suporte (só para você saber como eu descobri!):

$ grep CGROUP /boot/config-'uname -r'
CONFIG_CGROUPS=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_MEM_RES_CTLR=y
CONFIG_CGROUP_MEM_RES_CTLR_SWAP=y
CONFIG_CGROUP_MEM_RES_CTLR_SWAP_ENABLED=y
CONFIG_CGROUP_PERF=y
CONFIG_CGROUP_SCHED=y
CONFIG_BLK_CGROUP=y
# CONFIG_DEBUG_BLK_CGROUP is not set
CONFIG_NET_CLS_CGROUP=m

Isto diz-lhe que net_cls é um módulo e não compilado como parte do Kernel (o m ).

Agora que você sabe que tem o módulo, vamos procurá-lo:

$ find /lib/modules/'uname -r' -iname "*cgroup*"
/lib/modules/3.2.0-38-generic/kernel/net/sched/cls_cgroup.ko

Então agora você sabe que o módulo é chamado cls_cgroup , basta carregá-lo:

$ sudo modprobe cls_cgroup

Hop feito! Agora vamos fazer a montagem. As informações que você obteve são bastante incorretas para o Kernel entregue com o Ubuntu 12.04 LTS. Não é devido ao Ubuntu, mas sim que a API para cgroups provavelmente mudou. Como o seguinte é compatível com a documentação oficial do kernel:

$ sudo mkdir /sys/fs/cgroup/net_cls
$ sudo mount -t cgroup -o net_cls none /sys/fs/cgroup/net_cls

Agora você deve poder marcar seu pacote para tc .

configuração net_prio

Para net_prio , o processo é bastante semelhante. Mas você precisa instalar um kernel mais novo. O Ubuntu 12.04 LTS suporta o que eles chamam de LTS Hardware Enablement Stack que lhe fornece uma nova versão do kernel 3.5. Para instalá-lo:

$ sudo apt-get install linux-generic-lts-quantal xserver-xorg-lts-quantal

Após a reinicialização, você estará usando o Linux Kernel 3.5. Se você usar o comando grep dado acima, ele retornará uma lista ligeiramente diferente. Notavelmente, você tem agora CONFIG_NETPRIO_CGROUP=m , que é outro módulo. Você pode novamente procurar o módulo usando o mesmo comando find como acima e você encontrará netprio_cgroup , simplesmente carregue-o:

$ sudo modprobe netprio_cgroup

Então, como antes, agora você pode montar o cgroup:

$ sudo mkdir /sys/fs/cgroup/net_prio
$ sudo mount -t cgroup -o net_prio none /sys/fs/cgroup/net_prio

Consulte a documentação (veja o primeiro link) para saber como usar o net_prio cgroup ou você também pode se referir a este Documentação da Red Hat .

Essas alterações não são persistentes

Como diz o título, na próxima reinicialização, as alterações serão perdidas.

Se você quiser que isso seja persistente, edite o arquivo /etc/rc.local e adicione as etapas acima que estão criando o diretório e montando o cgroup. E adicione os módulos (ambos ou um deles, dependendo do que você deseja usar) ao arquivo /etc/modules , simplesmente adicione cada nome em uma nova linha, por exemplo:

sudo bash -c "echo cls_cgroup >> /etc/modules"

Aviso : ao modificar os arquivos em /etc , se você não tiver cuidado, poderá interromper o processo de inicialização. Nada que uma pessoa qualificada não possa reparar, mas é melhor ter cuidado e saber o que você vai fazer ou ter um amigo para ajudá-lo. Além disso, os backups dos seus dados preciosos são sempre uma boa ideia!

    
por 08.03.2013 / 20:40