android - Android : Interpreting the results of this command 中的 dumpsys cpuinfo

标签 android performance adb ddms dumpsys

我正在查看以下命令“adb shell dumpsys cpuinfo”的输出,我想知道这些报告的值是否是之前时间的平均值?

    D:\Android_Dev\Android_sdk\platform-tools>adb shell dumpsys cpuinfo
Load: 4.03 / 3.43 / 2.44
CPU usage from 23770ms to 16630ms ago:
  58% 1844/logd: 58% user + 0% kernel / faults: 3 minor
  50% 3895/com.google.android.wearable.app:ui: 41% user + 9.3% kernel / faults: 1798 minor
  26% 1864/adbd: 2.8% user + 23% kernel / faults: 1243 minor
  22% 4880/logcat: 7.8% user + 15% kernel
  9.7% 7834/kworker/0:2: 0% user + 9.7% kernel
  4.9% 2198/system_server: 2.6% user + 2.2% kernel / faults: 76 minor

我的问题如下:

  1. 故障在这里代表什么?
  2. 这些百分比值代表什么,因为它们加起来不等于 100?
  3. 这些百分比值是否是各个进程的平均值,例如 logd 的 58%?
  4. CPU 使用率从 23770ms 到 16630ms 之前:这是什么意思?这是否意味着这些值是最后 23 到 16 秒的平均值?

最佳答案

adb shell dumpsys cpuinfo

显示来自/proc/stat 和/proc/(pid)/stat 的信息

1.what does faults represent here ?

页面错误。
“minor”表示小错误。

来自 ProcessCpuTracker.java

collectStats(...) {
  ...
  final long[] procStats = mProcessStatsData;
  if (!Process.readProcFile(st.statFile.toString(),
  PROCESS_STATS_FORMAT, null, procStats, null)) {
  continue;
  }
  ...
  final long minfaults = procStats[PROCESS_STAT_MINOR_FAULTS];
  final long majfaults = procStats[PROCESS_STAT_MAJOR_FAULTS];
}

private static final int[] PROCESS_STATS_FORMAT = new int[] {
  ...
  PROC_SPACE_TERM|PROC_OUT_LONG,                  // 10: minor faults
  ...
  PROC_SPACE_TERM|PROC_OUT_LONG,                  // 12: major faults
  ...
};

它们是/proc/(pid)/stat data[9] 和 data[11]。


2.they don't add up to 100

http://blog.scoutapp.com/articles/2009/07/31/understanding-load-averages
(来自 interpreting dumpsys cpuinfo 的链接页面)

对于多处理器系统,总和可以超过100%。


3.are these percentage values averages of the respective processes

来自 ProcessCpuTracker.java

printProcessCPU(...) {
  ...
  printRatio(pw, user+system+iowait+irq+softIrq, totalTime);
  ...
}

打印第二个参数(user+...)/第三个参数(totalTime)。


4.CPU usage from 23770ms to 16630ms ago

时间以 ProcessCpuTracker 缓存的 stat 数据更新的时间为准。

来自 ProcessCpuTracker.java

update() {
  final long nowUptime = SystemClock.uptimeMillis();
  ...
  mLastSampleTime = mCurrentSampleTime;
  mCurrentSampleTime = nowUptime;
  ...
}

[相关资源]
https://android.googlesource.com/platform/frameworks/native/+/master/cmds/dumpsys/dumpsys.cpp
main() => 服务->转储()

https://github.com/android/platform_frameworks_base/blob/master/services/core/java/com/android/server/am/ActivityManagerService.java
CpuBinder.dump() 被调用
mProcessCpuThread 更新统计缓存。 (调用了 updateCpuStatsNow())

https://github.com/android/platform_frameworks_base/blob/master/core/java/com/android/internal/os/ProcessCpuTracker.java
printCurrentLoad() 打印 CPU 负载
printCurrentState() 打印每个进程的统计信息

关于android - Android : Interpreting the results of this command 中的 dumpsys cpuinfo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40186347/

相关文章:

java - 如何使用循环在android中将文本设置为textViews

android - 在 Android 上获取首选/默认应用

javascript - Geolocation Cordova 的位置未定义

android - 如何在 android 中使用 Jsonarray 从多个 url 检索响应

optimization - 如何为向量中的每个元素计算另一个向量中较小的元素的分数?

windows - 如何说服 Visual Studio 通过 TCP/IP 使用 ADB for android dev

performance - Google apps 脚本 - 加速 getActiveDocument()?

performance - 在Elasticsearch中是否在过滤器上下文之前评估查询上下文?如何确定评估顺序?

android - 如何使用 adb.exe 搜索文件?

android - 如何在build.gradle中查询所有连接的设备?