用docker主动提高linux的cpu和内存的占用率

用docker主动提高linux的cpu和内存的占用率

前期准备

1.安装docker
docker安装请参考:(如果是多台要跑请用ansible安装会更快)
docker安装部署
2.拉取一个centos的镜像

docker pull hub.c.163.com/library/centos

3.检查系统的CPU核数

[root@k8s-worker18 /home] sar 1 1
[root@k8s-worker18 /home]  lscpu  | grep CPU\(s\):

4.下载内存占用所需rpm包
包链接:memload-7.0-1.r29766.x86_64.rpm

cpu占用提高

cpuset-cpus=0,1,2,3,4,5,6,7为设置容器占用的核数(根据实际情况改),此例子为给容器分配八核。
1.用dockers创建cpu占用容器命令:

[root@k8s-worker18 /home] docker run -it --name=centos_cpu --restart=always --cpuset-cpus=0,1,2,3,4,5,6 hub.c.163.com/library/centos

2.上一个命令执行完会自动进入到新建容器,推出后重新进入容器内执行以下命

[root@k8s-worker18 /home] docker exec -it centos_cpu(容器名称) bash
[root@2a4e007cb39b /]  cat /dev/zero > /dev/null &
#该命令执行一次就会占一个cpu,按需多次执行

3.查看结果

top

在这里插入图片描述

内存占用提高

1.首先查看系统内存情况

[root@k8s-master4 ~]#  free -g

2.根据剩余内存,运行内存占用容器centos_free,其中-m 20480m是可自定义容器内存大小

[root@k8s-worker18 /home] docker run -it --name=centos_free --restart=always -m 20480m hub.c.163.com/library/centos

3.将内存站所需rpm包拷贝到容器内并进行安装

[root@k8s-worker18 /home] docker cp free-rpm.tgz centos_free:/home
[root@k8s-worker18 /home] docker exec -it centos_free bash
[root@04620b601962 home]#  tar -xvf free-rpm.tgz
[root@04620b601962 free-rpm]# rpm -ivh memload-7.0-1.r29766.x86_64.rpm

4.退出容器后,运行以下命令 其中memload 19456m ,为所需占用内存大小,切记占用内存不要大于系统剩余内存,否则会被kill

[root@k8s-worker18 /home] docker exec centos_free memload 19456m &

5.查看结果

[root@k8s-master4 ~]#  free -g

在这里插入图片描述
本文所提的两个资源若不能下载,请私信我!

<think> 我们参考了之前的对话历史,用户之前询问了在C++中如何限制CPU占用率,我们给出了三种方法(调整线程优先级、主动休眠控制、时间片调度)。现在用户的新问题是关于Linux系统中限制CPU占用率的方法,并提供了多个引用。 根据引用[2],我们看到了使用`setrlimit`函数限制内存占用率的示例。但注意,`setrlimit`也可以用来限制CPU时间(RLIMIT_CPU),但它限制的是进程的总CPU时间(以秒计),而不是实时的占用率百分比。 引用[3][4]提到了`cpulimit`工具,它通过动态暂停恢复进程(发送SIGSTOPSIGCONT信号)来限制进程的CPU占用率。 另外,我们知道Linux中还有cgroups(控制组)机制,可以更精细地控制进程组的资源使用。 因此,我们可以提供以下方法: ### 方法1:使用cpulimit命令 安装cpulimit: ```bash sudo apt update sudo apt install cpulimit ``` 限制指定进程的CPU占用率(例如限制进程ID为1234的进程使用不超过50%的CPU): ```bash cpulimit -p 1234 -l 50 ``` 限制整个程序的CPU占用率(例如限制程序`my_program`使用不超过50%的CPU): ```bash cpulimit -e my_program -l 50 ``` ### 方法2:使用cgroups(控制组) 1. 创建cgroup: ```bash sudo cgcreate -g cpu:/cpulimited ``` 2. 设置该cgroup的CPU使用限制(例如限制为50%,即每100ms周期内最多使用50ms CPU时间): ```bash # 设置CPU配额(每100000微秒周期内使用50000微秒,即50%) echo 50000 > /sys/fs/cgroup/cpu/cpulimited/cpu.cfs_quota_us echo 100000 > /sys/fs/cgroup/cpu/cpulimited/cpu.cfs_period_us ``` 3. 将进程加入该cgroup: ```bash sudo cgexec -g cpu:cpulimited /path/to/my_program ``` 或者将已运行的进程加入: ```bash sudo echo <PID> > /sys/fs/cgroup/cpu/cpulimited/tasks ``` ### 方法3:使用setrlimit(限制总CPU时间,非实时占用率) 在C++程序中,可以使用`setrlimit`函数来设置进程的总CPU时间(秒),超过则发送SIGXCPU信号。但这种方法不能限制实时的占用率百分比,而是限制总的CPU时间。示例: ```cpp #include <sys/resource.h> #include <iostream> int main() { struct rlimit rl; rl.rlim_cur = 60; // 限制进程最多使用60秒CPU时间 rl.rlim_max = 60; if (setrlimit(RLIMIT_CPU, &rl) == -1) { std::cerr << "Failed to set CPU limit\n"; return 1; } // 程序主体 while (true) { // 无限循环,但会在60秒CPU时间后收到SIGXCPU信号(默认终止) } return 0; } ``` ### 总结 - 需要实时限制CPU占用率百分比:推荐使用`cpulimit`工具或`cgroups`。 - 需要限制程序总CPU时间:使用`setrlimit(RLIMIT_CPU, ...)`。 - 在C++程序中主动控制:参考之前回答的“主动休眠控制”方法(在Linux中同样适用)。 > 注意:`cpulimit`工具使用简单,但会带来一定的性能开销;`cgroups`是内核级机制,效率更高,适合生产环境[^3][^4]。 §§相关问题§§ 1. 如何使用cgroups同时限制CPU内存? 2. cpulimit工具的实现原理是什么? 3. 在Docker容器中如何限制CPU使用率? </think> 在 Linux 系统中,有几种有效的方法可以限制 CPU 占用率,以下是最常用的三种方法: ### 方法 1:使用 cpulimit 工具(简单快捷) **cpulimit** 是一个专门设计用于限制进程 CPU 使用率的工具,它通过动态暂停恢复进程来实现控制: ```bash # 安装 cpulimit sudo apt update sudo apt install cpulimit # 限制单个进程(示例:限制进程ID为1234的进程使用不超过30% CPUcpulimit -p 1234 -l 30 # 限制整个程序(示例:限制firefox使用不超过50% CPUcpulimit -e firefox -l 50 ``` 原理:`cpulimit` 实时监控进程的 CPU 使用率,当超过阈值时发送 `SIGSTOP` 信号暂停进程,一段时间后再发送 `SIGCONT` 恢复运行[^3]。 优点:无需修改程序代码,使用简单。 ### 方法 2:使用 cgroups(内核级控制) **cgroups** (控制组) 是 Linux 内核提供的资源管理机制,可精确控制进程组资源: ```bash # 创建cgroup sudo cgcreate -g cpu:/cpulimited # 设置CPU配额(示例:限制为单核的40%) echo 40000 > /sys/fs/cgroup/cpu/cpulimited/cpu.cfs_quota_us # 40ms echo 100000 > /sys/fs/cgroup/cpu/cpulimited/cpu.cfs_period_us # 100ms周期 # 将进程加入cgroup sudo cgexec -g cpu:cpulimited /path/to/your_program ``` 原理:通过设置 `cpu.cfs_quota_us`(每周期可用时间) `cpu.cfs_period_us`(周期长度)实现硬性限制[^4]。 特点:内核级支持,开销极小,适合生产环境。 ### 方法 3:使用 setrlimit(程序级限制) 在 C/C++ 程序中调用 `setrlimit` 函数限制 CPU 时间: ```cpp #include <sys/resource.h> int main() { // 设置CPU时间限制(秒) struct rlimit rl; rl.rlim_cur = 60; // 软限制:60秒 rl.rlim_max = 120; // 硬限制:120秒 if(setrlimit(RLIMIT_CPU, &rl) == -1) { perror("setrlimit failed"); } // 程序主体... } ``` 原理:当进程累积的 CPU 时间超过 `rlim_cur` 时,内核会发送 `SIGXCPU` 信号,超过 `rlim_max` 则发送 `SIGKILL`[^2]。 适用场景:需要精确控制程序总 CPU 时间的场景。 ### 对比总结 | 方法 | 使用难度 | 控制精度 | 是否需要root | 适用场景 | |-------------|----------|----------|--------------|------------------------| | cpulimit | ⭐ | ⭐⭐ | 部分操作需要 | 临时限制,快速诊断 | | cgroups | ⭐⭐⭐ | ⭐⭐⭐ | 需要 | 生产环境,长期限制 | | setrlimit | ⭐⭐ | ⭐⭐ | 不需要 | 开发者主动控制程序行为 | > **重要提示**:对于多线程程序,建议配合 `taskset` 命令绑定到特定 CPU 核心,避免在多核间跳跃影响限制效果: > ```bash > taskset -c 0 cpulimit -p 1234 -l 30 # 绑定到核心0 > ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旦增赤列

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值