Android Performance
分析 Android Performance 问题
CPU 问题
查看 cpu 频率:
cat /sys/devices/system/cpu/cpux/cpufreq/scaling_curfreq
TOP 信息
查看 TOP 消息,查看后台是否干净,查看 idle 是否异常
system 1%(1),IOW 10%(2)
(1) 该值高就需要查看进程,看 CPU 占比
adb shell top -d 1 -m 10 -t
*"-d 1": 每一秒刷一次
*"-m 10": 输出前10个
*"-t": 输出线程如果需要查看进程的 call stack,使用如下命令
adb shell touch /data/anr/traces.txt
adb shell kill -3 [PID](进程号)(2) 如果 IOW 偏高,先关闭怀疑的进程,如果还是高,需要查看是否系统 IO 占用高
Systrace
Bugreport
Vmstat 工具
vmstat: virtual Memory Statistics (虚拟内存统计), 是一个很有价值的监控工具,可以实时提供 memory、block IO 和 CPU 状态信息。它用来对系统整体的情况进行统计,通过它可以快速了解当前系统运行情况及可能碰到的问题。
使用方式:
|
|
Pocs
-r:(running) 运行队列中的进程数,这个值超过 CPU 的个数就会出现瓶颈
-b:(blocked) 被阻塞的进程数,通常是进程等待 IO 操作
Memory
- swpd 虚拟内存大小,大于 0,表示物理内存不足,可能出现泄漏,或者后台 activity 或者 jobs 太多
- free 可用物理内存
- buff 系统用作 buffers 的内存
- cache 系统用作 cache 的内存数,可以理解为缓存
Swap
- si 每秒从磁盘读入内存的大小,如果大于 0,表示物理内存不足或者内存泄漏
- so 每秒从内存写入磁盘的大小
IO
- bi 块设备接收的块数量 代表 io 操作,如 copy
- bo 块设备每秒发送的块数量,如读取文件
一般 bi bo 都要接近 0,否则 io 过于频繁
System
in(interrupts) 在 delay(默认为 1s) 时间内系统产生的中断数,值过大,可以通过
cat /proc/interrupts
查看哪个模块中断产生过多cs(context switch) 在 delay 时间内,系统上下文切换次数,这个值越小越好,太大证明
CPU 大部分时间浪费在上下文切换去了,一般需要查看中断和线程调度
CPU
- us 用户占用的 CPU 时间比,占比高,需要查看进程是否有闭环代码
- sy 系统时间占用 CPU 时间比,太高,表示系统调用时间长,需要关心 IO 等操作
- id idle 闲置 CPU 时间比
- wa IO wait CPU 等待 IO 完成的时间占比,值太大,对系统负担大
Tips
- 如果 r 值经常大于 1 或者更大,并且 id 常小于 40%,说明 CPU 负荷过重。
- 当手机正常使用时,有较小的 free 是好事,说明 cache 使用更有效率,除非此时有不断的写入 swap,disk (so, bo). cache 值如果偏大,且 bi 值小,表示 data 存于 cache 中不必块读取,使用效率高。Android 中当内存不够时会由 oom killer 来根据优先级顺序将不太重要的后台 cached 进程杀掉来释放这段内存。当该值忽大忽小时,需要注意是否有 cache 被清理出去,cache 对系统的性能和流畅性影响很大。
- 如果 swapd 值大于 0,而 si,so 都显示 0,此时系统性能还是正常的。
- 如果 free 值很少或者接近 0 并不代表内存不够用,此时如果 si,so 也很少(大多时候是 0)系统性能不会受到影响的。
- 如果 bi,bo 出现较大值,而 si,so 却维持在 0 值,表示系统 IO 负载过重,要查看 IO 处理或者 Rom 是否有异常。
- 如果 bi,bo 和 si,so 同时为较大数值,表示内存 swapping 频繁,RAM 太小。
- bi 或 bo 出现 0 的次数太过频繁,除非是系统处于闲置状态,否则需要查看 I/O 方面是否出现问题
- 进程 kswapd 是负责确保闲置内存可被释放,每次启动扫描会尝试释放 32 个 pages,并且一直在重复这个程序直到限制内存数值高于 pages_high(核心参数)