ubuntu限制CPU使用率

本文介绍在Ubuntu系统中如何通过cpufrequtils和cpulimit工具限制CPU频率和使用率,防止过热重启,包括设置最高频率、限制单个进程的CPU使用率等方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求:

由于程序是多进程,所以会极大使用CPU资源,但CPU如果长时间处于高强度工作(也就是长时间超频),温度极高,在主板里有个CPU温度保护,超过一定温度就会重启。所以我想直接限制CPU的最高频率,那么就不会出现长时间超频,那么问题也不会特别高(虽然也很高),但最起码不会程序跑着跑着就重启了。

方法一

这种方法解决了我的问题,我给每个CPU核心设置了最高频率。

安装cpufrequtils:  sudo apt-get install cpufrequtils

查看cpu:                 sudo cpufreq-info 

设置cpu模式:          cpufreq-set -g {powersave, userspace, ondemand, conservative, performance} 

对应于{最省电(最低频率),用户控制,最高或最低,正常,最大性能}

模式就是执行cpufreq-info后看到的所支持的模式。

比如以下几种:powersave, userspace, ondemand, conservative, performance。

powersave,是无论如何都只会保持最低频率的所谓“省电”模式;

userspace,是自定义频率时的模式,这个是当你设定特定频率时自动转变的;

ondemand,一有cpu计算量的任务,就会立即达到最大频率运行,等执行完毕就立即回到最低频率;

conservative,翻译成保守的,也就是默认的模式,一般选择这个,会自动在频率上下限调整;

performance,顾名思义只注重效率,无论如何一直保持以最大频率运行。

 

设置cpu频率:          cpufreq-set -f {600~1500}(设置你的频率,使用cpufreq-info可以查看你的cpu支持哪些) 

选择 1,3,4,5 的时候在以下范围内自动控制:使用 cpufred-set -d 600M (最低) ,cpufreq-set -u 1.5G (最高) 

对于非单核的cpu需要加上参数 -c ,c就是cpu的序号,使用cpufreq-info可以查询到。 

我自己的cpu设置:

#!/bin/bash
#for ((i=0; i<8; i ++))
#do
#  sudo cpufreq-set -c $i -u 3.5G
#  echo "cpu" $i "be set 3.5G" 
#done

start=(0 1 2 3 4 5 6 7)
for i in ${start[*]}
do
  sudo cpufreq-set -c $i -u 3.0G
  echo "cpu" $i "be set 3.0G"
done 

方法二

这里的cpulimit好像不能满足我的需求,但还是有他自己的用途的,他对于单个进程,单个应用都有用。

安装cpulimit

sudo apt-get install cpulimit

Usage Syntax

Usage: cpulimit TARGET [OPTIONS...]
   TARGET must be exactly one of these:
      -p, --pid=N        pid of the process
      -e, --exe=FILE     name of the executable program file
      -P, --path=PATH    absolute path name of the executable program file
   OPTIONS
      -b  --background   run in background
      -l, --limit=N      percentage of cpu allowed from 0 to 100 (mandatory)
      -v, --verbose      show control statistics
      -z, --lazy         exit if there is no suitable target process, or if it dies
      -h, --help         display this help and exit

基准测试CPU使用率

让我们的基准测试CPU使用率而不请将CPULimit。

下面是如何利用你的CPU有一个应用程序的示例:

sudo md5sum /dev/zero &

Ubuntu系统cpulimit限制cpu使用率例子-ubuntu 限制cpu使用率

这个'forks'md5sum然后加工成的背景。

现在你可以看到CPU使用率在顶部:

Ubuntu系统cpulimit限制cpu使用率例子-ubuntu查看cpu使用率

正如你可以看到它消耗的CPU资源几乎100%(因为我们在这滴一个CPU核心)。

我们可以把这个过程给前台使用FG和CTRL + C取消它:

Ubuntu系统cpulimit限制cpu使用率例子-ubuntu cpu使用率

限制CPU使用率与请将CPULimit

现在我们可以测试请将CPULimit,看看它实际上做什么它应该是。

让我们限制CPU使用率到40%,并运行相同的命令:

sudo cpulimit -l 40 md5sum /dev/zero &

Ubuntu系统cpulimit限制cpu使用率例子-ubuntu查看gpu使用率

果然,这是限制为40%:

Ubuntu系统cpulimit限制cpu使用率例子-ubuntu gpu使用率

多核液滴

在具有多个处理器的液滴,则需要限制每个进程的CPU使用率。

这里是叉4的进程不受任何限制的脚本,并让他们在您的服务器上同时运行:

for j in `seq 1 4`; do md5sum /dev/zero & done

每个CPU核心是资源利用几乎达到100%:

top - 23:29:28 up 7 days, 13:54,  1 user,  load average: 0.80, 1.08, 0.53
Tasks:  77 total,   5 running,  72 sleeping,   0 stopped,   0 zombie
%Cpu0  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  : 93.2 us,  6.8 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu2  : 95.0 us,  5.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  : 98.3 us,  1.7 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   8178228 total,   380196 used,  7798032 free,    28136 buffers
KiB Swap:        0 total,        0 used,        0 free,   251708 cached
PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND
8400 root      20   0  7172  612  520 R 101.7  0.0   0:03.10 md5sum 8401 root      20   0  7172  612  520 R 101.7  0.0   0:03.10 md5sum 8399 root      20   0  7172  616  520 R  98.4  0.0   0:03.06 md5sum 8402 root      20   0  7172  612  520 R  98.4  0.0   0:03.09 md5sum

要使用请将CPULimit为每个进程,将其放置在命令前:

for j in `seq 1 4`; do cpulimit -l 40 md5sum /dev/zero & done

现在每个进程使用的每个线程最多40%,并且不超载的服务器:
 

top - 23:31:03 up 7 days, 13:55,  1 user,  load average: 2.68, 1.72, 0.82
Tasks:  81 total,   5 running,  76 sleeping,   0 stopped,   0 zombie
%Cpu0  : 39.4 us,  0.7 sy,  0.0 ni, 59.6 id,  0.0 wa,  0.0 hi,  0.0 si,  0.3 st
%Cpu1  : 38.7 us,  1.7 sy,  0.0 ni, 59.6 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu2  : 39.4 us,  1.3 sy,  0.0 ni, 59.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  : 39.4 us,  1.7 sy,  0.0 ni, 58.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   8178228 total,   380452 used,  7797776 free,    28144 buffers
KiB Swap:        0 total,        0 used,        0 free,   251708 cached
  PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND
 8442 root      20   0  7172  616  520 R  40.4  0.0   0:06.10 md5sum  8440 root      20   0  7172  612  520 R  40.0  0.0   0:06.09 md5sum  8435 root      20   0  7172  616  520 R  39.7  0.0   0:06.09 md5sum
8436 root      20   0  7172  612  520 R  39.7  0.0   0:06.10 md5sum

限制firefox使用30% cpu利用率

# cpulimit -e firefox -l 30限制进程号1313的程序使用30% cpu利用率

# cpulimit -p 1313 -l 30根据进程名找出pid的方法

# ps aux | less
# ps aux | grep firefox
# pgrep -u vivek php-cgi
# pgrep lighttpd 可以使用绝对路径限制进程的cpu利用率

# cpulimit -P /opt/firefox/firebox -l 30单核cpu和多核cpu 

单核cpu的使用率范围为0%-100%,四核cpu的使用率范围为0%-400%.

以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索服务器 , 测试 , cpu , 进程 , 多核 free ubuntu 限制cpu使用率、ubuntu查看cpu使用率、ubuntu cpu使用率、ubuntu查看gpu使用率、ubuntu gpu使用率,以便于您获取更多的相关知识。

<think>好的,我现在需要帮助用户解决如何优化程序以降低高CPU使用率的问题。首先,我需要回顾用户提供的引用资料,看看有哪些已有的建议。引用[1]提到了平均负载和CPU使用率的区别,指出I/O密集型任务可能导致高负载但CPU使用率不一定高。引用[2]和[3]提到了系统优化和减少使用的CPU数量,引用[4]讨论了释放CPU资源的方法,比如Thread.Sleep(0),引用[5]则涉及内核刷新脏数据导致的高CPU问题。 用户的问题是如何优化程序来降低高CPU使用率。我需要结合这些引用,整理出系统级和代码级的优化方法。首先,系统级优化可能包括更新系统、调整进程优先级、限制CPU核心使用等。代码层面的优化可能需要分析热点代码,减少循环和计算量,使用异步I/O,合理释放资源等。此外,线程管理和避免竞态条件也很重要。 接下来,我需要确保回答结构清晰,分步骤说明。可能需要分为系统级优化、代码级优化、线程与进程管理、监控与诊断工具这几个方面。同时,引用相关的资料来支持每个建议,例如在提到减少CPU核心使用时引用[3],在提到释放资源时引用[4],处理I/O问题时引用[1]和[5]。 还需要注意用户提到的生成相关问题,所以最后要添加几个相关问题,比如如何定位高CPU的代码、异步编程如何帮助、系统配置参数调整等。 需要检查是否符合之前的系统级指令:使用正确的中文回答,数学公式的格式正确,引用标识自然。例如,在提到线程优先级时引用[4],处理I/O时引用[1]和[5]。另外,代码示例需要用正确的格式,比如展示如何设置线程优先级或使用异步方法。 最后,确保回答真实可靠,建议的方法有引用支持,并且逻辑清晰,帮助用户逐步解决问题。</think>### 如何优化程序以降低高CPU使用率? #### 一、系统级优化 1. **更新系统与软件** 定期更新系统和依赖库,修复可能导致资源泄漏的漏洞。例如,通过以下命令更新Ubuntu系统: ```bash sudo apt update && sudo apt upgrade -y ``` 这可以优化内核调度策略和硬件驱动[^2]。 2. **限制CPU核心使用** 对于多线程程序,可绑定任务到特定CPU核心,避免频繁切换核心的开销。例如,通过`taskset`命令限制进程使用的CPU: ```bash taskset -c 0,1 ./your_program ``` 减少使用的CPU数量可有效降低整体占用率[^3]。 3. **调整内核参数** 对于I/O密集型任务,修改脏页刷新策略以减少CPU突发占用。例如,调整`/proc/sys/vm/dirty_background_ratio`的值: ```bash echo 10 > /proc/sys/vm/dirty_background_ratio ``` 这允许异步刷新脏数据,避免同步操作导致的CPU峰值[^5]。 --- #### 二、代码级优化 1. **定位热点代码** 使用性能分析工具(如`perf`、`gprof`)找出消耗CPU最多的函数。例如,执行以下命令生成火焰图: ```bash perf record -g ./your_program && perf script | stackcollapse-perf.pl | flamegraph.pl > output.svg ``` 2. **减少循环与计算冗余** - 避免在循环内重复计算固定值,提取到外部。 - 使用更高效的算法(如将$O(n^2)$优化为$O(n \log n)$)。 - 利用空间换时间,缓存中间结果。 3. **异步I/O与非阻塞操作** 将文件读写、网络请求等I/O操作改为异步模式,避免阻塞线程。例如,在C#中使用`async/await`: ```csharp public async Task ReadFileAsync(string path) { using (var reader = new StreamReader(path)) { string content = await reader.ReadToEndAsync(); } } ``` 这减少线程等待时间,缓解CPU压力[^1]。 --- #### 三、线程与进程管理 1. **合理释放CPU资源** 在密集计算循环中插入`Thread.Sleep(0)`,主动让出CPU时间片。例如: ```csharp while (true) { // 计算逻辑 Thread.Sleep(0); // 释放当前线程的CPU占用[^4] } ``` 2. **调整线程优先级** 降低非关键任务的线程优先级,避免抢占核心资源: ```csharp Thread workerThread = new Thread(BackgroundTask); workerThread.Priority = ThreadPriority.Lowest; ``` 3. **避免竞态条件与锁冲突** 使用无锁数据结构(如环形缓冲区)或减小锁粒度。例如,用`Interlocked`代替`lock`: ```csharp Interlocked.Increment(ref counter); // 原子操作,减少锁竞争 ``` --- #### 四、监控与诊断工具 1. **实时监控工具** - `top`/`htop`:查看进程实时CPU占用。 - `pidstat`:按线程粒度统计CPU使用率(`pidstat -t -p <PID> 1`)。 2. **分析系统负载** 结合**平均负载**(`uptime`)和**CPU使用率**,区分CPU密集型与I/O密集型问题。例如,若负载高但CPU使用率低,可能是I/O瓶颈导致进程排队[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值