Linux系统篇—CPU平均负载介绍与案例假设

本文详细介绍了Linux系统中的平均负载和CPU使用率的区别,以及如何通过top、uptime、iostat、mpstat和pidstat等工具进行系统性能分析。平均负载不仅包括CPU使用中的进程,还包括等待I/O的进程,它反映了系统整体的负载情况。当平均负载超过CPU数量的70%时,可能需要进行问题排查。通过案例分析了CPU密集型、I/O密集型和大量进程场景下的平均负载变化,并提供了排查方法。

theme: cyanosis

「本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!

平均负载

通过执行top或者uptime命令,可以了解系统的负载情况,如图所示:

image.png

每列输出的含义:

第一行包括:当前时间、系统运行时间、正在登陆的用户数 image.png

load average:三个数字分别表示 过去1分钟、5分钟、15分钟的平均负载

cpu使用率

CPU 使用率,是单位时间内 CPU 繁忙情况的统计,跟平均负载并不一定完全对应。 比如: * CPU 密集型进程,使用大量 CPU 会导致平均负载升高,此时这两者是一致的; * I/O 密集型进程,等待 I/O 也会导致平均负载升高,但 CPU 使用率不一定很高; * 大量等待 CPU 的进程调度也会导致平均负载升高,此时的 CPU 使用率也会比较高。

平均负载的含义

平均负载是指单位时间内,系统处于可运行状态不可中断状态的平均进程数,它不仅包括了正在使用 CPU 的进程,还包括等待 CPU 和等待I/O 的进程。也就是平均活跃进程数,它和 CPU 使用率并没有直接关系。

  • 可运行状态的进程
    正在使用 CPU 或者正在等待 CPU 的进程,也就是我们常用ps 命令看到的,处于 R 状态(Running 或 Runnable) 的进程

  • 不可中断状态的进程
    正处于内核态关键流程中的进程,并且这些流程是不可打断的, 比如最常见的是等待硬件设备的 I/O 响应,也就是我们在 ps 命令中看到的 D 状态(Uninterruptible Sleep,也称为 Disk Sleep)的进程。 不可中断状态实际上是系统对进程和硬件设备的一种保护机制。

平均负载多少合适

最理想的负载就是每个cpu上都刚好运行一个进程,这样每个cpu都得到了充分利用。所以在评判平均负载时,首先你要知道系统有几个 CPU,可通过以下命令查询 ```

关于 grep 和 wc 的用法请查询它们的手册或者网络搜索

grep 'model name' /proc/cpuinfo | wc -l ```

当平均负载为2时,意味着什么呢? * 在只有 2 个 CPU 的系统上,意味着所有的 CPU 都刚好被完全占用。
* 在 4 个 CPU 的系统上,意味着 CPU 有 50% 的空闲。
* 而在只有 1 个 CPU 的系统中,则意味着有一半的进程竞争不到 CPU。

当平均负载比 CPU 个数还大的时候,系统就已经出现了过载。

load average变化举例说明

如果 1 分钟的值远小于 15 分钟的值,就说明系统最近 1 分钟的负载在减少,而过去15 分钟内却有很大的负载。

如果 1 分钟的值远大于 15 分钟的值,就说明最近 1 分钟的负载在增加,这种增加有可能只是临时性的,也有可能还会持续增加下去,所以就需要持续观察一旦 1分钟的平均负载接近或超过了 CPU 的个数,就意味着系统正在发生过载的问题,这时就得分析调查是哪里导致的问题,并要想办法优化了。

一般情况下,当 平均负载高于 CPU 数量 70% 的时候,就应该分析排查负载高的问题了

但 70% 这个数字并不是绝对的,最推荐的方法,还是把系统的平均负载监控起来,然后根据更多的历史数据,判断负载的变化趋势。当发现负载有明显升高趋势时,比如说负载翻倍了,再去做分析和调查。

平均负载问题排查与案例假设

通过使用iostatmpstatpidstat工具,找出平均负载升高的根源

准备

预先安装 stresssysstat 包,如 apt install stress sysstat * stress: 一个 Linux 系统压力测试工具,可以用作异常进程模拟平均负载升高的场景。 * sysstat: 包含了常用的 Linux 性能工具,用来监控和分析系统的性能。案例会用到这个包的两个命令 mpstatpidstat。 * mpstat 一个常用的多核 CPU 性能分析工具,用来实时查看每个 CPU 的性能指标,以及所有 CPU 的平均指标
* pidstat 一个常用的进程性能分析工具,用来实时查看进程的 CPU、内存、I/O 以及上下文切换等性能指标。

场景一:CPU 密集型进程

  1. 在第一个终端运行 stress --cpu 1 --timeout 600 命令,模拟一个 CPU 使用率 100% 的场景 (不想模拟的可以忽略)
  2. 在第二个终端运行 watch -d uptime 查看平均负载的变化情况 (-d 参数表示高亮显示变化的区域)
  3. 在第三个终端运行 mpstat -P ALL 5 查看 CPU 使用率的变化情况 (-P ALL 表示监控所有 CPU,后面数字 5 表示间隔 5 秒后输出一组数据) > 从 [2] 可以看到,1 分钟的平均负载会慢慢增加到 1.00,而从 [3] 中还可以看到,正好有一个 CPU 的使用率为 100%,但它的 iowait 只有 0。这说明,平均负载的升高正是由于 CPU 使用率为 100% 。
  4. 使用 pidstat -u 5 1 来查找哪个进程导致了 CPU 使用率为 100% (间隔 5 秒后输出一组数据) image.png从这里可以明显看到,stress 进程的 CPU 使用率为 100%。

场景二:I/O 密集型进程

  1. 运行 stress -i 1 --timeout 600 命令,但这次模拟 I/O 压力,即不停地执行 sync
  2. 在第二个终端运行 watch -d uptime 查看平均负载的变化情况 (-d 参数表示高亮显示变化的区域)
  3. 在第三个终端运行 mpstat -P ALL 5 1 查看 CPU 使用率的变化情况 (-P ALL 表示监控所有 CPU,后面数字 5 表示间隔 5 秒后输出一组数据) image.png > 从 [3] 可以看到,1 分钟的平均负载会慢慢增加到 1.06,其中一个CPU的系统的CPU使用率升高到了 23.87,而 iowait 高达 67.53%。这说明,平均负载的升高是由于 iowait 的升高。
  4. 使用 pidstat -u 5 1 来查找哪个进程导致 iowait 这么高 (间隔 5 秒后输出一组数据) image.png可以发现,还是 stress 进程导致的。

场景三:大量进程的场景

  1. 使用stress -c 8 --timeout 600,这次模拟的是 8 个进程(于系统只有 2 个 CPU,系统的 CPU 处于严重过载状态) image.png
  2. 在第二个终端运行 mpstat -P ALL 5 1 查看 CPU 使用率的变化情况 (-P ALL 表示监控所有 CPU,后面数字 5 表示间隔 5 秒后输出一组数据) image.png
  3. 运行pidstat -u 5 1 来看一下进程的情况 (间隔 5 秒后输出一组数据) image.png > 可以看出,8 个进程在争抢 2 个 CPU, 每个进程等待 CPU 的时间(也就是代码块中的%wait列)高达 75%。 这些超出 CPU 计算能力的进程,最终导致 CPU 过载。

总结

平均负载提供了一个快速查看系统整体性能的手段,反映了整体的负载情况。但只看平均负载本身,我们并不能直接发现到底是哪里出现了瓶颈。

在理解平均负载时,要注意: - 平均负载高有可能是 CPU 密集型进程导致的; - 平均负载高并不一定代表 CPU 使用率高,还有可能是 I/O 更繁忙了; - 当发现负载高的时候,可以使用 mpstatpidstat 等工具,辅助分析负载的来源。

其他

pidstat没有展示%wait

升级systat到 11.5.5版本及以上 ```shell

通过git下载源码

git clone git://github.com/sysstat/sysstat

系统配置sysstat

cd sysstat/ ./configure

编译和安装

make & make install

验证是否安装成功

mpstat -V

解决 /usr/bin/mpstat: No such file or directory

cp pidstat /usr/bin/ cp mpstat /usr/bin/ ```

关注+点赞👍收藏❤️不迷路

文章每周持续更新,可以微信搜索「 十分钟学编程 」第一时间阅读和催更,如果这个文章写得还不错,觉得有点东西的话
各位的支持和认可,就是我创作的最大动力,我们下篇文章见!

<think>我们参考用户的问题和之前的回答,用户想要在Android或Linux系统中测试CPU负载。根据引用[1]和引用[2]的内容,我们可以使用uptime、mpstat、pidstat等工具来监控CPU负载和使用率。同时,引用[5]提到了Linux和Android系统的任务调度算法,这也CPU负载测试相关。 下面将介绍在Android或Linux系统中测试CPU负载的方法: ### 一、使用命令行工具监控CPU负载 #### 1. **uptime命令**:查看系统平均负载 该命令显示系统运行时间、当前登录用户以及过去1分钟、5分钟、15分钟的平均负载(Load Average)。平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程,通常建议每个心的负载不超过0.7(如4CPU平均负载不超过2.8)[^1]。 ```bash adb shell uptime # 输出示例: 14:20:30 up 3 days, 8:30, 0 users, load average: 0.52, 0.58, 0.59 ``` - 三个值分别代表1分钟、5分钟、15分钟的平均负载。 - 如果1分钟负载远高于15分钟负载,说明负载在增加。 #### 2. **mpstat命令**:查看每个CPU心的使用率 mpstat(Multiprocessor Statistics)可以实时监控每个CPU心的使用情况,包括用户态、内态、空闲等状态[^2]。 ```bash adb shell mpstat -P ALL 1 # 每1秒报告一次所有CPU心的状态 ``` 输出示例: ``` 05:30:00 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 05:30:01 PM all 8.20 0.00 1.03 0.00 0.00 0.00 0.00 0.00 0.00 90.77 05:30:01 PM 0 10.20 0.00 1.02 0.00 0.00 0.00 0.00 0.00 0.00 88.78 05:30:01 PM 1 6.19 0.00 1.03 0.00 0.00 0.00 0.00 0.00 0.00 92.78 ``` - `%usr`:用户态CPU时间占比 - `%sys`:内CPU时间占比 - `%iowait`:等待I/O的CPU时间占比 - `%idle`:空闲CPU时间占比 #### 3. **pidstat命令**:按进程查看CPU使用情况 当平均负载升高时,我们需要定位是哪个进程导致的。pidstat可以实时查看每个进程的CPU使用情况[^1]。 ```bash adb shell pidstat -u 1 5 # 每1秒报告一次,共5次 ``` 输出示例: ``` 05:35:00 PM UID PID %usr %system %guest %CPU CPU Command 05:35:01 PM 0 10 0.00 0.97 0.00 0.97 0 ksoftirqd/0 05:35:01 PM 1000 1234 6.19 0.00 0.00 6.19 1 com.example.app ``` #### 4. **top命令**:实时监控进程和系统负载 top命令可以实时显示系统资源使用情况,包括CPU负载、内存使用以及各个进程的资源占用。 ```bash adb shell top -d 1 -n 5 # 每1秒刷新一次,共5次 ``` ### 二、在Android设备上测试CPU负载的注意事项 1. **ADB调试**:需要开启Android设备的USB调试模式,并通过ADB连接设备。 2. **工具可用性**:部分Android系统可能没有mpstat、pidstat等命令,可以通过BusyBox安装这些工具(需要root权限)[^4]。 3. **多负载均衡**:Android系统采用BFS调度算法(引用[5]),在多设备上可能出现负载不均衡的情况。可以使用`taskset`命令将进程绑定到特定心,以测试负载均衡情况: ```bash adb shell taskset -c 0,1 stress --cpu 2 # 将stress进程绑定到心0和1 ``` ### 三、测试步骤示例 假设我们要测试一个Android设备在CPU压力下的负载情况: 1. **监控初始状态**: ```bash adb shell uptime adb shell mpstat -P ALL 1 > baseline_mpstat.log & ``` 2. **生成CPU负载**: 使用`stress`或`stress-ng`工具(需安装): ```bash adb shell stress --cpu 4 --timeout 60 # 启动4个worker,持续60秒 ``` 3. **监控负载变化**: ```bash adb shell pidstat -u 1 60 > pidstat.log # 监控进程 adb shell top -d 1 -b -n 60 > top.log # 记录top输出 ``` 4. **分析结果**: - 对比`baseline_mpstat.log`和压力下的`mpstat`输出,观察各心使用率变化。 - 使用`pidstat.log`找出消耗CPU最多的进程。 - 通过`top.log`查看整体负载趋势。 ### 四、图形化工具(可选) 对于不熟悉命令行的用户,可以使用Android Studio的Profiler工具: 1. 连接设备并运行应用 2. 打开Android Profiler 3. 选择CPU分析器,可实时查看CPU使用率、线程状态和跟踪记录 --- ### 总结 在Android/Linux系统中测试CPU负载的主要方法包括: - `uptime`查看平均负载 - `mpstat`分析各心使用率 - `pidstat`定位高负载进程 - `top`实时监控系统状态 通过压力工具(如stress)模拟负载,结合上述监控工具即可完成测试。注意Android设备的工具限制,必要时使用BusyBox补充命令集[^4]。 §§相关问题§§ 1. 如何解释Linux/Android系统中的平均负载(Load Average)? 2. 在没有root权限的Android设备上如何进行CPU负载测试? 3. 如何分析mpstat输出中的iowait(%wa)过高问题? 4. 有哪些工具可以在Android上模拟CPU、内存等系统资源压力? [^1]: 首先,平均负载案例。我们先用 uptime, 查看了系统平均负载;而在平均负载升高后,又用 mpstat 和 pidstat ,分别观察了每个 CPU 和每个进程 CPU 的使用情况,进而找出了导致平均负载升高的进程,也就是我们的压测工具 stress。 [^2]: CPU状态,包括idle空闲状态、执行user用户代码的用户态、执行system系统代码的内态、执行低优先级用户代码的友好用户态、iowait状态、irq硬中断状态、softirq软中断状态。 CPU使用率即CPU各个状态占总时间的百分比,常用来作为衡量系统性能的一个指标。理想情况下,系统CPU使用率不超过70%。 [^4]: 该用例测试以上几个常用的文件系统调用,涉及用例约2K条左右,基于Android系统的测试,需要将相关测试用例的shell脚本稍微做下适配,可以基于busybox下的相关命令。 [^5]: android cpu调度算法,多系统任务调度算法研究。多硬件技术的发展为操作系统的设计带来了新的挑战。作为影响操作系统性能的关键因素,任务调度算法的设计优化成为多系统的重要研究课题之一。</think>## 在Android/Linux系统中测试CPU负载的完整指南 ### 一、心测试工具方法 #### 1. 系统平均负载测试 (`uptime`) ```bash adb shell uptime # 输出示例:14:20:30 up 3 days, 8:30, 0 users, load average: 0.52, 0.58, 0.59 ``` - **三个值**:分别代表1分钟、5分钟、15分钟的平均负载 - **负载解读**:当平均负载接近CPU时,系统开始过载(如4CPU负载>4表示过载)[^1] #### 2. 实时CPU状态监控 (`mpstat`) ```bash adb shell mpstat -P ALL 1 # 每1秒报告所有CPU心状态 ``` 输出示例: ``` 05:30:00 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 05:30:01 PM all 8.20 0.00 1.03 0.00 0.00 0.00 0.00 0.00 0.00 90.77 05:30:01 PM 0 10.20 0.00 1.02 0.00 0.00 0.00 0.00 0.00 0.00 88.78 ``` - **关键指标**: - `%usr`:用户态CPU时间占比 - `%sys`:内CPU时间占比 - `%iowait`:等待I/O的CPU时间占比(>5%需优化)[^2] - `%idle`:空闲CPU时间占比 #### 3. 进程级CPU分析 (`pidstat`) ```bash adb shell pidstat -u 1 5 # 每1秒报告,共5次 ``` 输出示例: ``` 05:35:00 PM UID PID %usr %system %guest %CPU CPU Command 05:35:01 PM 0 10 0.00 0.97 0.00 0.97 0 ksoftirqd/0 05:35:01 PM 1000 1234 6.19 0.00 0.00 6.19 1 com.example.app ``` - **定位高负载进程**:找出消耗CPU最多的应用/服务[^1] #### 4. 实时系统监控 (`top`) ```bash adb shell top -d 1 -n 5 # 每1秒刷新,共5次 ``` - **关键字段**: - `%CPU`:进程CPU占用率 - `PR`:进程优先级(值越小优先级越高) - `VIRT`:虚拟内存使用量 ### 二、Android专用测试方法 #### 1. ADB系统性能监控 ```bash # CPU使用率监控 adb shell dumpsys cpuinfo | grep TOTAL # 内存压力测试 adb shell am start -n com.example.stresstest/.MainActivity ``` #### 2. Android Profiler(Android Studio) 1. 连接设备并运行应用 2. 打开Android Profiler → CPU分析器 3. 查看: - 实时CPU使用率曲线 - 线程状态分布 - 方法跟踪记录 #### 3. 多负载均衡测试 ```bash # 查看CPU adb shell cat /proc/cpuinfo | grep processor | wc -l # 绑定进程到特定心 adb shell taskset -c 0,1 <command> # 绑定到心0和1 ``` - **调度算法分析**:Android使用BFS调度器,需关注多负载均衡[^5] ### 三、负载生成压力测试 #### 1. 使用stress工具生成CPU负载 ```bash # 安装stress-ng (需root或预装) adb push stress-ng /data/local/tmp # 生成4线程CPU负载 (持续60秒) adb shell /data/local/tmp/stress-ng --cpu 4 --timeout 60 ``` #### 2. 自定义负载控制脚本 ```bash #!/system/bin/sh # 精确控制CPU使用率 (示例: 60%) cycle_time=100 # 毫秒 busy_time=$((60 * cycle_time / 100)) while true; do # 忙碌周期 start=$(date +%s%3N) while [ $(($(date +%s%3N) - start)) -lt $busy_time ]; do : # 空循环消耗CPU done # 空闲周期 sleep $(awk "BEGIN {print ($cycle_time - $busy_time)/1000}") done ``` ### 四、结果分析优化建议 #### 1. 负载健康指标 | 指标 | 健康范围 | 警告阈值 | 临界阈值 | |------|----------|----------|----------| | 平均负载 | < CPU | > ×1.5 | > ×2 | | %user+%sys | < 70% | 70%-85% | >85% | | %iowait | < 5% | 5%-10% | >10% | | 上下文切换 | < 5000/秒 | 5000-10000/秒 | >10000/秒 | #### 2. 常见问题排查 1. **高iowait问题**: - 使用`adb shell iostat -dx 2`检查磁盘I/O - 优化SQLite查询或文件读写操作[^2] 2. **多负载不均衡**: - 使用`adb shell cat /proc/interrupts`检查中断分布 - 调整进程亲和性:`taskset -p <mask> <pid>` 3. **调度延迟问题**: - 跟踪调度事件:`adb shell trace-cmd record -e sched_switch` - 分析调度延迟:`trace-cmd report | less` ### 五、进阶工具推荐 1. **perf**:Linux性能分析器 ```bash adb shell perf record -g -p <pid> -- sleep 30 adb shell perf report ``` 2. **systrace**:Android系统级跟踪 ```bash python systrace.py -t 10 sched freq idle am wm ``` 3. **eBPF工具**:动态内追踪 ```bash adb shell /data/local/tmp/bpftrace -e 'tracepoint:sched:sched_switch { @[kstack] = count(); }' ``` > **关键建议**:测试时长应≥10分钟,取后5分钟平均值;温度监控需持续进行,防止设备过热(>70℃需暂停测试)[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

蒋老湿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值