限制CPU使用率:优先级,信号,cgroups,systemd_systemd设置cpu利用率-程序员宅基地

技术标签: linux  操作系统  服务器  cpu  

为了提升系统的整体效率,需要在不同的场景中控制进程的cpu使用率。控制进程cpu的使用率,实质上是控制进程在单位时间内的CPU时间片。常用的手段有利用进程优先级,信号,cgroup。

优先级

进程优先级、nice和权重之间的关系

目前,Linux内核默认实现了4种调度器,分别是deadline, realtime, CFS和idel。进程能够获得多少CPU时间,和调度策略紧密相关。Linux支持的调度策略有:

[include/uapi/linux/sched.h]
/*
 * Scheduling policies
 */
#define SCHED_NORMAL		0
#define SCHED_FIFO		1
#define SCHED_RR		2
#define SCHED_BATCH		3
/* SCHED_ISO: reserved but not implemented yet */
#define SCHED_IDLE		5
#define SCHED_DEADLINE		6

其中,SCHED_NORMAL和SCHED_BATCH使用CFS调度器,SCHED_FIFO和SCHED_RR使用realtime调度器,SCHED_IDLE 指的是idel调度。内核使用0–139的数值表示进程的优先级,数值越低优先级越高。优先级0–99给实时进程使用,100–139给普通进程使用。普通进程的优先级,即100–139,被用户空间用nice值来映射。nice值的范围从-20–19,nice值默认为0.nice值的含义类似于等级,nice值越高,则优先级越低。例如CPU密集型应用程序nice值从0增加到1,那么它相对于其他nice值为0的应用程序将减少10%的CPU时间。CFS调度器引入虚拟时钟概念,每个进程虚拟运行时间是实际运行时间相对于nice值为0的权重的比例值。进程按照各自不同的速度在物理时钟节拍内前进。nice值小的进程,优先级权重大,虚拟时钟比正式时钟跑得慢,但是可以获取更多的运行时间。反之,nice值越大的进程,优先级越低,权重也越低,虚拟时钟比真实时钟跑得快,反而获得比较少的运行实际。CFS调度器总是选择虚拟时钟跑得慢的进程。

虚拟运行时间的计算公式为:

vruntime = delta_exec * nice_0_weight / weight

vruntiem: 进程虚拟运行时间
delta_exec:实际和运行时间
nice_0_weight:表示进程的权重值

工具

  • chrt

chrt用于控制实时进程的调度属性:调度策略,优先级等。例如:修改pid为111的进程的调度策略为SCHED_FIFO, 并设置优先级为10。

chrt -p -f 10 111
  • nice和renice

nice和renice用控制普通进程的优先级,nice值的范围为-20到19,nice数值越低,优先级越高。
例如:进程启动时设置进程的nice值为19。

nice -n 19 vi &

信号

信号原理

信号是进程间异步通信机制,信号被发送到进程时,操作系统会中断进程的正常流程,并且进入相应的信号处理函数执行操作,完成后在回到中断的地方继续执行。

  • 信号的接收
    信号的接收由内核完成,内核接收到信号后,会将信号放到对应进程的信号队列中,同时向进程发送中断,进程陷入内核。此时信号还在信号队列中,对进程来说,还不知道信号的到来。

  • 信号的检测
    进程陷入内核状态后,在以下两种情景中会对信号进行检测:进程从内核态返回到用户态前;进程在内核态中从睡眠状态被唤醒的时候。

  • 信号的处理
    信号处理函数运行在用户态,内核会将当前内核栈的内容拷贝到用户栈上,接着返回用户态,执行相应的信号处理函数。执行完信号处理函数后,返回内核态,检查是否还有未处理的信号。

工具

  • cpulimit

cpulimit通过周期发送SIGSTOP和SIGCONT来使进程不断的暂停和激活,从而控制CPU使用率。例如:限制pid为123的进程cpu使用率为50%。

 cpulimit --pid 123 --limit 50  

cgroups

cgroups主要功能有资源限制,优先级分配,资源统计,进程控制。cgroups的api以一个伪文件系统实现,用户可以通过文件系统实现cgroup的管理。cgroups的组织管理单元可以细粒度到线程级别。所有资源管理功能以subsystem方式实现。

cgroups的术语

  • task(任务),表示系统的一个进程
  • cgroup(控制组),资源控制的基本单位,按某种资源控制标准划分而成的任务组。
  • subsystem(子系统),资源调度器,如cpu子系统可以控制cpu时间分配。
  • hierarchy(层级树),由一系列cgroup以树状结构排列而成,每个层级树通过绑定对应的子系统进行资源调度。

libcgroup

libcgroup Man Page

man 1 cgclassify – cgclassify 命​​​令​​​是​​​用​​​来​​​将​​​运​​​行​​​的​​​任​​​务​​​移​​​动​​​到​​​一​​​个​​​或​​​者​​​多​​​个​​​ cgroup。​​​
man 1 cgclear – cgclear 命​​​令​​​是​​​用​​​来​​​删​​​除​​​层​​​级​​​中​​​的​​​所​​​有​​​ cgroup。 ​​​
man 5 cgconfig.conf – 在​​​ cgconfig.conf 文​​​件​​​中​​​定​​​义​​​ cgroup。​​​
man 8 cgconfigparser – cgconfigparser 命​​​令​​​解​​​析​​​ cgconfig.conf 文​​​件​​​和​​​并​​​挂​​​载​​​层​​​级​​​。​​​
man 1 cgcreate – cgcreate 在​​​层​​​级​​​中​​​创​​​建​​​新​​​ cgroup。​​​
man 1 cgdelete – cgdelete 命​​​令​​​删​​​除​​​指​​​定​​​的​​​ cgroup。​​​
man 1 cgexec – cgexec 命​​​令​​​在​​​指​​​定​​​的​​​ cgroup 中​​​运​​​行​​​任​​​务​​​。​​​
man 1 cgget – cgget 命​​​令​​​显​​​示​​​ cgroup 参​​​数​​​。​​​
man 5 cgred.conf – cgred.conf 是​​​ cgred 服​​​务​​​的​​​配​​​置​​​文​​​件​​​。​​​
man 5 cgrules.conf – cgrules.conf 包​​​含​​​用​​​来​​​决​​​定​​​何​​​时​​​任​​​务​​​术​​​语​​​某​​​些​​​ cgroup 的​​​规​​​则​​​。​​​
man 8 cgrulesengd – cgrulesengd 在​​​ cgroup 中​​​发​​​布​​​任​​​务​​​。​​​
man 1 cgset – cgset 命​​​令​​​为​​​ cgroup 设​​​定​​​参​​​数​​​。​​​
man 1 lscgroup – lscgroup 命​​​令​​​列​​​出​​​层​​​级​​​中​​​的​​​ cgroup。​​​
man 1 lssubsys – lssubsys 命​​​令​​​列​​​出​​​包​​​含​​​指​​​定​​​子​​​系​​​统​​​的​​​层​​​级​​。

限制cpu使用率为50%

  • 创建层级和挂载子系统

任何单一子系统最多可绑定到一个层级中,如果要绑定的子系统已经被别的层级绑定,则会报错。例如,cpu子系统永远无法绑定到两个不同层级。但如果新建的层级要绑定的子系统与现有的层级结构相同,那么新的挂载会重用原来的层级。

mount -t cgroup -o cpu,cpuacct  cpu,cpuacct  /sys/fs/cgroup/cpu,cpuacct
  • 创建控制组群
cgcreate -g cpu:/cg_half
  • 设置参数

设置50%的CPU使用率,cpu.cfs_quota_us / cpu.cfs_period_us

cgset -r cpu.cfs_quota_us=50000 cg_half
  • 将进程移到控制组群中
cgclassify -g cpu:cg_half 2128,2129

systemd

systemd是Linux的init系统, systemd引入了units的概念。systemd依赖cgroups, systemd主要通过unit和cgroups管理资源。可以使用systemctl指令,或者通过修改systemd的unit配置文件来管理系统资源。系统中所有进程都是systemd init进程的子进程,默认情况下systemd会创建slice,scope和service层级,

  • service, 一个或一组进程,由systemd依据unit文件启动。
    service对指定进程进行封装,这样进程可以作为一个整体被启动或终止。

  • scope, 一组外部创建的进程,任何通过fork()启动和终止,并且在运行时注册到systemd的进程,scope可以将其封装。例如:用户会话、容器和虚拟机。

  • slice, 一组按层级排列的单位。slice并不包含进程,但会组建一个层级,并将scope和 service 都放置其中。
    真正的进程包含在 scope 或 service 中。默

systemctl

  • systemd-cgls, 查看cgroups层级
root@localhost:~# systemd-cgls
Control group /:
-.slice
├─init.scope
│ └─1 /sbin/init
├─system.slice
│ ├─dbus.service
│ │ └─617 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
...

  • systemd-cgtop, 显示cgoups的实时资源消耗情况
Control Group                            Tasks   %CPU   Memory  Input/s Output/s
/                                            -    2.1   975.1M        -        -
/system.slice                              112    1.4   714.6M        -        -
/system.slice/aegis.service                 28    1.1    84.8M        -        -
/user.slice                                  5    0.7   137.2M        -        -
/user.slice/user-0.slice                     5    0.7    49.8M        -        -
...
  • systemd-run, 创建临时cgroup

临时cgroup的特征是,所包含的进程一结束,临时cgroup就会被自动释放。

systemd-run --unit=name --scope --slice=slice_name command

root@localhost:~# systemd-run --unit=toptest --slice=test top -b
Running as unit toptest.service.

unit配置文件

unit配置文件位于 /usr/lib/systemd/system/ 目录。如:控制cpu使用率为120%,使用CPUQuota参数。

[Unit]
Description=miner
After=network.target

[Service]
User=miner
Group=miner

Type=simple
ExecStart=/opt/cpuminer-opt/cpuminer
ExecStop=/usr/bin/pkill cpuminer


CPUQuota=120%

PrivateTmp=true
TimeoutStopSec=60s
TimeoutStartSec=2s
StartLimitInterval=120s

[Install]
WantedBy=multi-user.target

结论

我们可以通过进程优先级,信号,以及cgroups等方式来控制cpu的使用率,相应的工具有nice, cpulimit, cgset等等。用cgroups才能实现对系统资源的精确控制,但现在libcgropup不被推荐使用,因为它很容易与systemd默认的cgroup层级产生冲突。所以要控制cpu使用率更优雅的方式是使用systemd,systemd被大多数主流系统支持。

参考

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/resource_management_guide/chap-introduction_to_control_groups
https://access.redhat.com/articles/754933

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/LngZd/article/details/105728448

智能推荐

【面试题笔记-Java】Java基础_变量【pattern】应定义为常量或者字段-程序员宅基地

文章浏览阅读2.2k次。参考JavaGuide和一些面经做的笔记,方便自己记忆Java基础1. 面向对象和面向过程的区别面向对象的设计思想是将需要解决的问题分解成一个个对象,这一个个对象可以用来描述在完成这件事中扮演的具体角色和行为。面向过程的设计思想是将需要解决的问题拆分成一个个具体的步骤,然后设置这些步骤的实现方法,然后按照顺序一步步实现即可优缺点:面向对象相较于面向过程而言,有着易维护、易复用和易扩展的特点,由于面向对象有封装、继承和多态的特点,所以能够设计出低耦合的系统,易于去维护;而相对面向过程,面向对象性能_变量【pattern】应定义为常量或者字段

Forbidden (CSRF cookie not set.)-程序员宅基地

文章浏览阅读5.3k次,点赞6次,收藏5次。使用django做接口,调用接口:报错一:Forbidden (CSRF cookie not set.): /code_api/xzcf_jiaotongbu/解决:修改settings.py文件,注释掉django.middleware.csrf.CsrfViewMiddleware’MIDDLEWARE_CLASSES = [‘django.middleware.securit..._forbidden (csrf cookie not set.)

2的幂次方-程序员宅基地

文章浏览阅读4.1k次,点赞2次,收藏3次。2的幂次方(Noip1998)【问题描述】 任何一个正整数都可以用2的幂次方表示。例如: 137=27+23+20 同时约定方次用括号来表示,即ab可表示为a(b)。 由此可知,137可表示为: 2(7)+2(3)+2(0) 进一步:7=22+2+20 (_2的幂次方

poi导出word模板项目实例(一个文件)-程序员宅基地

文章浏览阅读152次。在页面上填写值,然后导出到word模板中,并把页面上的值带到模板中,也就是导出word文档,提前有word 的模板形式,1.jsp 页面 <table class="formTable"> <TR> <TD class="label">会议地点</TD> <TD class="content"..._java poi 导出word样例

商品规格设计_mongodb 商品规格 设计-程序员宅基地

文章浏览阅读1.1k次。最近面试的时候遇到一个问题,大概意思是说商城一件衣服,颜色有蓝、白、黑,尺码有 S、M、L 码,不同的颜色和尺码搭配的价格和库存是不一样的,这种关系如何设计数据库呢?示例图之前也没用遇到过这种问题,第一感觉就是以衣服表为主表,再分表建立子表:颜色表和尺码表以及颜色-尺码管理表。商品表字段(item):id name…颜色表字段(color):id name item_id …尺码表字段..._mongodb 商品规格 设计

1205 对icmp报文的构造_test center构造icmp报文-程序员宅基地

文章浏览阅读498次。1205 对icmp报文的构造1,存储空间申请icmp_data =(char*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,MAX_PACKET); 2,初始化memset(icmp_data,0,MAX_PACKET); 3,构造报文 //重要函数,填充ICMP包头FillICMPData(i_test center构造icmp报文

随便推点

学习红帽linux(RHCE)的就业前景_rhce 35岁-程序员宅基地

文章浏览阅读2k次。1.根据对招聘信息的调查表明,在对IT人才6万多个需求中,LINUX人才需求为2万5千人以上,其中95.1%的职位明确表明要求持有红帽认证工程师(RHCE)证书。  2.薪水待遇高  Linux领域最权威的国际认证RHCE证书,是最具含金量的国际IT职业证书之一,它能证明您在Linux方面独特的专业技能,获得更多提升和提薪的机会;由于人才紧缺,一些供不应求的职位,如 Linux系统工程师、_rhce 35岁

Maven初识-程序员宅基地

文章浏览阅读117次。Evernote Export 一、不使用Maven开发时存在的问题(为什么使用Maven)1、一个项目就是一个工程。如果项目非常庞大,就不适合继续使用package来划分模块,最好是一个模块对应一个工程,利用分工协作。借助Maven就可以将一个项目拆分成多个项目。2、项目中需要的jar包必须手动“复制”、“粘贴”到WEB-INF/lib目录下带来的问题是:同...

单链表基本操作的实现_本关任务:根据链表的基本知识完成单链表的初始化及数据插入操作。-程序员宅基地

文章浏览阅读382次。package pac1;class Node{ public Node next; //指针域 public int data; //数据域 public Node(int data) { this.data = data; } public void show(){ System.out.print(data+" "); }}public class LinkLis_本关任务:根据链表的基本知识完成单链表的初始化及数据插入操作。

DAY 7 数据分析工具_剔除眼动成分-程序员宅基地

文章浏览阅读79次。导入数据 定位电极 剔除无用电极 重新选择参考电极,位置随意 滤波 分段 插值坏导和剔除坏段 Run ICA 剔除眼动成分EEG信号的分析和处理可能会涉及以下⼀个或多个⽅⾯:信号的预处理(预处理 也需要多个步骤)、ERP时域分析、时频分析、信号的功率谱计算、功能连接、溯源分析等等..._剔除眼动成分

php上传图片并显示代码,php图片上传代码(完整版已测试)-程序员宅基地

文章浏览阅读2.4k次。php图片上传代码本来是一个很简单的事,之前笔者图省事,直接网上下载了一个php图片上传小程序,结果导致wordpress网站被黑,因为留有后门,后来排查直接删除整个小程序,自己用重新写了一个php图片上传功能,缺点就是只能单张上传!简单说一些这个这段代码,上传目录:文件当前文件夹;图片文件夹:自动生成,格式为日期的年月,如:201801,201802;图片是否压缩:否;图片名称:以上传时间的li..._php上传图片并显示图片代码

浏览器了解(七)Layout_浏览器控制台 查看layout-程序员宅基地

文章浏览阅读761次。Layout浏览器在Render之后已经确认了Render元素的大小,样式等信息,但是此时还没有确定元素的具体位置信息,这里还需要一个Layout过程。Layout过程计算元素的位置信息,通常情况下浏览器的中下面的元素的布局不会影响到上面的元素的布局,所以Layout可以自上而下地进行。其坐标位置基于Frame,使用top和left来定位。Layout的范围:1. 全局_浏览器控制台 查看layout

推荐文章

热门文章

相关标签