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