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

    xiaoxiao2021-03-25  73

    author:lidx,1028659927.

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

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

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

         近几年智能手机发展迅速,手机产业拼杀残酷一片火海,有从默默无闻做到了行业巨头奇迹,有为发烧而生却让人抢购的发烧的烦恼,有为了头条不惜爆炸的神经,也有不为所动专心自身的淡定,红蓝之争、芯片之争、性价比之争等等一切皆凸显了手机行业在中国的红火。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的最大工作频率(多个核心修改cpu0cpu1进行查询):

    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%的使用率。

    2dumpsys命令 

    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

    user@thundersoft:~/桌面$ 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) 可以看到系统对于内存的消耗,包括各个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:

    890247264177245817827522097429160529.77%21409611295181807482796463154518234.95%21199519827743410447513158106026.53%23427911234481825101165427155428826.32%2298771905295159433507661107530.93%890314264204845817828222098429199829.52%21411711295851807482836463154528537.37%21200919834943410448513258115830.61%23429611235181825101175427155438321.65%2298921905965159434507661117228.28%

    绘制的cpu使用率图。

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

    绘制的工作时四个核的频率,一遍CPU2,cpu3频率高于0,1.

    简单了介绍了负载的入门工具,其实还有很多更加专业的工具可以使用:

    高通开发者 点击此链接很多可以免费使用的高通工具。

    Qualcomm Snapdragon Profiler的界面如下:

    1、高通Trepn Profile

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

    但在VR设备上无法运行。

    2、高通Snapdragon Profiler

    官方说明:Snapdragon Profiler旨在帮助开发人员优化Snapdragon处理器驱动设备中的应用程序。通过三种数据捕获模式显示应用程序的CPUGPUDSP、内存、功率、网络连接和设备运行时的发热数据,从多个不同的角度展现设备性能。还可提供类似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也是比较经典的组合等还有好多工具。

    转载请注明原文地址: https://ju.6miu.com/read-33878.html

    最新回复(0)