net_cls 配置

net_cls 配置

我正在尝试使用 cgroups 来限制进程的网络带宽,如这个答案。但是,我找不到它们引用的“文件”。我使用的是安装了 cgroup-bin 的 Ubuntu 12.04 LTS。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

有人可以帮忙吗?

答案1

我只知道 2 个与网络相关的 cgroup,网络优先级(设置网络流量的优先级)和网状结构(标记数据包以允许 Linux 识别tc)。

  • 网络优先级已经在 Linux Kernel 3.3 中引入,因此,除非您安装了 LTS 硬件支持堆栈(它会为您提供 Linux Kernel 3.5),否则您在 Ubuntu LTS 12.04 中看不到它是正常的,请参见最后。
  • 网状结构,我不知道它是什么时候推出的,但是 Ubuntu 12.04 LTS 附带的 3.2 内核中有一个它的模块。

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

这告诉你网状结构是一个模块,并没有作为内核的一部分进行编译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 的问题,而是因为 cgroups 的 API 可能已更改。因为以下内容符合内核官方文档:

$ 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 内核 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

请参阅文档(参见第一个链接)了解如何使用 net_prio cgroup,或者您也可以参考此Red Hat 文档

这些变化不是持久的

正如标题所说,下次重启时更改将会丢失。

如果您希望此操作持久化,请编辑文件/etc/rc.local并添加上述步骤,即创建目录和挂载 cgroup。然后将模块(两个或其中一个,取决于您要使用哪个)添加到文件/etc/modules,只需在新行中添加每个名称即可,例如:

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

警告:修改下面的文件时,/etc如果不小心,可能会破坏启动过程。没有什么是知识渊博的人无法修复的,但你最好小心谨慎,要么知道你要做什么,要么让朋友帮助你。此外,备份你的宝贵数据总是一个好主意!

相关内容