linux cgroups详细介绍

从 2.6.24 版本开始,linux 内核提供了一个叫做 cgroups(控制组)的特性。cgroups 就是 control groups 的缩写,用来对一组进程所占用的资源做限制、统计、隔离。也是目前轻量级虚拟化技术 lxc (linux container)的基础之一。每一组进程就是一个控制组,也就是一个 cgroup。cgroups 分为几个子系统,每个子系统代表一种设施或者说是资源控制器,用来调度某一类资源的使用,如 cpu 时钟、内存、块设备 等。在实现上,cgroups 并没有增加新的系统调用,而是表现为一个 cgroup 文件系统,可以把一个或多个子系统挂载到某个目录。如

复制代码

代码如下:

mount -t cgroup -o cpu cpu /sys/fs/cgroup/cpu

就将 cpu 子系统挂载在了 /sys/fs/cgroup/cpu 。也可以在一个目录上挂载多个子系统,甚至全部挂载到一个目录也是可以的,不过我觉得,把每个子系统都挂载在不同目录会有更好的灵活性。用 mount|awk '$5=="cgroup" {print $0}' 可以看到当前挂载的控制组。用 cat /proc/cgroups 可以看到当前所有控制组的状态。下面这个脚本,可以把全部子系统各种挂载到各自的目录上去。

复制代码

代码如下:

#!/bin/bash</p><p>cgroot="${1:-/sys/fs/cgroup}"
subsys="${2:-blkio cpu cpuacct cpuset devices freezer memory net_cls net_prio ns perf_event}"</p><p>mount -t tmpfs cgroup_root "${cgroot}"
for ss in $subsys; do
mkdir -p "$cgroot/$ss"
mount -t cgroup -o "$ss" "$ss" "$cgroot/$ss"
done

看看那些目录里都有些啥,比如 ls 一下 /sys/fs/cgroup/cpu。

复制代码

代码如下:

cgroup.event_control cpu.cfs_period_us cpu.rt_period_us cpu.shares notify_on_release tasks
cgroup.procs cpu.cfs_quota_us cpu.rt_runtime_us cpu.stat release_agent

其中 “cpu.” 开头的就是这个子系统里特有的东西。其他的那些是每个子系统所对应目录里都有的。这些文件就是用来读取资源使用信息和进行资源限制的。要创建一个控制组,就在需要的子系统里创建一个目录即可。如 mkdir /sys/fs/cgroup/cpu/foo 就创建了一个 /foo 的控制组。在新建的目录里就会出现同样一套文件。在这个目录里,也一样可以继续通过创建目录来创建 cgroup。也就是说,cgroup 是可以和目录结构一样有层次的。对与每个子系统挂载点点目录,就相当于根目录。每一条不同的路径就代表了一个不同的 cgroup。在不同的子系统里,路径相同就代表了同一个控制组。如,在 cpu、memory 中都有 foo/bar 目录,就可以用 那 /foo/bar 来操作 cpu、memory 两个子系统。对于同一个子系统,每个进程都属于且只属于一个 cgroup,默认是在根 cgroup。层次结构方便了控制组的组织和管理,对于某些配置项来说,层次结构还和资源分配有关。另外,也可以修改某个目录的 owner ,让非 root 用户也能操作某些特定的安全组。

cgroups 的设置和信息读取是通过对那些文件的读写来进行的。例如

复制代码

代码如下:

# echo 2048 >/sys/fs/cgroup/cpu/foo/cpu.shares

就把 /foo 这个控制组的 cpu.shares 参数设为了 2048。

前面说,有些文件是每个目录里共有的。那些就是通用的设置。其中,tasks 和 cgroups.procs 是用来管理控制组中的进程的。要把一个进程加入到某个控制组,把 pid 写入到相应目录的 tasks 文件即可。如

复制代码

代码如下:

# echo 5678 >/sys/fs/cgroup/cpu/foo/tasks

就把 5678 进程加入到了 /foo 控制组。那么 tasks 和 cgroups.procs 有什么区别呢?前面说的对“进程”的管理限制其实不够准确。系统对任务调度的单位是线程。在这里,tasks 中看到的就是线程 id。而 cgroups.procs 中是线程组 id,也就是一般所说的进程 id 。将一个一般的 pid 写入到 tasks 中,只有这个 pid 对应的线程,以及由它产生的其他进程、线程会属于这个控制组,原有的其他线程则不会。而写入 cgroups.procs 会把当前所有的线程都加入进去。如果写入 cgroups.procs 的不是一个线程组 id,而是一个一般的线程 id,那会自动找到所对应的线程组 id 加入进去。进程在加入一个控制组后,控制组所对应的限制会即时生效。想知道一个进程属于哪些控制组,可以通过 cat /proc/<pid>/cgroup 查看。

要把进程移出控制组,把 pid 写入到根 cgroup 的 tasks 文件即可。因为每个进程都属于且只属于一个 cgroup,加入到新的 cgroup 后,原有关系也就解除了。要删除一个 cgroup,可以用 rmdir 删除相应目录。不过在删除前,必须先让其中的进程全部退出,对应子系统的资源都已经释放,否则是无法删除的。

前面都是通过文件系统访问方式来操作 cgroups 的。实际上,也有一组命令行工具。

lssubsys -am 可以查看各子系统的挂载点,还有一组“cg”开头的命令可以用来管理。其中 cgexec 可以用来直接在某些子系统中的指定控制组运行一个程序。如 cgexec -g "cpu,blkio:/foo" bash 。其他的命令和具体的参数可以通过 man 来查看。

下面是个 bash 版的 cgexec,演示了 cgroups 的用法,也可以在不确定是否安装命令行工具的情况下使用。

复制代码

代码如下:

#!/bin/bash</p><p># usage:
# ./cgexec.sh cpu:g1,memory:g2/g21 sleep 100</p><p>blkio_dir="/sys/fs/cgroup/blkio"
memory_dir="/sys/fs/cgroup/memory"
cpuset_dir="/sys/fs/cgroup/cpuset"
perf_event_dir="/sys/fs/cgroup/perf_event"
freezer_dir="/sys/fs/cgroup/freezer"
net_cls_dir="/sys/fs/cgroup/net_cls"
cpuacct_dir="/sys/fs/cgroup/cpuacct"
cpu_dir="/sys/fs/cgroup/cpu"
hugetlb_dir="/sys/fs/cgroup/hugetlb"
devices_dir="/sys/fs/cgroup/devices"</p><p>groups="$1"
shift</p><p>IFS=',' g_arr=($groups)
for g in ${g_arr[@]}; do
IFS=':' g_info=($g)
if [ ${#g_info[@]} -ne 2 ]; then
echo "bad arg $g" >&2
continue
fi
g_name=${g_info[0]}
g_path=${g_info[1]}
if [ "$g_path" == "${g_path#/}" ]; then
g_path="/$g_path"
fi
echo $g_name $g_path
var="${g_name}_dir"
d=${!var}
if [ -z "$d" ]; then
echo "bad cg name $g_name" >&2
continue
fi
path="${d}${g_path}"
if [ ! -d "$path" ]; then
echo "cg not exists" >&2
continue
fi
echo "$$" >"${path}/tasks"
done</p><p>exec $*

cgroups 中的东西很多,本来打算只写一篇的,后来觉着还是分成几篇说得更明白些。之后还会写一些具体使用的东西。

(0)

相关推荐

  • linux awk 正则表达式.正则运算符详细介绍

    使用awk作为文本处理工具,正则表达式是少不了的。 要掌握这个工具的正则表达式使用。其实,我们不必单独去学习它的正则表达式。正则表达式就像一门程序语言,有自己语法规则已经表示意思。 对于不同工具,其实 ...

  • Linux shell脚本基础学习详细介绍(完整版)

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头、注释、变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提。 1. Li ...

  • BIOS的理解以及实现详细介绍

    简单介绍,如果专门做firmware相关的朋友应该比较熟悉。本文主要针对新手,BIOS的理解以及实现介绍,希望对新手有帮助。 先说说刷写,对于rom文件,无论是什么文件格式,bin也好,rom也好.. ...

  • Firefox.exe是什么进程 Firefox.exe相关内容详细介绍

    firefox.exe是基于Mozilla内核的网络浏览器,支持弹出窗口拦截和比微软IE更多的功能. 出品者: Mozilla firefox.exe相关介绍 firefox - firefox.ex ...

  • 显卡知识扫盲:详细介绍你所不知道的显存颗粒知识

    对于显卡,相信电脑爱好者朋友都已经不再陌生,不过对于什么显卡性能好、好在哪里,相信多数电脑爱好者朋友也说不出个所以然来。笔者曾经为大家编写过两关关于看显卡的文章,分别为《怎么看电脑显卡 如何看显卡性能 ...

  • nubia相机怎么用 nubia相机独立版使用教程图文详细介绍

    目前很多中兴手机都搭载的是nubia相机,其来自中兴努比亚手机力作,在拍照方面号称单反,具备不错的拍照优化表现。目前像nubia Z5s、努比亚X6、中兴红牛V5以及一些其他中兴新机基本内置的是nub ...

  • 迅雷路由器怎么用 迅雷智能路由器安装设置使用图文教程详细介绍

    前不久迅雷推出了一款令笔者印象深刻的迅雷路由器,该路由器属于一款智能路由器,除了具备双频ac路由、千兆网卡接口、支持外接硬盘外,还有一项创新功能,号称是全球第一台会赚钱的路由器。对于这款神奇路由器该怎 ...

  • linux性能监控工具介绍

    linux性能监控工具介绍

  • 小米路由器怎么样 小米路由器多少钱 小米路由器配置详细介绍

    日前由极路由推出的智能路由器产品引发了业内的热议。至此,路由器市场也成为各个互联网企业关注的重点。然而,在产品端,一直定位于”发烧友“群体的小米,此次涉足路由器市场也是一种情理之中的举措。那么小米路由 ...