赞
踩
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。所以可以看到我的系统负载还是可以的,虽然被我压榨的要罢工了。
下面开始介绍利用命令获取系统负载:
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;">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)
</span>
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:
890247 | 2641772 | 4581 | 78275 | 22097 | 4291605 | 29.77% |
214096 | 1129518 | 1807 | 48279 | 6463 | 1545182 | 34.95% |
211995 | 198277 | 434 | 10447 | 5131 | 581060 | 26.53% |
234279 | 1123448 | 1825 | 10116 | 5427 | 1554288 | 26.32% |
229877 | 190529 | 515 | 9433 | 5076 | 611075 | 30.93% |
890314 | 2642048 | 4581 | 78282 | 22098 | 4291998 | 29.52% |
214117 | 1129585 | 1807 | 48283 | 6463 | 1545285 | 37.37% |
212009 | 198349 | 434 | 10448 | 5132 | 581158 | 30.61% |
234296 | 1123518 | 1825 | 10117 | 5427 | 1554383 | 21.65% |
229892 | 190596 | 515 | 9434 | 5076 | 611172 | 28.28% |
绘制的cpu使用率图。
我在公司查看的系统的cpu 频率:(四个核,最大值为3301000)
绘制的工作时四个核的频率,一遍CPU2,cpu3频率高于0,1.
Qualcomm Snapdragon Profiler的界面如下:
1、高通Trepn Profile
Trepn Profile工具是个apk应用,可以安装到设备中,可以查看cpu总的或其中四个核心的使用率;GPU的频率和使用率,并以图形的形式展示给用户。
但在VR设备上无法运行。
官方说明:Snapdragon Profiler旨在帮助开发人员优化Snapdragon处理器驱动设备中的应用程序。通过三种数据捕获模式显示应用程序的CPU、GPU、DSP、内存、功率、网络连接和设备运行时的发热数据,从多个不同的角度展现设备性能。还可提供类似Systrace功能。
Snapdragon Profiler此工具功能丰富,可以展示丰富的数据,但只能应用在使用高通Snapdragon芯片的设备上,且主要用于优化应用。
通过 Adren Profiler 可以分析并且提高应用程序的图形和运算性能。
非OpenGL应用无法使用,unity3d应用也无法识别。
ds-5只使用率其streamLine模块,工具可以对各应用进程和系统服务进程中可以是别的so和函数按cpu使用率排序。使用受限,需要购买。
Systrace可帮助开发者收集Android关键子系统(如surfaceflinger、WMS等Framework部分关键模块、服务,View系统等)的运行信息(可以使单个应用进程也可以是整个系统),从而帮助开发者更直观的分析系统瓶颈,改进性能。但Systrace只能给出直观的显示,无法精确到so,函数级别。
Traceview采集运行时间内该应用所有线程(注意,只能是 Java 线程)的函数执行情况,可以识别的android framework层和应用本身java代码,但只能对具体的应用进程进程查看,无法直接检测系统服务进程(即使能识别此工具也无法查看非java代码函数)。
DDMS工具集成了Systrace 和traceview,还有内存分析功能,但都只针对应用。
Trepn Profiler 是个简单的apk,但功能强大。
Qualcomm Snapdragon Profiler是更加强大的工具,集成了systarce的功能。
DS-5可以发现耗时最多的函数。
systrace 和traceView也是比较经典的组合等还有好多工具。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。