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
если вы не будете осторожны, вы можете прервать процесс загрузки. Ничто из того, что знающий человек не мог бы починить, но вам лучше быть осторожным и либо знать, что вы собираетесь делать, либо попросить друга помочь вам. Кроме того, резервное копирование ваших ценных данных всегда хорошая идея!