android系统负载如何获取1-简单利用系统命令

最近在调查系统负载问题,希望能从中获取一些系统卡顿的知识,暂时把简单获取系统负载的命令记录下来,以备以后查看。

本文不做具体负载分析,只为记录命令,等后续系统负载分析有了结果会给大家呈现分析的过程和结果。

具体负载的形象说明可以看阮一峰老师这篇文章:点击打开链接

 近几年智能手机发展迅速,手机产业拼杀残酷一片火海,有从默默无闻做到了行业巨头奇迹,有为发烧而生却让人抢购的发烧的烦恼,有为了头条不惜爆炸的神经,也有不为所动专心自身的淡定,红蓝之争、芯片之争、性价比之争等等一切皆凸显了手机行业在中国的红火。pc发展了20多年,主流内存不过6-8g,手机短短几年就已飙升到了6g甚至更高,甚至步步高双兄弟虽常被人们冠以低配高价之名,但也仅仅是相对的,其配置还是可以的(这里不论价格)。

  以上的这些都说明了配置的重要性,厂商之间无穷无尽的发布会,其中必不考少的的一项就是说明自身配置,今天要讨论的负载问题正是跟这个配置相关。如果你的手机反应很慢,可能大家首先会做的就是去清一清内存,在Linux系统中,我们一般使用uptime命令查看(w命令和top命令也行)。

我当前电脑的负载: 14:53:06 up 19 days, 1:19, 10 users, load average: 4.68, 4.50, 4.45

“load average”,里面有三个数字,可以从中判断系统负荷是大还是小。它们的意思分别是1分钟、5分钟、15分钟内系统的平均负荷。
当CPU完全空闲的时候,平均负荷为0;当CPU工作量饱和的时候,平均负荷为1。所以可以看到我的系统负载还是可以的,虽然被我压榨的要罢工了。

下面开始介绍利用命令获取系统负载:

1 linux系统自带命令获取系统负载

Linux自身提供了丰富的命令,可以获取运行系统中进程的信息。

(1) linux命令获取系统或进程信息

获取系统内存使用情况

adb shell cat /proc/meminfo

1)adb shell dumpsys meminfo (查看系统总的内存使用情况):

命令会列出系统总内存(Total RAM),空闲的内存(Free RAM),已被使用的内存(Used RAM).

还包括android系统中所有进程的内存占用情况(自动排序)。

2)adb shell dumpsys meminfo com.android.launcher(查询单个进程的内存你使用情况)

结果无法获取进程中函数的内存消耗,只能获取堆,栈等内存信息。

命令结果可以显示,总的cpu消耗(包括用户态和内核态,DS-5中出现的kernel应该也是内核态cpu消耗的意思),系统中各个进程的cpu消耗率(例如:开启的应用进程,surfaceFlinger进程,systemui进程等)。注意:此命令显示的cpu消耗是占总的cpu消耗(如果设备具有八个核心,cpu使用率=各个核的cpu使用率之和/8)。

获取系统cpu使用情况

获取cpu的最大工作频率(多个核心修改cpu0,cpu1进行查询):

adb shell cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq

获取cpu的工作频率

adb shell cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq

获取cpu使用率情况

cat /proc/stat

结果包括总的cpu使用率和每个核的cpu使用率,但结果无法直接得到cpu每个核心的使用率,需要通过公式进行计算,查看非常不方便。

还可以设置cpu的工作模式,一般包括interactive conservative ondemand userspace powersave performance 这几种工作模式,

cpu是相当重要的系统负载的标志,当我们查看系统的cpu使用率时,还要查看cpu的频率,否则只查看cpu的使用率将毫无意思。

使用命令:

adb shell cat /proc/stat //cpu的使用率,也可以利用top命令,但无法查看单个核的使用率

cpu无论4核,8核,还是10核同时工作的一般只有4个核心。

adb shell dumpsys cpuinfo //cpu系统架构,核心数等

adb shell cat /sys/devices/system/cpu/cpu0(0,1,2,3)/cpufreq/scaling_cur_freq 每个核的频率

adb shell cat /sys/devices/system/cpu/cpu(0,1,2,3)/cpufreq/scaling_max_freq 每个核最大的频率

获取系统GPU使用情况

gpu使用率

adb shell cat /sys/class/kgsl/kgsl-3d0/gpubusy

结果包含两列数字,已用第一列和第二列做除法可以得到gpu的使用率

现在更多的程序利用opengles,vulkan等gpu接口绘制,他们直接申请gpu存储,节省了cpu消耗,使绘制更快。

命令:
adb shell cat /sys/class/kgsl/kgsl-3d0/gpubusy

利用下面的脚本可以方便的查看gpu使用率:

/ gpu_busy.pl 
#!/usr/bin/perl -w
while(1)
{
 
    &busy;
#    print "\n";
    sleep 1 ;
}
    sub busy
    {
 
        $gpu3d = `adb shell cat /sys/class/kgsl/kgsl-3d0/gpubusy`;
        $pct = 0.0;
        if( $gpu3d =~ m/\s*(\d+)\s+(\d+)/)
        {
 
            if( $1 > 0 && $2 > 0 )
            {
               $pct = $1 / $2 * 100;
            }
            printf("3D GPU Busy: %5.2f\n", $pct);
        }
}

top命令:

top命令在linux系统中,可以查看多核系统中,每个核的cpu使用率,top命令之后按数字1就可以看到每个核的cpu使用率,还可以查看进程中线程的占用cpu率,但在android系统中这些功能都被裁剪掉了,top显示的结果cpu占用率有时会超出100%,这是因为top统计的是cpu的总的使用率,已一个核为100%进行结果的显示,如果有四个核,每个核使用率30%,则显示的结果为12%的使用率。

(2)dumpsys命令

adb shell //进入手机shell

dumpsys | grep “DUMP OF SERVICE” //列举当前手机所有支持的dumpsys命令

常用dumpsys指令:

dumpsys package <package_name> //查看指定包名的信息

dumpsys activity <package_name> //查看指定包名的activity信息

dumpsys alarm //查看Alarm信息

dumpsys audio //查看声音信息

dumpsys battery //查看电池信息

dumpsys cpuinfo //查看CPU信息

dumpsys meminfo <package_name>//查看指定包名的内存信息

dumpsys netstats//查看网络统计信息

dumpsys diskstats //查看空间free状态

dumpsys jobscheduler //查看任务计划

dumpsys power//查看功耗信息

dumpsys wifi//查看wifi信息

实例:
1、内存(memory)

命令:adb shell dumpsys meminfo

<span style="font-size:14px;">[email protected]:~/桌面$ adb shell dumpsys meminfo
Applications Memory Usage (kB):
Uptime: 283179 Realtime: 283179
各个进程的消耗
Total PSS by process:
   117001 kB: com.thundersoft.tsvr.launcher (pid 1736 / activities)
    71890 kB: system (pid 1226)
    71651 kB: com.android.systemui (pid 1465)
    34942 kB: com.android.launcher (pid 1539 / activities)
    27984 kB: surfaceflinger (pid 511)
    19530 kB: com.qiyi.video.pad (pid 1750)
    18706 kB: zygote (pid 931)
    17580 kB: mm-qcamera-daemon (pid 952)
    16123 kB: zygote64 (pid 930)
    15786 kB: android.process.media (pid 1481)
    12568 kB: com.qiyi.video.pad:downloader (pid 1926)
    11927 kB: com.android.inputmethod.latin (pid 1853)
    10962 kB: mediaserver (pid 914)
    10703 kB: com.qiyi.video.pad:bdservice_v1 (pid 1825)
    10367 kB: com.gale.sanguokill.hd:pushservice (pid 2038)
    10228 kB: com.gale.sanguokill.hd (pid 1954)
    10018 kB: .iqiyipushserviceGlobal (pid 1941)
     7882 kB: com.taobao.apad:notify (pid 1913)
     6864 kB: com.quicinc.cne.CNEService (pid 1512)
     6363 kB: cnd (pid 922)
     6273 kB: com.thunderst.vts (pid 1563)
     5292 kB: mm-pp-dpps (pid 525)
     5126 kB: com.qti.diagservices (pid 1791)
     5114 kB: com.qualcomm.display (pid 1839)
     4992 kB: com.qualcomm.qti.seemp.service:seemp_service (pid 1809)
     4951 kB: com.android.externalstorage (pid 1499)
     4947 kB: com.thundersoft.service (pid 1525)
     4872 kB: qvop-daemon (pid 954)
     4871 kB: qseeproxydaemon (pid 951)
     4857 kB: .iqiyipushserviceGlobal (pid 1982)
     4805 kB: com.qualcomm.qti.biometrics.voiceprint.service (pid 1871)
     2726 kB: sensors.qcom (pid 554)
     2499 kB: logd (pid 417)
     2329 kB: thermal-engine (pid 926)
     2249 kB: audiod (pid 957)
     2117 kB: wpa_supplicant (pid 1724)
     1775 kB: vold (pid 423)
     1573 kB: qvrservice (pid 955)
     1481 kB: sdcard (pid 1478)
     1407 kB: netd (pid 510)
     1319 kB: /init (pid 1)
     1234 kB: cnss_diag (pid 924)
     1189 kB: iop (pid 1675)
     1107 kB: keystore (pid 918)
     1099 kB: qcom-system-daemon (pid 919)
      963 kB: pm-service (pid 520)
      957 kB: mdtpd (pid 960)
      920 kB: tssensorservice (pid 512)
      895 kB: gatekeeperd (pid 932)
      870 kB: ueventd (pid 400)
      853 kB: time_daemon (pid 956)
      844 kB: fingerprintd (pid 953)
      820 kB: perfd (pid 1686)
      808 kB: tloc_daemon (pid 959)
      801 kB: sh (pid 958)
      790 kB: qseecomd (pid 574)
      784 kB: cnss-daemon (pid 947)
      765 kB: adsprpcd (pid 927)
      691 kB: tftp_server (pid 923)
      651 kB: servicemanager (pid 509)
      640 kB: pm-proxy (pid 527)
      628 kB: installd (pid 915)
      604 kB: dumpsys (pid 3427)
      603 kB: rmt_storage (pid 515)
      599 kB: perfprofd (pid 946)
      592 kB: healthd (pid 507)
      583 kB: debuggerd (pid 912)
      571 kB: debuggerd64 (pid 913)
      570 kB: qseecomd (pid 522)
      569 kB: hvdcp_opti (pid 929)
      556 kB: adbd (pid 528)
      368 kB: lmkd (pid 508)
本地服务的消耗
Total PSS by OOM adjustment:
   161009 kB: Native
               27984 kB: surfaceflinger (pid 511)
               18706 kB: zygote (pid 931)
               17580 kB: mm-qcamera-daemon (pid 952)
               16123 kB: zygote64 (pid 930)
               10962 kB: mediaserver (pid 914)
                6363 kB: cnd (pid 922)
                5292 kB: mm-pp-dpps (pid 525)
                4872 kB: qvop-daemon (pid 954)
                4871 kB: qseeproxydaemon (pid 951)
                4857 kB: .iqiyipushserviceGlobal (pid 1982)
                2726 kB: sensors.qcom (pid 554)
                2499 kB: logd (pid 417)
                2329 kB: thermal-engine (pid 926)
                2249 kB: audiod (pid 957)
                2117 kB: wpa_supplicant (pid 1724)
                1775 kB: vold (pid 423)
                1573 kB: qvrservice (pid 955)
                1481 kB: sdcard (pid 1478)
                1407 kB: netd (pid 510)
                1319 kB: /init (pid 1)
                1234 kB: cnss_diag (pid 924)
                1189 kB: iop (pid 1675)
                1107 kB: keystore (pid 918)
                1099 kB: qcom-system-daemon (pid 919)
                 963 kB: pm-service (pid 520)
                 957 kB: mdtpd (pid 960)
                 920 kB: tssensorservice (pid 512)
                 895 kB: gatekeeperd (pid 932)
                 870 kB: ueventd (pid 400)
                 853 kB: time_daemon (pid 956)
                 844 kB: fingerprintd (pid 953)
                 820 kB: perfd (pid 1686)
                 808 kB: tloc_daemon (pid 959)
                 801 kB: sh (pid 958)
                 790 kB: qseecomd (pid 574)
                 784 kB: cnss-daemon (pid 947)
                 765 kB: adsprpcd (pid 927)
                 691 kB: tftp_server (pid 923)
                 651 kB: servicemanager (pid 509)
                 640 kB: pm-proxy (pid 527)
                 628 kB: installd (pid 915)
                 604 kB: dumpsys (pid 3427)
                 603 kB: rmt_storage (pid 515)
                 599 kB: perfprofd (pid 946)
                 592 kB: healthd (pid 507)
                 583 kB: debuggerd (pid 912)
                 571 kB: debuggerd64 (pid 913)
                 570 kB: qseecomd (pid 522)
                 569 kB: hvdcp_opti (pid 929)
                 556 kB: adbd (pid 528)
                 368 kB: lmkd (pid 508)
    71890 kB: System
               71890 kB: system (pid 1226)
    83462 kB: Persistent
               71651 kB: com.android.systemui (pid 1465)
                6864 kB: com.quicinc.cne.CNEService (pid 1512)
                4947 kB: com.thundersoft.service (pid 1525)
   117001 kB: Foreground
              117001 kB: com.thundersoft.tsvr.launcher (pid 1736 / activities)
    11927 kB: Perceptible
               11927 kB: com.android.inputmethod.latin (pid 1853)
    36507 kB: A Services
               15786 kB: android.process.media (pid 1481)
               10703 kB: com.qiyi.video.pad:bdservice_v1 (pid 1825)
               10018 kB: .iqiyipushserviceGlobal (pid 1941)
    34942 kB: Home
               34942 kB: com.android.launcher (pid 1539 / activities)
    47591 kB: B Services
               19530 kB: com.qiyi.video.pad (pid 1750)
               12568 kB: com.qiyi.video.pad:downloader (pid 1926)
               10367 kB: com.gale.sanguokill.hd:pushservice (pid 2038)
                5126 kB: com.qti.diagservices (pid 1791)
    44245 kB: Cached
               10228 kB: com.gale.sanguokill.hd (pid 1954)
                7882 kB: com.taobao.apad:notify (pid 1913)
                6273 kB: com.thunderst.vts (pid 1563)
                5114 kB: com.qualcomm.display (pid 1839)
                4992 kB: com.qualcomm.qti.seemp.service:seemp_service (pid 1809)
                4951 kB: com.android.externalstorage (pid 1499)
                4805 kB: com.qualcomm.qti.biometrics.voiceprint.service (pid 1871)
 
Total PSS by category:
   161373 kB: Native
   126915 kB: .so mmap
   115960 kB: Dalvik
    46441 kB: .oat mmap
    40004 kB: .dex mmap
    36714 kB: Gfx dev
    34016 kB: .art mmap
    15459 kB: Unknown
     9173 kB: Dalvik Other
     8682 kB: Stack
     7661 kB: Other mmap
     4862 kB: .apk mmap
      803 kB: .ttf mmap
      316 kB: Cursor
      167 kB: Other dev
       28 kB: Ashmem
        0 kB: .jar mmap
        0 kB: EGL mtrack
        0 kB: GL mtrack
        0 kB: Other mtrack
 
Total RAM: 3870732 kB (status moderate)
 Free RAM: 2819921 kB (44245 cached pss + 839204 cached kernel + 1936472 free)
 Used RAM: 745817 kB (564329 used pss + 181488 kernel)
 Lost RAM: 304994 kB
     ZRAM: 4 kB physical used for 0 kB in swap (524284 kB total swap)
   Tuning: 256 (large 512), oom 322560 kB, restore limit 107520 kB (high-end-gfx)
</span>

可以看到系统对于内存的消耗,包括各个native服务,各个进程,系统总的RAM。
当然, adb shell cat /proc/meminfo 命令也可以:
MemTotal: 3870732 kB
MemFree: 1935452 kB
MemAvailable: 2877440 kB
Buffers: 12300 kB
Cached: 1030760 kB
SwapCached: 0 kB
Active: 434892 kB
Inactive: 989588 kB
Active(anon): 382960 kB
Inactive(anon): 2880 kB
Active(file): 51932 kB
Inactive(file): 986708 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 524284 kB
SwapFree: 524284 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 381396 kB
Mapped: 203896 kB
Shmem: 4444 kB
Slab: 110932 kB
SReclaimable: 38036 kB
SUnreclaim: 72896 kB
KernelStack: 18688 kB
PageTables: 16604 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 2459648 kB
Committed_AS: 32314312 kB
VmallocTotal: 258998208 kB
VmallocUsed: 162212 kB
VmallocChunk: 258822852 kB

Nexus 6P测试参数:

手机cpu参数

Processor : AArch64 Processor rev 2 (aarch64)

processor : 0

processor : 1

processor : 2

processor : 3

processor : 4

processor : 5

processor : 6

processor : 7

Features : fp asimd evtstrm aes pmull sha1 sha2 crc32

CPU implementer : 0x41

CPU architecture: 8

CPU variant : 0x0

CPU part : 0xd03

CPU revision : 2

Hardware : Qualcomm Technologies, Inc MSM8994

cpu使用率

Linux系统上cpu的使用率可以通过top查看,top命令之后按下1,可以看到每个核使用率。

top - 15:10:03 up 19 days, 1:36, 10 users, load average: 4.75, 4.55, 4.43
Tasks: 241 total, 4 running, 235 sleeping, 0 stopped, 2 zombie
%Cpu0 : 24.4 us, 60.7 sy, 0.0 ni, 14.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 50.3 us, 26.9 sy, 0.0 ni, 22.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 85.3 us, 6.8 sy, 0.0 ni, 7.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 32.4 us, 34.2 sy, 0.0 ni, 33.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 8093860 total, 7077324 used, 1016536 free, 292856 buffers
KiB Swap: 9999356 total, 579860 used, 9419496 free. 2443896 cached Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
16555 user -4 0 34712 8272 716 S 100.0 0.1 16274:37 wineserver
10964 user 20 0 4475436 18964 11120 S 99.5 0.2 334:26.57 java
1339 root 20 0 730884 196176 104692 R 38.9 2.4 2045:56 Xorg
16726 user 20 0 2660508 184 168 S 35.0 0.0 5445:19 winedbg
16592 user 20 0 2667944 540 204 S 32.0 0.0 5532:23 winedbg
2076 user 20 0 1758216 204064 15956 S 11.3 2.5 945:33.00 compiz
17863 user 20 0 2968144 439944 47372 S 3.7 5.4 560:03.04 wps
11667 user 20 0 3017320 577328 100784 S 2.0 7.1 10:59.63 firefox
2526 user 20 0 854392 42496 9600 S 1.7 0.5 10:45.71 gnome-terminal
2386 user 20 0 1249112 190724 30016 S 1.0 2.4 204:12.20 thunderbird
12698 user 20 0 26864 1740 1164 R 0.3 0.0 0:00.01 top
1 root 20 0 33996 2424 928 S 0.0 0.0 0:05.49 init

android 虽然是基于linux内核的,但其shell命令跟linux还是有差别的,我试过之后发现top不存在1,无法查看单个核的使用率

但可以利用adb shell cat /proc/stat 命令通过数据计算cpu的使用率

得到数据如下:

cpu 69042 3505 77872 250084 519 6167 1572 0 0 0 此行数据代表cpu总的使用率

cpu0 13151 233 19113 64289 129 4209 489 0 0 0 此行数据代表了cpu0的使用率

cpu1 13223 220 19671 67386 108 684 370 0 0 0

cpu2 21340 1635 19788 59106 126 653 369 0 0 0

cpu3 21328 1417 19300 59303 156 621 344 0 0 0

cpu使用率计算:

我们发现每行数据有十列数据,后三项可以忽略,前七项数据分别代表的含义如下:

参数 解析(单位:jiffies)
user (69042) 从系统启动开始累计到当前时刻,用户态的CPU时间,不包含 nice值为负进程。
nice (3505) 从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间
system (77872) 从系统启动开始累计到当前时刻,核心时间
idle (250084) 从系统启动开始累计到当前时刻,除IO等待时间以外其它等待时间
iowait (519) 从系统启动开始累计到当前时刻,IO等待时间
irq (6167) 从系统启动开始累计到当前时刻,硬中断时间
softirq (1572) 从系统启动开始累计到当前时刻,软中断时间

因为/proc/stat中的数值都是从系统启动开始累计到当前时刻的积累值,所以需要在不同时间点t1和t2取值进行比较运算,当两个时间点的间隔较短时,就可以把这个计算结果看作是CPU的即时利用率。

CPU的即时利用率的计算公式:

CPU在t1到t2时间段总的使用时间

totaltime= ( user2+ nice2+ system2+ idle2+ iowait2+ irq2+ softirq2) - ( user1+ nice1+ system1+ idle1+ iowait1+ irq1+ softirq1)

CPU在t1到t2时间段空闲使用时间 idel= (idle2 - idle1)

CPU在t1到t2时间段即时利用率 useper= totaltim-idle/ totaltime

下表是计算的结果,最后一行对应使用率,灰色的一行是cpu总的使用率,然后依次是cpu0,1,2,3:
android系统负载如何获取1-简单利用系统命令
android系统负载如何获取1-简单利用系统命令
绘制的cpu使用率图。

我在公司查看的系统的cpu 频率:(四个核,最大值为3301000)

绘制的工作时四个核的频率,一遍CPU2,cpu3频率高于0,1.
android系统负载如何获取1-简单利用系统命令
简单了介绍了负载的入门工具,其实还有很多更加专业的工具可以使用:
android系统负载如何获取1-简单利用系统命令
Qualcomm Snapdragon Profiler的界面如下:
1、高通Trepn Profile

Trepn Profile工具是个apk应用,可以安装到设备中,可以查看cpu总的或其中四个核心的使用率;GPU的频率和使用率,并以图形的形式展示给用户。

但在VR设备上无法运行。

2、高通Snapdragon Profiler
官方说明:Snapdragon Profiler旨在帮助开发人员优化Snapdragon处理器驱动设备中的应用程序。通过三种数据捕获模式显示应用程序的CPU、GPU、DSP、内存、功率、网络连接和设备运行时的发热数据,从多个不同的角度展现设备性能。还可提供类似Systrace功能。

Snapdragon Profiler此工具功能丰富,可以展示丰富的数据,但只能应用在使用高通Snapdragon芯片的设备上,且主要用于优化应用。

3、高通Adreno GPU 分析器
通过 Adren Profiler 可以分析并且提高应用程序的图形和运算性能。

非OpenGL应用无法使用,unity3d应用也无法识别。

4、DS-5
ds-5只使用率其streamLine模块,工具可以对各应用进程和系统服务进程中可以是别的so和函数按cpu使用率排序。使用受限,需要购买。

5、Systrace & traceview
Systrace可帮助开发者收集Android关键子系统(如surfaceflinger、WMS等Framework部分关键模块、服务,View系统等)的运行信息(可以使单个应用进程也可以是整个系统),从而帮助开发者更直观的分析系统瓶颈,改进性能。但Systrace只能给出直观的显示,无法精确到so,函数级别。

 Traceview采集运行时间内该应用所有线程(注意,只能是 Java 线程)的函数执行情况,可以识别的android framework层和应用本身java代码,但只能对具体的应用进程进程查看,无法直接检测系统服务进程(即使能识别此工具也无法查看非java代码函数)。

6、 androidstudio DDMS
DDMS工具集成了Systrace 和traceview,还有内存分析功能,但都只针对应用。

Trepn Profiler 是个简单的apk,但功能强大。

Qualcomm Snapdragon Profiler是更加强大的工具,集成了systarce的功能。

DS-5可以发现耗时最多的函数。

systrace 和traceView也是比较经典的组合等还有好多工具。