linux cgoup内存限制,Linux Cgroup系列(05):限制cgroup的CPU使用(subsystem之cpu)

在cgroup里面,跟CPU相关的子系统有cpusets、cpuacct和cpu。

其中cpuset主要用于设置CPU的亲和性,可以限制cgroup中的进程只能在指定的CPU上运行,或者不能在指定的CPU上运行,同时cpuset还能设置内存的亲和性。设置亲和性一般只在比较特殊的情况才用得着,所以这里不做介绍。

cpuacct包含当前cgroup所使用的CPU的统计信息,信息量较少,有兴趣可以去看看它的文档,这里不做介绍。

本篇只介绍cpu子系统,包括怎么限制cgroup的CPU使用上限及相对于其它cgroup的相对值。

本篇所有例子都在ubuntu-server-x86_64 16.04下执行通过

创建子cgroup

在ubuntu下,systemd已经帮我们mount好了cpu子系统,我们只需要在相应的目录下创建子目录就可以了

#从这里的输出可以看到,cpuset被挂载在了/sys/fs/cgroup/cpuset,

#而cpu和cpuacct一起挂载到了/sys/fs/cgroup/cpu,cpuacct下面

dev@ubuntu:~$ mount|grep cpu

cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)

cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)

#进入/sys/fs/cgroup/cpu,cpuacct并创建子cgroup

dev@ubuntu:~$ cd /sys/fs/cgroup/cpu,cpuacct

dev@ubuntu:/sys/fs/cgroup/cpu,cpuacct$ sudo mkdir test

dev@ubuntu:/sys/fs/cgroup/cpu,cpuacct$ cd test

dev@ubuntu:/sys/fs/cgroup/cpu,cpuacct/test$ ls

cgroup.clone_children cpuacct.stat cpuacct.usage_percpu cpu.cfs_quota_us cpu.stat tasks

cgroup.procs cpuacct.usage cpu.cfs_period_us cpu.shares notify_on_release

除了cgroup里面通用的cgroup.clone_children、tasks、cgroup.procs、notify_on_release这几个文件外,以cpuacct.开头的文件跟cpuacct子系统有关,我们这里只需要关注cpu.开头的文件。

cpu.cfs_period_us & cpu.cfs_quota_us

cfs_period_us用来配置时间周期长度,cfs_quota_us用来配置当前cgroup在设置的周期长度内所能使用的CPU时间数,两个文件配合起来设置CPU的使用上限。两个文件的单位都是微秒(us),cfs_period_us的取值范围为1毫秒(ms)到1秒(s),cfs_quota_us的取值大于1ms即可,如果cfs_quota_us的值为-1(默认值),表示不受cpu时间的限制。下面是几个例子:

1.限制只能使用1个CPU(每250ms能使用250ms的CPU时间)

# echo 250000 > cpu.cfs_quota_us /* quota = 250ms */

# echo 250000 > cpu.cfs_period_us /* period = 250ms */

2.限制使用2个CPU(内核)(每500ms能使用1000ms的CPU时间,即使用两个内核)

# echo 1000000 > cpu.cfs_quota_us /* quota = 1000ms */

# echo 500000 > cpu.cfs_period_us /* period = 500ms */

3.限制使用1个CPU的20%(每50ms能使用10ms的CPU时间,即使用一个CPU核心的20%)

# echo 10000 > cpu.cfs_quota_us /* quota = 10ms */

# echo 50000 > cpu.cfs_period_us /* period = 50ms */

cpu.shares

shares用来设置CPU的相对值,并且是针对所有的CPU(内核),默认值是1024,假如系统中有两个cgroup,分别是A和B,A的shares值是1024,B的shares值是512,那么A将获得1024/(1204 512)=66%的CPU资源,而B将获得33%的CPU资源。shares有两个特点:

如果A不忙,没有使用到66%的CPU时间,那么剩余的CPU时间将会被系统分配给B,即B的CPU使用率可以超过33%

如果添加了一个新的cgroup C,且它的shares值是1024,那么A的限额变成了1024/(1204 512 1024)=40%,B的变成了20%

从上面两个特点可以看出:

在闲的时候,shares基本上不起作用,只有在CPU忙的时候起作用,这是一个优点。

由于shares是一个绝对值,需要和其它cgroup的值进行比较才能得到自己的相对限额,而在一个部署很多容器的机器上,cgroup的数量是变化的,所以这个限额也是变化的,自己设置了一个高的值,但别人可能设置了一个更高的值,所以这个功能没法精确的控制CPU使用率。

cpu.stat

包含了下面三项统计结果

nr_periods: 表示过去了多少个cpu.cfs_period_us里面配置的时间周期

nr_throttled: 在上面的这些周期中,有多少次是受到了限制(即cgroup中的进程在指定的时间周期中用光了它的配额)

throttled_time: cgroup中的进程被限制使用CPU持续了多长时间(纳秒)

示例

这里以cfs_period_us & cfs_quota_us为例,演示一下如何控制CPU的使用率。

#继续使用上面创建的子cgroup: test

#设置只能使用1个cpu的20%的时间

dev@ubuntu:/sys/fs/cgroup/cpu,cpuacct/test$ sudo sh -c "echo 50000 > cpu.cfs_period_us"

dev@ubuntu:/sys/fs/cgroup/cpu,cpuacct/test$ sudo sh -c "echo 10000 > cpu.cfs_quota_us"

#将当前bash加入到该cgroup

dev@ubuntu:/sys/fs/cgroup/cpu,cpuacct/test$ echo $$

5456

dev@ubuntu:/sys/fs/cgroup/cpu,cpuacct/test$ sudo sh -c "echo 5456 > cgroup.procs"

#在bash中启动一个死循环来消耗cpu,正常情况下应该使用100%的cpu(即消耗一个内核)

dev@ubuntu:/sys/fs/cgroup/cpu,cpuacct/test$ while :; do echo test > /dev/null; done

#--------------------------重新打开一个shell窗口----------------------

#通过top命令可以看到5456的CPU使用率为20%左右,说明被限制住了

#不过这时系统的%us %sy在10%左右,那是因为我测试的机器上cpu是双核的,

#所以系统整体的cpu使用率为10%左右

dev@ubuntu:~$ top

Tasks: 139 total, 2 running, 137 sleeping, 0 stopped, 0 zombie

%Cpu(s): 5.6 us, 6.2 sy, 0.0 ni, 88.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

KiB Mem : 499984 total, 15472 free, 81488 used, 403024 buff/cache

KiB Swap: 0 total, 0 free, 0 used. 383332 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME COMMAND

5456 dev 20 0 22640 5472 3524 R 20.3 1.1 0:04.62 bash

#这时可以看到被限制的统计结果

dev@ubuntu:~$ cat /sys/fs/cgroup/cpu,cpuacct/test/cpu.stat

nr_periods 1436

nr_throttled 1304

throttled_time 51542291833

结束语

使用cgroup限制CPU的使用率比较纠结,用cfs_period_us & cfs_quota_us吧,限制死了,没法充分利用空闲的CPU,用shares吧,又没法配置百分比,极其难控制。总之,使用cgroup的cpu子系统需谨慎。

参考

CFS Bandwidth Control

cpu

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261111.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hive的安装和配置

在hadoop帐户下一、下载hive-0.8.1.tar.gzwget mirrors.cnnic.cn/apache/hive/stable/hive-0.11.0.tar.gz二、解压到/opt/modules目录下tar -zxvf hive-0.11.0.tar.gzcd hive-0.11.0三、配置Hive的环境变量(该步在root帐户下)vi /etc/profile.d/java.she…

容错性设计

即便你的产品90%的时间都运行良好。但是如果在用户需要帮助时置之不理,他们是不会忘记这一点的。——《getting real》 我们有时候不能不面对产品出错的时候。无论设计得多么用心,无论做了多少测试,用户仍然会遇到错误和问题。既然…

19:A*B问题

总时间限制: 1000ms内存限制: 65536kB描述输入两个正整数A和B&#xff0c;求A*B。 输入一行&#xff0c;包含两个正整数A和B&#xff0c;中间用单个空格隔开。1 < A,B < 50000。输出一个整数&#xff0c;即A*B的值。样例输入3 4 样例输出12错误代码&#xff1a; #include…

hdu2057

hdu2057 #include <stdio.h> int main(){__int64 a,b,t;while(~scanf("%I64X%I64X",&a,&b)){if(ab<0) {printf("-%I64X\n",-(ab));}else{printf("%I64X\n",ab);}}return 0; } posted on 2013-11-02 13:41 symons 阅读(...) 评论…

linux静态路由添加自启动,LINUX添加静态路由

LINUX添加静态路由建议&#xff0c;先用命令添加&#xff0c;测试生效未有其他影响后&#xff0c;添加到配置文件中。以本次127前置添加静态路由为例用户需要添加路由如下&#xff0c;命令格式为windows添加格式。route -a -p10.113.70.0 mask255.255.255.010.113.65.44rout…

自省:我为什么没有成功--对照35前务必完成的12跳

第1跳:1个目标 一艘没有航行目标的船&#xff0c;任何方向的风都是逆风&#xff0c;请明确以下几点&#xff1a; 1.你为什么是穷人——很多时候是因为你没有立下成为富人的目标。 自省&#xff1a;我确实没有成为富人的目标&#xff0c;因为我只是有一些中彩票后的臆想 2.你的…

Spring Data 系列(二) Spring+JPA入门(集成Hibernate)

通过【Spring Data 系列(一) 入门】的介绍&#xff0c;通过对比的方式认识到Spring提供的JdbcTemplate的强大功能。通过使用JdbcTemplate&#xff0c;操作数据库&#xff0c;不需要手动处理Connection,Statement等底层SQL对象。可是&#xff0c;Spring对数据库的操作还远远没有…

emmet-vim

最近啊&#xff0c;我投奔了网页的开发&#xff0c;看了一本《head first HTML and CSS》的书&#xff0c;感觉非常不错&#xff0c;然后又配置了一些vim里面用到的插件&#xff0c;现在我把学习到的东西记录下来&#xff01; 首先&#xff0c;我不会在这里写emmet 的具体操作方…

熟悉linux系统内核,[科普] Linux 的内核与 Linux 系统之间的关系

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼在 FHS 协议里&#xff0c;有这样的规定&#xff1a;/bin/ 需要在单用户模式可用的必要命令(可执行文件)&#xff1b;面向所有用户&#xff0c;例如&#xff1a; cat、 ls、 cp。/boot/ 引导程序文件&#xff0c;例如&#xff1a; …

linq to xml 操作sitemap

刚开始用xml去做没有弄好&#xff0c;折腾了好久成功了&#xff0c;先仓促的记一下 protected void btnAdd_Click(object sender, EventArgs e) { XElement els XElement.Load(Server.MapPath("~\Student\stu.sitemap")); XNamespace siteNM &…

mysql-5.5.50-winx64

1 获取帮助文档cd C:\Program Files\mysql\mysql-5.5.50-winx64 C:\Program Files\mysql\mysql-5.5.50-winx64> bin\mysqld.exe --verbose --help > mysqld_note.txt2 在 Windows 平台以服务运行2.1 启动服务器需要安装&#xff0c;写个安装脚本“bin\mysqld.exe --insta…

百度epoll

epoll编辑epoll是Linux内核为处理大批量句柄而作了改进的poll&#xff0c;是Linux下多路复用IO接口select/poll的增强版本&#xff0c;它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。目 录 1简介 2优点 2.1 支持一个进程打开大数目的socket描述符2.2 …

linux命令 正则表达式,详解Linux命令中的正则表达式

详解Linux命令中的正则表达式Mark Do 2017年9月19日 暂无评论 阅读 981 次命令中的正则表达式如果要在命令输出或文本中筛选内容时使用模糊查找&#xff0c;就需要使用正则表达式。正则表达式是一套由多个元字符组成的模糊查找模式&#xff0c;使用正则表达式可以快速查找和定位…

数据结构和算法分析学习笔记(三)--二叉查找树的懒惰删除(lazy deletion)

这次的问题来自《数据结构与算法分析(C描述)》的习题4.16,如下: -------------------------- 4.16 重做二叉查找树类以实现懒惰删除.注意,这将影响所有的例程.特别具有挑战性的是findMin和findMax,它们现在必须递归的完成. -------------------------- 这题没有参考答案,我也不…

javascript类型系统——正则表达式RegExp类型

原文:javascript类型系统——正则表达式RegExp类型 目录 [1]对象 [2]实例属性 [3]静态属性[4]实例方法前面的话 前面已经介绍过javascript中正则表达式的基础语法。javascript的RegExp类表示正则表达式&#xff0c;String和RegExp都定义了方法&#xff0c;使用正则表达式可以进…

abap调用Linux命令,ABAP中输入write命令使用

1.默认输出:如果没有指定输出长度或格式,系统自动按数据类型默认值输出.eg:data i1 type i value 12345678 . write i1.数据类型I默认长度为11位,右对齐,而i1只有8位长度,所以左边以空格填充.结果: 12345678.2.指定输出.语法1: write [/p(l)] v1[o(sl)]其中:v1可以是变量…

校验值的计算----移位算法

一直以来都是从互联网获得知识&#xff0c;感觉没贡献过什么。 最近做项目研究了一个算法&#xff0c;就写一个共享出来&#xff0c;给需要的人一些参考。 说明&#xff1a; 有一个40字节的数组&#xff0c;前38个字节表示数据&#xff0c;后两个字节表示校验值。 校验值是前面…

【转】符串搜索工具及XenoCode字符串自动解密工具

【http://www.cnblogs.com/chengchen/archive/2008/07/14/1242244.html】 我们在使用OD破解软件的时候&#xff0c;字符串搜索是最常用的功能之一。但是在DONET平台下似乎没有什么比较好的软件&#xff0c;于是自己动手写了一个软件。这个软件可以自动搜索DONET程序集中的所有的…

编译Ruby2.0 问题解决

compiling readline.creadline.c: In function ‘Init_readline’:readline.c:1886:26: error: ‘Function’ undeclared (first use in this function) rl_pre_input_hook (Function *)readline_pre_input_hook; ^readline.c:1886:26: note: ea…

linux 封装python,基于linux下python学习(封装)

一、面向对象类的设计&#xff1a;在程序开发中&#xff0c;要设计一个类&#xff0c;通常需要满足以下三个要求&#xff1a;1、类名 这类事物的名字&#xff0c;满足大驼峰命名法2、属性 这类事物具有什么样的特征3、 方法 这类事物具有什么样的行为eg:小明今年18岁&#xf…