我正在尝试使用cgroups来限制进程的networking带宽,正如本答案所述 。 但是,我无法find他们所指的“文件”。 我使用安装了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
此外,我试图手动安装“networking”子系统没有成功:
# mkdir -p /sys/fs/cgroup/net # mount -t cgroup -o net net /sys/fs/cgroup/net/ mount: special device net does not exist
任何人都可以帮忙吗?
我知道只有2个与networking相关的cgroup, net_prio (设置networkingstream量的优先级)和net_cls (标记数据包以允许通过Linux tc识别)。
如何设置net_cls显然不是自动完成的。 首先检查你是否支持(只有你知道我是如何find的!):
$ 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,而是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 Kernel 3.5。 如果使用上面给出的grep命令,它会返回一个稍微不同的列表。 值得注意的是你现在已经CONFIG_NETPRIO_CGROUP=m这是另一个模块。 您可以再次使用与上面相同的find命令find模块,您将findnetprio_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,或者您也可以参阅此红帽文档 。
正如标题所说,在下一次重新启动时,更改将会丢失。
如果你想持久化编辑文件/etc/rc.local并添加上面创build目录和安装cgroup的步骤。 然后将这些模块(两者或其中之一,取决于您要使用的)添加到文件/etc/modules ,只需在新行上添加每个名称,例如:
sudo bash -c "echo cls_cgroup >> /etc/modules"
警告 :如果您不小心修改/etc下的文件,则可能会中断启动过程。 没有一个知情的人不能修复,但你最好小心,要么知道你要做什么,要么让一个朋友帮助你。 另外,备份您珍贵的数据总是一个好主意!