Назад | Перейти на главную страницу

Не удается найти сетевую подсистему в cgroup в 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

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

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

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

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

  • net_prio был представлен в Linux Kernel 3.3, поэтому это нормально, что вы не видите его в Ubuntu LTS 12.04, если вы не установили стек поддержки оборудования LTS (который дает вам Linux Kernel 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 который предоставляет вам новую версию ядра 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

Затем, как и раньше, вы можете смонтировать контрольную группу:

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

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

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

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

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

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

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