用户态可设置限制某进程的cpu占用率以及内存,以下介绍三种方法,如果有说的不详细,不正确的地方,望大家指正
-
限制实时进程或deadline进程:
a. 背景:SCHED_FIFO, SCHED_RR或SCHED_DEADLINE策略下调度的线程中的非阻塞无限循环处理可能会阻塞其他线程获取CPU
b. 函数:getrlimit, setrlimit, prlimit - get/set resource limits
c. 功能以及限制:为进程设置CPU,内存等限制,但是该进程CPU使用超过范围后会向进程发信号,而不是控制进程,用户可通过信号处理函数自己控制CPU占用率。When the process reaches the soft limit, it is sent a SIGXCPU signal. The default action for this signal is to terminate the process. However, the signal can be caught, and the handler canreturn control to the main program.
d. 参考: https://man7.org/linux/man-pages/man2/getrlimit.2.html
-
限制全部实时进程CPU占用
a. 介绍:linux系统中的两个proc文件:/proc/sys/kernel/sched_rt_period_us和/proc/sys/kernel/sched_rt_runtime_us。这两个文件规定了,在以sched_rt_period_us为一个周期的时间内,所有实时进程的运行时间之和不超过sched_rt_runtime_us。这两个文件的默认值是1s和0.95s,表示每秒种为一个周期,在这个周期中,所有实时进程运行的总时间不超过0.95秒,剩下的至少0.05秒会留给普通进程
b. 方法:
sysctl -n kernel.sched_rt_period_us # 实时进程调度的单位CPU时间 1 秒
==》1000000
sysctl -n kernel.sched_rt_runtime_us # 实时进程在 1 秒中实际占用的CPU时间, 0.95秒
==》950000
sysctl -w kernel.sched_rt_runtime_us=900000 # 设置实时进程每1秒中只占0.9秒的CPU时间
kernel.sched_rt_runtime_us = 900000
sysctl -n kernel.sched_rt_runtime_us
==》900000
c. 参考:https://blog.csdn.net/andylauren/article/details/70161041
- cgroup 中的设置
a. cgroup介绍: Linux内核实现了control group功能(cgroup,since linux 2.6.24),可以支持将进程分组,然后按组来划分各种资源(如 CPU、内存、磁盘 IO 等等) ,被 LXC、docker 等很多项目用于实现进程资源控制。
b. 创建cgroup:cgroup文件下有多个文件,表示可以限制的项目,在该项目下可以创建文件夹,例如在/sys/fs/cgroup/cpu下创建AA.DefaultResourceGroup文件夹,创建完之后会自动生成相应文件。
c. 如果想在 cgroup 中对进程进行控制, 需要内核编译选项 CONFIG_RT_GROUP_SCHED=y和CONFIG_FAIR_GROUP_SCHED=y,若未设置则没有相应设置文件。
d. 方法:开启选项后有cpu.cfs_period_us,cpu.cfs_quota_us(分时调度策略)
cpu.rt_period_us,cpu.rt_runtime_us(实时调度策略)文件,写这四个文件控制相应调度策略下进程的CPU限制时间,例如将 cpu.rt_runtime_us 设定为 200000,并将 cpu.rt_period_us 设定为 1000000。
e. 参考:https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/7/html/resource_management_guide/sec-cpu
其他参考网址:https://www.cnblogs.com/wang_yb/p/3942208.html