linux – 在Ubuntu 12.04 LTS上找不到cgroup中的网络子系统

我正在尝试使用cgroup来限制进程的网络带宽,如 this answer中所述.但是,我无法找到它们引用的“文件”.我正在使用安装了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

此外,我试图手动挂载“net”子系统但没有成功:

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

有人可以帮忙吗?

解决方法

我知道只有2个与网络相关的cgroup,net_prio(设置网络流量的优先级)和 net_cls(标记数据包以允许通过Linux tc识别).

> net_prio已经在Linux Kernel 3.3中引入了,所以你不会在Ubuntu LTS 12.04中看到它是正常的,除非你安装了LTS硬件支持堆栈(它可以获得Linux内核3.5),最后看到.
> net_cls,我不知道它什么时候推出,但是有一个模块,它带有Ubuntu 12.04 LTS提供的3.2内核.

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,而是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配置

对于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

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

这些变化并不持久

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

如果你想要持久编辑文件/etc/rc.local并添加上面创建目录并挂载cgroup的步骤.并将模块(两者或其中一个,取决于您要使用的)添加到文件/ etc / modules中,只需在新行上添加每个名称,例如:

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

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

相关文章

linux常用进程通信方式包括管道(pipe)、有名管道(FIFO)、...
Linux性能观测工具按类别可分为系统级别和进程级别,系统级别...
本文详细介绍了curl命令基础和高级用法,包括跳过https的证书...
本文包含作者工作中常用到的一些命令,用于诊断网络、磁盘占满...
linux的平均负载表示运行态和就绪态及不可中断状态(正在io)的...
CPU上下文频繁切换会导致系统性能下降,切换分为进程切换、线...