cpu平均负载高的几种情况

前言:

每次排查性能相关问题的时候,我们都会先通过监控来查看下当前机器的CPU负载,根据负载结果值的输出,来判断当前CPU的基本状况。

那么什么是CPU负载呢?具体CPU负载多少才算是正常的呢?有哪些情况会导致CPU负载高呢?

今天我们就来统一说明下。

注意:笔者使用ubuntu:18.04版本镜像创建docker 容器,如果没有相关命令,则需要提前装载好

1.CPU负载的查看

通过top命令或者uptime命令可以查看到

1.1 top命令

root@7bc18553126f:/# top
top - 02:10:14 up 22:10,  0 users,  load average: 8.08, 6.68, 3.56
Tasks:  15 total,   9 running,   6 sleeping,   0 stopped,   0 zombie

1.2 uptime命令

root@7bc18553126f:/# uptime
02:10:23 up 22:10,  0 users,  load average: 8.07, 6.72, 3.60

上面两个命令中load average所展示的结果就是当前CPU的负载值,这三个值分别代表:1min 5min 15min分钟内的平均负载值。

2.CPU平均负载的定义

通过1我们知道了如何查看CPU负载,那么什么是CPU负载呢?

标准答案是:单位时间内,系统处于可运行状态和不可中断状态的平均进程数。

可运行状态:正在使用CPU或者正在等待CPU的进程

不可中断状态:处于内核态关键流程中的进程,不可被打断,如等待硬件设备IO响应

通过命令ps我们可以查看到当前有哪些进程,如下所示:

root@7bc18553126f:/# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root     42290  0.2  0.1   3020  2340 pts/1    S+   01:00   0:13 watch -d uptime
root     49918  0.0  0.1   5292  2384 pts/3    R+   02:23   0:00 ps aux

STAT这一列就代表当前进程的状态,具体有哪些状态呢?我们可以通过man ps来查看到:

               D    uninterruptible sleep (usually IO)
               R    running or runnable (on run queue)
               S    interruptible sleep (waiting for an event to complete)
               T    stopped by job control signal
               t    stopped by debugger during the tracing
               W    paging (not valid since the 2.6.xx kernel)
               X    dead (should never be seen)
               Z    defunct ("zombie") process, terminated but not reaped by its parent

正常运行情况下的进程处于R状态(已执行或等待执行);不可中断进程处于D状态;

那么CPU 平均负载就是单位时间内处于R状态+D状态的进程数。

3.CPU平均负载多少比较合适?

理论上来说:最好的状态就是每个CPU有一个进程在运行是最好的(如我们的机器是4C,那么有4个正在运行的进程就非常完美)

依据业界经验值而言:当load average <= CPU核心数*0.7时都算是比较正常的,如果超过这个值,那么需要排查下是哪些进程导致CPU load高

4.模拟CPU高平均负载的几种情况

4.1 模拟CPU密集型进程

4.1.1 执行stress命令

模拟1个CPU忙碌进程场景

root@7bc18553126f:/# stress --cpu 1 --timeout 600
stress: info: [51697] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd

4.1.2 监控uptime命令

root@7bc18553126f:/# watch -d uptime
02:43:54 up 22:44,  0 users,  load average: 0.69, 0.22, 0.54

可以看到loadaverage在变化

4.1.3 vmstat监控总的系统变化

root@7bc18553126f:/# vmstat -w 5
procs -----------------------memory---------------------- ---swap-- -----io---- -system-- --------cpu--------
 r  b         swpd         free         buff        cache   si   so    bi    bo   in   cs  us  sy  id  wa  st
 4  0       118168        95456       128572      1540068    0    0    28    39  102   73   1   0  98   0   0
 1  0       118168        95172       128572      1540068    0    0     0     0 1232  357  25   0  75   0   0
 1  0       118168        95424       128572      1540068    0    0     0     0 1270  385  25   0  75   0   0
 1  0       118168        95424       128572      1540068    0    0     0     0 1223  334  25   0  75   0   0

重点关注下cpu这一列,id(空闲)75,us(用户进程)25,说明都是某个用户进程占用的CPU。

4.1.4 通过mpstat监控各CPU的变化

root@7bc18553126f:/# mpstat -P ALL 5
Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
Average:     all   10.81    0.00    0.10    0.00    0.00    0.01    0.00    0.00    0.00   89.08
Average:       0    0.04    0.00    0.10    0.00    0.00    0.04    0.00    0.00    0.00   99.82
Average:       1   42.92    0.00    0.04    0.00    0.00    0.00    0.00    0.00    0.00   57.04
Average:       2    0.16    0.00    0.14    0.00    0.00    0.00    0.00    0.00    0.00   99.70
Average:       3    0.12    0.00    0.08    0.00    0.00    0.02    0.00    0.00    0.00   99.78

相对于vmstat命令而言,mpstat命令可以监控到各CPU的变化。

拿CPU-1来说,%usr用户进程占用42.92,%sys系统进程占用0.04,%idle空闲57.04,总计100

4.1.5 通过pidstat查看具体进程

我们已经知道了当前某个CPU被占满了,那么如何查看是哪个进程占用的呢?可以通过pidstat命令

root@7bc18553126f:/# pidstat 5
Linux 5.10.76-linuxkit (7bc18553126f) 03/13/22 _aarch64_ (4 CPU)

02:57:51      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
02:57:56        0     42290    0.40    0.00    0.00    0.00    0.40     0  watch
02:57:56        0     52989  100.00    0.00    0.00    0.00  100.00     3  stress

可以很清晰的看出,PID为52989 的stress进程,占用了100%的CPU

4.2 模拟IO密集型进程

4.2.1 stress命令模拟sync()写入磁盘

root@7bc18553126f:/# stress -i 1 --timeout 600
stress: info: [54265] dispatching hogs: 0 cpu, 1 io, 0 vm, 0 hdd

本次示例的含义是:产生1个进程,反复调用sync()将内存中的内容写到磁盘上。

写到磁盘的过程涉及磁盘IO(用户进程到系统进程的切换)

4.2.2 监控uptime命令

root@7bc18553126f:/etc/sysctl.d# watch -d uptime
03:12:21 up 23:12,  0 users,  load average: 1.71, 0.47, 0.19

4.2.3 vmstat监控总的系统变化

root@7bc18553126f:/# vmstat -w 5
procs -----------------------memory---------------------- ---swap-- -----io---- -system-- --------cpu--------
 r  b         swpd         free         buff        cache   si   so    bi    bo   in   cs  us  sy  id  wa  st
 1  2       146032      1131656       106364       527752    0    0    20    86   42   50   2   1  97   0   0
 3  0       146032       160700       109568      1496368    0    0     1 1442654 10388 18336   0  41  45  14   0
 1  1       146032       281032       111940      1370432    0    0     4 1487166 9408 15805   0  43  45  13   0
 2  0       146032       587840       115412      1062792    0    0     4 1360270 10255 18791   0  40  46  14   0
 1  1       146032      1010076       117064       636556    0    0    25 1352889 10031 19730   0  39  46  15   0

我们观察下cpu这一列:wa(等待IO)占用14,sys(系统进程消耗)占用9。

相比较4.1.3中,这里的system列比较亮眼,in(每秒中断数)增长很快,cs(每秒上下文切换数)也增长很快。

4.2.4 通过mpstat监控各CPU的变化

root@7bc18553126f:/# mpstat -P ALL 5
Linux 5.10.76-linuxkit (7bc18553126f) 03/13/22 _aarch64_ (4 CPU)

13:57:20     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
13:57:25     all    0.31    0.00   39.30   14.29    0.00    0.15    0.00    0.00    0.00   45.96
13:57:25       0    0.20    0.00   20.98   12.02    0.00    0.41    0.00    0.00    0.00   66.40
13:57:25       1    0.00    0.00   95.57    0.00    0.00    0.00    0.00    0.00    0.00    4.43
13:57:25       2    0.61    0.00   19.76   24.44    0.00    0.00    0.00    0.00    0.00   55.19
13:57:25       3    0.41    0.00   20.21   20.82    0.00    0.00    0.00    0.00    0.00   58.56

相比较4.2.3中的综合数据,这里把每个CPU上的数据都细化了。

同样的,CPU平均负载上升的主要原因就是:iowait上升。

注意:笔者这里的模拟是有点问题的,虽然上面iowait在上升,但是主要还是sys的上升。

4.2.5 通过pidstat查看具体进程

root@7bc18553126f:/# pidstat 5
Linux 5.10.76-linuxkit (7bc18553126f) 03/13/22 _aarch64_ (4 CPU)

14:00:10      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
14:00:15        0     13209    0.20   20.60    0.00    1.00   20.80     3  stress
14:00:15        0     13210    0.00   96.40    0.00    0.20   96.40     0  stress
14:00:15        0     54333    0.20    0.00    0.00    0.00    0.20     1  watch

同样是我们的stress进程,占用了CPU

4.3 模拟大量进程场景

4.3.1 stress命令模拟8个进程

root@7bc18553126f:/# stress -c 8 --timeout 600
stress: info: [56180] dispatching hogs: 8 cpu, 0 io, 0 vm, 0 hdd

这里会产生8个进程,每个进程都会不停的计算随机数的平方根

笔者使用的docker是4核的,所以下面可以看到平均负载明显升高

4.3.2 监控uptime命令

root@7bc18553126f:/etc/sysctl.d# watch -d uptime
03:33:10 up 23:33,  0 users,  load average: 3.04, 1.26, 0.88

1min内的load average快速升到了3,说明有大量的进程在等待运行

4.3.3 vmstat监控总的系统变化

root@7bc18553126f:/# vmstat -w 5
procs -----------------------memory---------------------- ---swap-- -----io---- -system-- --------cpu--------
 r  b         swpd         free         buff        cache   si   so    bi    bo   in   cs  us  sy  id  wa  st
11  0       118168        95668       128580      1540068    0    0    27    37   17  102   2   0  98   0   0
 8  0       118168        95700       128580      1540068    0    0     0     0 4144  749 100   0   0   0   0
 8  0       118168        95700       128580      1540068    0    0     0     0 4123  726 100   0   0   0   0
 8  0       118168        95448       128580      1540068    0    0     0     0 4166  829 100   0   0   0   0
 8  0       118168        95196       128580      1540068    0    0     0     0 4140  752 100   0   0   0   0

可以看到,有8个进程在运行,占用的都是用户进程(us),system中的in(中断)和cs(上下文切换)有一定的升高

4.3.4 通过mpstat监控各CPU的变化

root@7bc18553126f:/# mpstat -P ALL 5
Linux 5.10.76-linuxkit (7bc18553126f) 03/13/22 _aarch64_ (4 CPU)

03:34:41     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
03:34:46     all   99.90    0.00    0.10    0.00    0.00    0.00    0.00    0.00    0.00    0.00
03:34:46       0   99.80    0.00    0.20    0.00    0.00    0.00    0.00    0.00    0.00    0.00
03:34:46       1   99.80    0.00    0.20    0.00    0.00    0.00    0.00    0.00    0.00    0.00
03:34:46       2   99.80    0.00    0.20    0.00    0.00    0.00    0.00    0.00    0.00    0.00
03:34:46       3  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00

可以看到,4个CPU都被占满了,都是用户进程在执行操作

4.3.5 通过pidstat查看具体进程

root@7bc18553126f:/# pidstat 5
Linux 5.10.76-linuxkit (7bc18553126f) 03/13/22 _aarch64_ (4 CPU)

03:34:09      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
03:34:14        0     54333    0.20    0.20    0.00    0.00    0.40     1  watch
03:34:14        0     56181   49.80    0.00    0.00   50.20   49.80     2  stress
03:34:14        0     56182   49.60    0.00    0.00   50.40   49.60     0  stress
03:34:14        0     56183   49.80    0.00    0.00   50.20   49.80     3  stress
03:34:14        0     56184   49.60    0.00    0.00   50.40   49.60     0  stress
03:34:14        0     56185   49.80    0.00    0.00   50.40   49.80     1  stress
03:34:14        0     56186   49.60    0.00    0.00   50.40   49.60     3  stress
03:34:14        0     56187   49.80    0.00    0.00   50.20   49.80     2  stress
03:34:14        0     56188   49.80    0.00    0.00   50.20   49.80     1  stress

最终还是定位到stress命令,这里比较好玩的是%usr占了一半,%wait占了一半(这个进程等待执行所耗费的CPU)。

为啥会这么高?因为我们CPU是4核,此时有8个进程在运行,那么同时运行的最多只能有4个,另外4个进程只能等待。

总结:

CPU load average只是提供了一个查看系统整体性能的方式,但是CPU平均负载高不一定是因为CPU非常繁忙导致的。

1.CPU密集型

我们4.3中所模拟的这个示例,模拟大量进程进行CPU计算,此时CPU负载会升高

2.IO密集型

我们4.2中所模拟的这个示例,模拟进程大量进行磁盘写操作,可以看到iowait升高比较明显,中断和上下文切换升高也比较明显,这种情况也会导致CPU负载高

3.多进程切换

通过对比4.1和4.3中的示例,我们直接将pidstat的数据拉出来比较下

单进程CPU密集型:

root@7bc18553126f:/# pidstat 5
Linux 5.10.76-linuxkit (7bc18553126f) 03/13/22 _aarch64_ (4 CPU)

02:57:51      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
02:57:56        0     42290    0.40    0.00    0.00    0.00    0.40     0  watch
02:57:56        0     52989  100.00    0.00    0.00    0.00  100.00     3  stress

多进程CPU密集型:

root@7bc18553126f:/# pidstat 5
Linux 5.10.76-linuxkit (7bc18553126f) 03/13/22 _aarch64_ (4 CPU)

03:34:09      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
03:34:14        0     54333    0.20    0.20    0.00    0.00    0.40     1  watch
03:34:14        0     56181   49.80    0.00    0.00   50.20   49.80     2  stress
03:34:14        0     56182   49.60    0.00    0.00   50.40   49.60     0  stress
03:34:14        0     56183   49.80    0.00    0.00   50.20   49.80     3  stress
03:34:14        0     56184   49.60    0.00    0.00   50.40   49.60     0  stress
03:34:14        0     56185   49.80    0.00    0.00   50.40   49.80     1  stress
03:34:14        0     56186   49.60    0.00    0.00   50.40   49.60     3  stress
03:34:14        0     56187   49.80    0.00    0.00   50.20   49.80     2  stress
03:34:14        0     56188   49.80    0.00    0.00   50.20   49.80     1  stress

多进程CPU密集型,主要耗在%usr(用户进程),和%wait(等待CPU执行)

而单进程CPU密集型,全部好在%usr(用户进程)上,因为其不存在CPU竞争的问题,所以不会将CPU消耗在wait上。

参考:

极客时间 <<Linux性能优化实战>>

<think>嗯,用户问的是怎么让LinuxCPU负载于80%。首先,我需要理解CPU负载是什么意思。CPU负载通常指的是系统正在使用和等待使用CPU的进程数量。负载意味着CPU在处理很多任务,可能已经接近满负荷运行了。用户可能是在做压力测试,或者想测试系统在负载下的表现,比如散热、性能稳定性之类的。 接下来,我需要考虑不同的方法来实现这一点。常见的方法有用工具如stress、stress-ng,或者写脚本循环执行计算任务。另外,多线程或多进程的程序也可以提CPU使用率。可能还需要考虑如何监控CPU负载,用top、htop或者mpstat这些命令。 用户可能对Linux系统不太熟悉,所以步骤需要详细。比如安装stress工具,运行命令,可能需要指定CPU核心数和时间。还有,用户可能需要知道如何结束测试,避免系统卡死。安全方面也要提醒,长期负载可能影响系统稳定性,甚至导致过热。 另外,是否要考虑不同Linux发行版的安装命令差异,比如Ubuntu用apt,CentOS用yum。还有,用户可能需要验证负载是否真的达到了80%以上,所以监控步骤也很重要。可能还要提到使用dd命令或者数学计算脚本,比如无限循环计算平方根,这样会消耗CPU资源。 还要注意是否需要多核心还是单核心的负载,stress的参数调整,比如--cpu选项指定核心数。比如4核的话,每个核心跑满的话,可能需要多个进程。或者用yes命令重定向到/dev/null,这样也能消耗CPU。 还有可能用户没有root权限,是否需要sudo来安装软件。或者有没有其他不需要安装额外工具的方法,比如写bash脚本。比如一个无限循环,执行计算任务,这样每个线程占用一个核心。 然后,组合这些方法,给出几种不同的方案,让用户可以根据自己的情况选择。同时提醒谨慎操作,避免系统崩溃,建议在测试环境中进行。可能还要提到使用nohup让任务在后台运行,以及如何终止进程。 最后,总结步骤,确保用户能一步步操作,并且理解每个步骤的作用。需要检查命令是否正确,比如stress的正确用法,监控命令的使用。可能还要提到负载的计算方式,1分钟、5分钟、15分钟的平均负载,确保用户正确理解结果。</think>在Linux系统中,可以通过以下步骤有计划地提CPU负载至80%以上。请谨慎操作,建议在测试环境中进行: --- ### 一、使用专用压测工具 1. **安装`stress`工具** ```bash # Ubuntu/Debian sudo apt install stress # CentOS/RHEL sudo yum install stress ``` 2. **启动CPU压力测试** ```bash stress --cpu 4 --timeout 600 # 启动4个worker进程,持续600秒(10分钟) ``` - 调整`--cpu`参数:设为等于CPU核心数可尝试满载,设为更数值可能触发更激烈竞争 - 监控命令:`top`或`htop`观察`%Cpu(s)`指标 --- ### 二、通过数学计算脚本实现 1. **创建无限循环脚本** ```bash # 单线程版本 while :; do echo "2^999999" | bc &>/dev/null; done # 多线程版本(4线程示例) for i in {1..4}; do (while true; do awk 'BEGIN {while(1){}}'; done) & done ``` 2. **终止方法** ```bash pkill -f "bc|awk" # 结束相关进程 ``` --- ### 三、使用`dd`命令(低效但简单) ```bash # 生成计算密集型任务 dd if=/dev/zero of=/dev/null bs=1M & # 重复后台运行多个实例 ``` --- ### 四、系统监控与验证 1. **实时监控命令** ```bash watch -n 1 "uptime; mpstat -P ALL 1 1" # 查看平均负载和每个CPU核心利用率 ``` 2. **关键指标说明** - **平均负载**:1分钟/5分钟/15分钟平均值,接近CPU核心数时表示负载 - **%usr**:用户空间CPU使用率,持续>80%即达到目标 --- ### 五、注意事项 1. **散热风险**:长时间负载可能导致CPU过热 2. **进程管理**:通过`kill`或`pkill`及时结束测试进程 3. **虚拟化环境**:在云服务器中可能触发资源限制告警 4. **负载均衡**:使用`taskset`可绑定到特定CPU核心 ```bash taskset -c 0,1 stress --cpu 2 # 仅使用0号和1号CPU核心 ``` --- 通过组合上述方法(如同时运行多个压测进程),可精确控制CPU负载水平。建议先进行短期测试,逐步调整进程数量以达到目标负载值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

恐龙弟旺仔

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

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

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

打赏作者

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

抵扣说明:

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

余额充值