Cannot find network subsystem in cgroup on Ubuntu 12.04 LTS

Я пытаюсь использовать cgroups для ограничения пропускной способности сети процесса, как описано в этом ответе. Однако я не могу найти "файлы", на которые они ссылаются. Я использую Ubuntu 12.04 LTS с установленным cgroup-bin. cgroups автоматически монтируются в /sys/fs/cgroup, однако я вижу только следующие подсистемы:

$ 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

Кроме того, я попытался вручную смонтировать подсеть "net":

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

Кто-нибудь может помочь?

1 ответ

Решение

Я знаю только о 2 cgroups, связанных с сетью, net_prio (установить приоритет сетевого трафика) и net_cls (теги пакетов, чтобы позволить идентификацию в Linux tc).

  • net_prio был представлен в Linux Kernel 3.3, поэтому обычно вы не видите его в Ubuntu LTS 12.04, если вы не установили аппаратный стек LTS (который дает вам ядро ​​Linux 3.5), см. в конце.
  • net_cls, я не знаю, когда он был представлен, но для него есть модуль со стоковым ядром 3.2, поставляемым с Ubuntu 12.04 LTS.

конфигурация net_cls

Как установить net_cls, очевидно, это не делается автоматически. Сначала убедитесь, что он поддерживается (только для вас, чтобы узнать, как я узнал!):

$ 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

Это говорит о том, что net_cls является модулем и не скомпилирован как часть ядра (m).

Теперь, когда вы знаете, что у вас есть модуль, давайте посмотрим на него:

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

Итак, теперь вы знаете, что модуль называется cls_cgroup, просто загрузите его:

$ sudo modprobe cls_cgroup

Хоп сделано! Теперь давайте сделаем монтаж. Полученная вами информация довольно неверна для Ядра, поставляемого с Ubuntu 12.04 LTS. Это связано не с Ubuntu, а с тем, что API для cgroups, вероятно, изменился. Поскольку следующее соответствует официальной документации ядра:

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

Теперь вы сможете пометить свой пакет для tc,

конфигурация net_prio

Для net_prio процесс довольно похож. Но вам нужно установить более новое ядро. Ubuntu 12.04 LTS поддерживает так называемый LTS Hardware Enablement Stack, который предоставляет вам новую версию ядра 3.5. Чтобы установить это:

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

После перезагрузки вы будете использовать Linux Kernel 3.5. Если вы используете grep Команда, приведенная выше, вернет вам немного другой список. Особенно у вас сейчас CONFIG_NETPRIO_CGROUP=m который является еще одним модулем. Вы можете снова искать модуль, используя тот же find команда, как указано выше, и вы найдете netprio_cgroupПросто загрузите его:

$ sudo modprobe netprio_cgroup

Затем, как и раньше, вы можете смонтировать cgroup:

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

Обратитесь к документации (см. Первую ссылку), чтобы узнать, как использовать cgroup net_prio, или вы также можете обратиться к этой документации Red Hat.

Эти изменения не являются постоянными

Как видно из названия, при следующей перезагрузке изменения будут потеряны.

Если вы хотите, чтобы это было постоянным, отредактируйте файл /etc/rc.local и добавьте описанные выше шаги, которые создают каталог и монтируют cgroup. И добавьте модули (оба или один из них, в зависимости от того, что вы хотите использовать) в файл /etc/modulesпросто добавьте каждое имя в новую строку, например:

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

Предупреждение: при изменении файлов в /etc если вы не будете осторожны, вы можете прервать процесс загрузки. Ничто из того, что знающий человек не мог бы починить, но вам лучше быть осторожным и либо знать, что вы собираетесь делать, либо попросить друга помочь вам. Кроме того, резервное копирование ваших ценных данных всегда хорошая идея!

Другие вопросы по тегам