1.车机原始数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
Load: 14.49 / 8.82 / 7.01
CPU usage from 9057ms to 1851ms ago (2021-08-12 20:22:39.845 to 2021-08-12 20:22:47.051):
79% 792/system_server: 44% user + 35% kernel / faults: 1774 minor
46% 485/surfaceflinger: 24% user + 21% kernel / faults: 1815 minor
20% 1513/com.gxa.service.systemui: 19% user + 0.4% kernel / faults: 22 minor
17% 452/android.hardware.graphics.composer@2.2-service: 10% user + 6.6% kernel
14% 446/android.hardware.broadcastradio@2.0-service.g6: 1.6% user + 13% kernel
4.8% 23782/adbd: 0.2% user + 4.5% kernel / faults: 39003 minor
4.7% 293/logd: 1.1% user + 3.6% kernel / faults: 1 minor
3.8% 1099/com.android.bluetooth: 1.9% user + 1.9% kernel / faults: 141 minor
2.7% 461/android.hardware.usb@1.0-service: 0% user + 2.7% kernel
2.6% 2501/com.iflytek.autofly.avatar: 1.8% user + 0.8% kernel / faults: 16 minor
1.8% 3511/com.gxatek.cockpit.scenesengine: 1.6% user + 0.1% kernel / faults: 15 minor
1.8% 21524/kworker/1:1: 0% user + 1.8% kernel
1.3% 357/vendor.ts.systemlog@1.0-service: 0% user + 1.3% kernel / faults: 1 minor
0.5% 444/android.hardware.bluetooth@1.0-service-qti: 0.5% user + 0% kernel
0.3% 13161/kworker/1:2: 0% user + 0.3% kernel
1.2% 2612/com.iflytek.autofly.dms: 0.2% user + 0.9% kernel / faults: 3 minor
1.1% 24014/logcat: 0.1% user + 0.9% kernel
0.8% 195/spi1: 0% user + 0.8% kernel
0.8% 1347/cds_ol_rx_threa: 0% user + 0.8% kernel
0.8% 32737/kworker/u16:8: 0% user + 0.8% kernel
0.6% 1//init: 0.1% user + 0.5% kernel / faults: 413 minor
0.6% 215/irq/136-8804000: 0% user + 0.6% kernel
0.6% 359/netd: 0.2% user + 0.4% kernel / faults: 14 minor
0.6% 2397/platformservice.Services: 0.4% user + 0.2% kernel / faults: 85 minor
0.6% 32618/com.iflytek.autofly.systemserver: 0.1% user + 0.5% kernel / faults: 274 minor
0.5% 455/android.hardware.memtrack@1.0-service: 0.1% user + 0.4% kernel
0.5% 457/android.hardware.sensors@1.0-service: 0.1% user + 0.4% kernel
0.5% 2594/com.gxa.service.bluetooth: 0.2% user + 0.2% kernel / faults: 90 minor
0.5% 30761/com.android.commands.monkey: 0.2% user + 0.2% kernel / faults: 36 minor
0.5% 30967/kworker/u16:5: 0% user + 0.5% kernel
0.4% 1772/com.android.car: 0.2% user + 0.1% kernel / faults: 48 minor
0.4% 32143/com.gxatek.cockpit.carservice: 0.2% user + 0.1% kernel / faults: 347 minor
0.2% 471/vendor.ts.gnssext@1.0-service: 0.2% user + 0% kernel
0.2% 742/mdnsd: 0.2% user + 0% kernel
0.2% 1225/com.core.system.service: 0.1% user + 0.1% kernel / faults: 91 minor
0.2% 1451/com.gxa.car.power: 0.1% user + 0.1% kernel / faults: 48 minor
0.2% 2782/com.iflytek.autofly.mediax: 0.1% user + 0.1% kernel / faults: 16 minor
0% 8/ksoftirqd/0: 0% user + 0% kernel
0.1% 9/rcu_preempt: 0% user + 0.1% kernel
0.1% 24/ksoftirqd/2: 0% user + 0.1% kernel
0.1% 30/ksoftirqd/3: 0% user + 0.1% kernel
0.1% 305/android.hardware.automotive.vehicle@2.0-service.g6: 0% user + 0.1% kernel
0.1% 309/com.desaysv.vehiclelan.proxy@1.0-service: 0% user + 0.1% kernel
0.1% 349/kworker/u17:1: 0% user + 0.1% kernel
0.1% 353/ais_v4l2_proxy: 0% user + 0.1% kernel
0.1% 447/android.hardware.camera.provider@2.4-service_64: 0% user + 0.1% kernel
0% 451/android.hardware.dsp@1.0-service: 0% user + 0% kernel
0.1% 463/android.hardware.wifi@1.0-service: 0.1% user + 0% kernel / faults: 1 minor
0% 464/vendor.desaysv.hardware.tbox@1.0-service: 0% user + 0% kernel
0.1% 609/cnss-daemon: 0% user + 0.1% kernel
0.1% 724/wlan_logging_th: 0% user + 0.1% kernel
0.1% 1243/com.android.systemui: 0.1% user + 0% kernel / faults: 69 minor
0.1% 1381/com.gxa.service.account: 0.1% user + 0% kernel / faults: 44 minor
0.1% 2567/com.gac.cloud.app: 0.1% user + 0% kernel / faults: 1 minor
0.1% 2643/com.gxa.appservice.platformadapter.adaptermainservice: 0.1% user + 0% kernel / faults: 53 minor
0.1% 3104/com.iflytek.autofly.mediax:remote: 0.1% user + 0% kernel / faults: 1 minor
0.1% 3252/android.ext.services: 0.1% user + 0% kernel / faults: 12 minor
0.1% 3267/android.ext.services: 0.1% user + 0% kernel / faults: 14 minor
0.1% 10320/com.iflytek.autofly.accountcenter: 0.1% user + 0% kernel
0% 18185/kworker/3:3: 0% user + 0% kernel
0.1% 20603/kworker/u16:3: 0% user + 0.1% kernel
0% 30508/kworker/6:0: 0% user + 0% kernel
+0% 1090/sh: 0% user + 0% kernel
+0% 1103/dumpsys: 0% user + 0% kernel
+0% 1153/qti: 0% user + 0% kernel
29% TOTAL: 13% user + 12% kernel + 0% iowait + 2.5% irq + 0.7% softirq
------finish dumpsys cpuinfo------

2.负载参数解读

2.1 参数解读
1
Load: 14.49 / 8.82 / 7.01

此行显示CPU负载的平均值,这三个数字表示逐渐变长的时间段(平均一分钟,五分钟和十五分钟)的平均值,如果数字较小则说明负载在降低,数字越大表示问题或机器过载。由于当前测试车机是八核处理器,我们以单核处理器来说明以上参数。

CPU处理代码相当于车辆过桥一样,单核处理器相当于桥梁,代码相当于车辆。代码在处理器上运行相当于车辆在桥上跑一样。因此,以上数字含义:

  • 0.00表示桥上根本没有流量。实际上,介于0.00和1.00之间意味着没有备份,而到达的汽车将直接开启。
  • 1.00表示桥梁正好处于饱和容量状态。一切都还不错,但如果流量变得更重,事情就会变慢。
  • 超过1.00表示有拥堵。那么,2.00意味着总共有两条车道 - 一条车道的价值在桥上,一条车道值得等待。3.00意味着总共有三条车道 - 桥上有一条车道,两条车道值得等待。

这基本上就是CPU负载。代码(“汽车”)是使用一段CPU时间片(“过桥”)或排队使用CPU的过程。Unix将此称为运行队列长度:当前运行的进程数加上等待(排队)运行的进程数之和。

2.2 理想负载

如果单核处理器一直处于1,那么说明当前处理器一直在满负荷运行,没有任何余量。CPU长时间处于满负荷或者超负荷运行将导致CPU大量发热,或者降低CPU寿命。因此需要一个参考值来衡量当前系统CPU是否健康。经验参考值如下(单核):

  • 阈值大于0.7:如果长时间平均阈值大于0.7,需要在事态进一步恶化之前进行调查。
  • 阈值大于1.0:如果长时间平均阈值大于1.0,需要找到问题并立即修复,否者可能将面临半夜起来调查问题的情况
  • 阈值大于5.0:如果长时间平均值大于5.0,系统一定出现严重异常,紧要任务是立即排除严重故障,否则影响cpu寿命等不可预知的问题。当前系统处于长时间没有响应,或者接近死机了。你不应该让系统达到这个值。
2.3 多核和多处理器

经常有听到有多少个处理器,一个处理器有多少核,让我们谈谈多核与多处理器。出于性能目的,具有单个双核处理器的机器基本上等同于具有两个处理器的机器,每个处理器具有一个核心?是的,这里有许多关于缓存数量,处理器之间的进程切换频率等的细微之处。尽管有这些更精细的点,但为了确定CPU负载值的大小,核心的总数是重要的,无论如何这些核心分布在许多物理处理器上。因此无论多少处理器,我们主要考虑该机器上有多少核!!因此又出现两个经验法则:

  • “核心数=最大负载”经验法则:在多核系统上,您的负载不应超过可用核心数
  • “内核是内核”经验法则:不管核心是如何分布在CPU的无所谓,两个四核==四个双核==八个单核。这些都是用于这些目的的八个核心。
2.4 如何观察这三个参数

上面提到以上三个参数代表:一分钟,五分钟,十五分钟平均值。那么我们如何观察并采取行动呢?

  • 一分钟:如果监控中显示一分钟cpu负载大于核心数,可以暂时不采取行动,可能是因为开机启动,突然有高cpu进程运行等原因。
  • 五分钟:如果监控中显示五分钟cpu负载大于核心数,需要结合需求调查对高负荷进程进行调查
  • 十五分钟:如果监控中显示十五分钟cpu负荷大于核心数,需要评估高负荷进程CPU消耗原因或者CPU硬件瓶颈

获取机器CPU信息指令,每一块信息代表一个核的信息。

1
cat /proc/cpuinfo

3. 单应用参数解读

3.1 时间戳解析
1
2
3
4
5
// frameworks/base/core/java/com/android/internal/os/ProcessCpuTracker.java
CPU usage from 9057ms to 1851ms ago (2021-08-12 20:22:39.845 to 2021-08-12 20:22:47.051):
// 9057ms == mLastSampleTime
// 1851ms == mCurrentSampleTime
// 后面()是系统时间戳,相减也等于上面两个变量相减的时间,记录这段时间cpu上执行过的代码
3.2 单应用解析

Dumpsys cpuinfo计算cpu使用率是基于 SystemClock.uptimeMillis()差值来计算得到的。详细见:《Android CPU使用率:top和dump cpuinfo的不同》

1
2
3
4
5
6
7
79% 792/system_server: 44% user + 35% kernel / faults: 1774 minor
// 79% 代表当前进程CPU使用占比
// 792 进程id,即pid
// system_server 进程名
// 44% 用户空间使用44%
// 35% 内核空间使用35%
// faults: 1774 minor 下面说明
3.3 minor解析
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// frameworks/base/core/java/com/android/internal/os/ProcessCpuTracker.java
private static final int[] PROCESS_STATS_FORMAT = new int[] {
PROC_SPACE_TERM,
PROC_SPACE_TERM|PROC_PARENS,
PROC_SPACE_TERM,
PROC_SPACE_TERM,
PROC_SPACE_TERM,
PROC_SPACE_TERM,
PROC_SPACE_TERM,
PROC_SPACE_TERM,
PROC_SPACE_TERM,
PROC_SPACE_TERM|PROC_OUT_LONG, // 10: minor faults
PROC_SPACE_TERM,
PROC_SPACE_TERM|PROC_OUT_LONG, // 12: major faults
PROC_SPACE_TERM,
PROC_SPACE_TERM|PROC_OUT_LONG, // 14: utime
PROC_SPACE_TERM|PROC_OUT_LONG, // 15: stime
};

public long getCpuTimeForPid(int pid) {
synchronized (mSinglePidStatsData) {
final String statFile = "/proc/" + pid + "/stat";
final long[] statsData = mSinglePidStatsData;
if (Process.readProcFile(statFile, PROCESS_STATS_FORMAT,
null, statsData, null)) {
long time = statsData[PROCESS_STAT_UTIME]
+ statsData[PROCESS_STAT_STIME];
return time * mJiffyMillis;
}
return 0;
}
}

从上面代码可以看出minor代表小错误,通过读取/proc//stat中第10个数值获取的。至于minor是什么,详见《4.Understanding page faults and memory swap-in/outs: when should you worry?

4. 最后

1
2
3
4
5
6
7
29% TOTAL: 13% user + 12% kernel + 0% iowait + 2.5% irq + 0.7% softirq
// 29% 代表总共cpu消耗占比
// 13% 代表用户空间总消耗
// 12% 代表内核空间总消耗
// 0% 代表CPU在I/O请求中消耗等待时间占比
// 2.5% 代表硬中断执行消耗
// 0.7% 代表中断执行消耗

参考文档

1.理解Linux CPU负载和 CPU使用

2.Understanding Linux CPU Load - when should you be worried?

3.dumpsys cpuinfo in Android: Interpreting the results of this command

4.Understanding page faults and memory swap-in/outs: when should you worry?