使用cgroups控制进程cpu配额

Linux下的cgroups,全称叫Control Groups,最初由Google工程师提出并实现,linux从2.6开始将这个特性纳入内核。cgroups主要对进程按组(Group)进行资源配额的控制,包括CPU、内存、IO等,相比古老的ulimit,cgroups更为平滑和易用,成为容器技术(比如docker)的基础。

cgroups的形态

cgroups.png
  • hierarchy:cgroups从用户态看,提供了一种叫cgroup类型的文件系统(Filesystem),这是一种虚拟的文件系统,并不真正保存文件,类似/proc。通过对这个文件系统的操作(读,写,创建子目录),告诉内核,你希望内核如何控制进程对资源的使用。文件系统本身是层级的,所以构成了hierarchy
  • task:进程(process)在cgroups中称为task,taskid就是pid
  • subsystem:cgroups支持的所有可配置的资源称为subsystem。例如cpu是一种subsystem,memory也是一种subsystem。linux内核在演进过程中subsystem是不断增加的。
  • libcgroup:一个开源软件,提供了一组支持cgroups的应用程序和库,方便用户配置和使用cgroups。目前许多发行版都附带这个软件。

事实上,使用cgroups是非常简单的,几行shell命令就可以。下面以CPU子系统为例,来尝试控制一个进程的CPU利用率。

挂载cgroup文件系统

首先挂载cgroup文件系统:

# mkdir -p /cgroup/mave
# mount -t cgroup -o cpu mave /cgroup/mave
# cat /proc/mounts
...
mave /cgroup/mave cgroup rw,relatime,cpu 0 0

上面的命令挂载了一个cpu子系统,目录为/cgroup/mave,名字叫mave。cpu子系统用于控制进程的cpu总体占用率,是最常用的子系统。内核会根据配额的设置在调度进程上做出相应的调整。

观察/cgroup/mave目录:

# ls  /cgroup/mave
cgroup.event_control
cpu.cfs_period_us
cpu.rt_period_us
cpu.shares
notify_on_release
cgroup.procs
cpu.cfs_quota_us
cpu.rt_runtime_us
cpu.stat
release_agent
tasks

这些文件是自动创建出来的,且都跟cpu这个子系统有关。不同的子系统会创建出不同的文件。我们重点关注:

  • cpu.cfs_period_us
  • cpu.cfs_quota_us
  • tasks

tasks

这个文件里面可以写入一个或多个taskid(pid),/cgroup/mave这个组中的配额设置将影响这些task。

cpu.cfs_period_us

# cat /cgroup/mave/cpu.cfs_period_us
100000

表示将cpu时间片分成100000份。

cpu.cfs_quota_us

# cat /cgroup/mave/cpu.cfs_period_us
200000

表示当前这个组中的task(/cgroup/mave/tasks中的taskid)将分配多少比例的cpu时间片。由于是双核cpu,这里就表示最多可以用到200%的CPU。

创建一个控制组

尽管根目录(/cgroup/mave)也可以设置配额,但是习惯上,我们在这个目录下创建一个目录,作为一个控制组,这个控制组可以单独设置配额,而不影响其他控制组

# mkdir /cgroup/mave/steam
# ls  /cgroup/mave/steam
cgroup.event_control
cpu.cfs_period_us
cpu.rt_period_us
cpu.shares
notify_on_release
cgroup.procs
cpu.cfs_quota_us
cpu.rt_runtime_us
cpu.stat
tasks

可以看到,创建的steam目录下也会自动创建出一堆cpu子系统相关的文件,几乎和根目录(/cgroup/mave)完全一样。现在我们再来理解一下什么是hierarchy

hierarchy.png

hierarchy就是一个带有继承关系的目录层次,每一层形成一个控制组,单独控制其中的task。

一个文件系统可以同时挂载多种子系统

手动设置配额

采集器进程在不受限制的情况下全速采集,CPU占用率达到50%

eoic1.png

将5000写入cpu.cfs_quota_us,表示希望CPU占用率控制在(5000/100000=5%)以内:

# echo 5000 > /cgroup/mave/steam/cpu.cfs_quota_us

然后将进程号30126写入tasks

# echo 30126 >> /cgroup/mave/steam/tasks

观察cpu占用率,瞬间降到4%

eoic2.png

自动设置

可以看到,使用cgroups十分简单,效果很好。然而,进程id并不是每次都保持不变。我们需要一些自动化的机制。上文提到过libcgroup,这个库提供了挂载、配置和运行的程序和库。

附:cgroups中的子系统

  • blkio 设置限制每个块设备的输入输出控制。例如:磁盘,光盘以及usb等等。
  • cpu 使用调度程序为cgroup任务提供cpu的访问。
  • cpuacct 产生cgroup任务的cpu资源报告。
  • cpuset 如果是多核心的cpu,这个子系统会为cgroup任务分配单独的cpu和内存。
  • devices 允许或拒绝cgroup任务对设备的访问。
  • freezer 暂停和恢复cgroup任务。
  • memory 设置每个cgroup的内存限制以及产生内存资源报告。
  • net_cls 标记每个网络包以供cgroup方便使用。
  • ns 名称空间子系统。
  • perf_event 增加了对每group的监测跟踪的能力,即可以监测属于某个特定的group的所有线程以及运行在特定CPU上的线程,此功能对于监测整个group非常有用。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • 转载自 http://blog.opskumu.com/docker.html 一、Docker 简介 Docke...
    极客圈阅读 10,404评论 0 120
  • 一、Docker 简介 Docker 两个主要部件:Docker: 开源的容器虚拟化平台Docker Hub: 用...
    R_X阅读 4,346评论 0 27
  • muahao阅读 2,027评论 0 3
  • 圆梦巨人一个关于梦的故事,影片改编自罗尔德·达尔在1982所著的中篇童话《好心眼巨人》,是达尔最受欢迎的作品之一。...
    圆谨阅读 1,068评论 0 1
  • A 整理好背包丢完最后一片垃圾,我刷卡也要回去,公交卡顺道也一起出来,所以开个门也没有那么干净利索,略显尴尬有些。...
    夏威一一阅读 241评论 0 0