2

我有一个带有 Android 4.1.2 “root”的三星 Galaxy SIII。我需要测量我用 C/C++ 编写的一些多线程应用程序的 CPU 使用率,但是我需要以每个内核为基础的这些信息。

我知道(由于维基百科,...)Galaxy 有一个带有 4 个 ARM Cortex A9 的 SoC,但是当我这样做时,cat /proc/cpuinfo它没有显示有关可用内核数量的任何信息(在任何 Linux 中都是如此),这是正确的行为?

我在某处读过可以cat /proc/stat用来查看每个核心负载平均值的地方,但是,在我的设备中,此类“文件”的内容仅显示“core0”的信息,再次,这是正确的还是我需要做些什么启用所有核心?

我也尝试过成功topps失败。

EDITED:
----------------- cat /proc/cpuinfo
Processor   : ARMv7 Processor rev 0 (v7l)
processor   : 0
BogoMIPS    : 1592.52

Features    : swp half thumb fastmult vfp edsp neon vfpv3 tls 
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x3
CPU part    : 0xc09
CPU revision    : 0

Chip revision   : 0011
Hardware    : SMDK4x12
Revision    : 000c
Serial      : 11e16f694df1267e


----------------- cat /proc/stat

cpu  89515 1686 23283 464122 3835 2 376 0 0 0
cpu0 74214 457 16736 221609 1111 1 347 0 0 0
intr 1860068 0 0 0 0 0 0 0 0 0 0 .... (removed: a serie of numbers)
ctxt 3138146
btime 1371578546
processes 15904
procs_running 1
procs_blocked 0
softirq 1154788 12 403499 864 4501 12 12 444746 67202 576 233364
4

3 回答 3

4

您可以通过检查热插拔设备来获取有关内核数量的信息,/sys/devices/system/cpu/present并且/sys/devices/system/cpu/possible. 另请参阅热插拔文档

我不确定这对您获得 CPU 使用率有多大帮助。您可以粗略地了解线程使用了多少用户和系统时间adb shell ps -x -t,例如:

USER     PID   PPID  VSIZE  RSS     WCHAN    PC         NAME
system    19598 19574 955672 57324 ffffffff 4012d9b8 S system_server (u:2186, s:1521)
system    19602 19598 955672 57324 c007f840 4012db84 S GC (u:79, s:6)

这表示 system_server 的主线程使用了 2186 个用户时间滴答,而 GC 线程使用了 79 个滴答。

如果您可以检测您的应用程序,则可以使用 POSIXclock_gettime()调用CLOCK_THREAD_CPUTIME_ID来测量给定线程使用的 CPU 时间量。(Dalvik VM 在为 traceview 生成结果时使用它。)

然而,这都是每个线程的。获取每个核心的使用信息要困难得多,尤其是在 Android 上:

  • 热插拔机制可以在测试期间添加或移除核心。
  • 内核可以单独调整每个内核的 CPU 频率,因此在不同的内核上做 X 量的工作可能需要不同的时间。
  • 线程可以在内核之间迁移(默认情况下没有内核亲和性)。
于 2013-06-19T00:17:57.650 回答
0

您可以通过读取文件来检查核心是否在线/离线

/sys/devices/system/cpu/CPUx/online(x 是核心数,在三星 S3 中:0,1,2,3)

如果为“0”,则内核处于离线状态,如果为“1”,则内核处于在线状态。现在,您可以使用 /proc/stat 来计算 CPU 使用率,但对于三星 S3,它只会显示在您读取 /proc/stat 时处于活动状态的内核。现在,要计算所有内核的 CPU 使用率,您必须强制所有内核联机。您可以使用Play 商店提供的System Tuner 应用程序:https: //play.google.com/store/apps/details? id=ccc71.pmw&hl= en 强制所有内核在线。安装应用程序,然后通过( CPU -> Boot settings -> Force all CPUs online -> On boot Completed )使内核在线,现在您可以重新启动设备并且所有内核都在线。现在读取/proc/stat并计算所有内核的 CPU 使用率。 http://www.linuxhowtos.org/System/procstat.htm 可以提供帮助。

我注意到负载分布在所有活动核心之间(必须是一些系统进程),我正在通过 Wifi 运行 Skype,并且没有强制所有核心在线它使用 2 个核心:核心 0 和核心 1 分别为 30% 和 25% . 在强制所有核心联机后,我再次测量了相同用例(Skype over wifi)的 CPU 使用率,我注意到负载分布在所有活动核心之间(核心 1:26%,核心 2:9%,核心 3:11% ,核心 4:10%)。

于 2013-10-04T13:44:55.257 回答
0

它应该包括不同的核心(显示 Nexus 7):

$ adb shell cat /proc/cpuinfo
Processor   : ARMv7 Processor rev 9 (v7l)
processor   : 0
BogoMIPS    : 1993.93

processor   : 1
BogoMIPS    : 1993.93

processor   : 2
BogoMIPS    : 1993.93

processor   : 3
BogoMIPS    : 1993.93

和统计:

$ adb shell cat /proc/stat
cpu  1623573 112801 907626 32541158 125987 68 5952 0 0 0
cpu0 804181 45734 569092 7373416 43990 49 4990 0 0 0
cpu1 332438 26759 142892 8311267 31256 9 574 0 0 0
cpu2 332889 25551 130711 8319093 30900 7 218 0 0 0
cpu3 154065 14757 64931 8537382 19841 3 170 0 0 0
于 2013-06-18T20:20:04.063 回答