Android性能分析工具之 —— vmstat

vmstat —— Android measurement

Posted by Vivi Cao on August 14, 2016

vmstat使用


vmstat: virtual Memory Statistics (虚拟内存统计), 是一个很有价值的监控工具,可以实时提供memory、block IO和CPU状态信息。它用来对系统整体的情况进行统计,通过它可以快速了解当前系统运行情况及可能碰到的问题。

Android中vmstat的提取命令如下:

  • Example: vmstat 1 3
    • 1 -> 每1秒重新测量并反馈数据,1代表的是每一秒。
    • 3 -> 反馈3次后关闭程序,3代表反馈的次数,3次。
  • Report:
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  0      0  57080  50060 1429612   0    0   712    67    0  237 10  6 83  0
 0  0      0  57064  50060 1429612   0    0     0     0    0  181  0  0 100 0
 0  0      0  57064  50060 1429612   0    0     0     0    0  100  0  0 100 0

report中第一行的数据是手机上次开机到现在的平均值,剩下的所有行代表的是当前状态值.


单项解析

Procs

r: (running) 运行队列中的进程数,即多少个进程分配到了CPU. 这个值超过了CPU的个数就会出现CPU的瓶颈了.

b: (blocked) 被阻塞的进程数(in uninterruptible sleep),通常是进程等待IO操作.

Memory (kB)

swpd: 使用的虚拟内存大小. 如果大于0,表示手机物理内存不足. 如果不是应用内存泄漏的原因,就是当前后台执行的activity, jobs过多了.

free: 系统可用的物理内存数. 如上例中手机还有57M左右的空闲内存.

buff: 系统用作buffers的内存数,用来存储比如目录中内容,权限等的缓存. 上例中使用了50M左右.

cache: 系统用作cache的内存数,用来记忆打开的文件或者图片等,起缓冲作用. 相当于把空闲的一部分内存拿来做cache提高程序执行性能. 上例使用了1.4G左右.

Swap

si: 每秒从磁盘(disk)读入的内存大小(/s). 如果这个值大于0,表示物理内存不足或者内存泄漏,需要查找耗内存的进程。

so: 每秒从内存写入磁盘的内存大小(/s). 同上

IO

bi: 块设备接收的块数量,单位blocks/s. 指手机上所有的Rom和其他块设备,代表IO操作,如果进行大量拷贝动作等该值会非0.

bo: 块设备每秒发送的块数量,单位blocks/s. 例如读取文件,bo就会大于0. 一般bi和bo都要接近0,否则表示IO过于频繁,需要调整。

System

in: (interrupts) 在delay的时间内(默认为1秒)系统产生的终端数,包括时间中断.如果该值较大,需要检查哪个模块是否产生了太多中断,查看方法是观察/proc/interrupts下的中断增长情况。

cs: (context switch) 在delay的时间内(默认为1秒)系统上下文切换的次数. 例如进程切换,要进行上下文切换;线程的切换,要进行上下文切;,代码执行进入内核空间,上下文也要切换。这个值越小越好,太大了要考虑降低线程或者进程数目。因为上下文切换很耗资源,次数过多表示CPU大部分浪费在上下文切换而不是执行程序内容,CPU没有充分利用。Android中考虑是否是系统中断过多,若中断没有问题,需要确认调度策略及时钟中断是否有影响。

CPU

us: 用户(non-kernel code)占用的CPU时间比 %。结合top命令查看哪个进程执行太多,如果占比高(95%以上),需要检查该进程代码中是否陷入闭环。

sy: 系统时间(kernel code)占用的CPU时间比 %, 如果太高,表示系统调用时间过长,例如IO操作频繁.

id: Idle 闲置CPU时间比 %, 一般来说,id + us + sy = 100%

wa: (IO wait) CPU等待IO完成的时间占比 %. 该值若大,对系统的流程性冲击大。如果出现流畅性问题还需要结合其他参数一起分析。

Tips:

  1. 如果r值经常大于1或者更大,并且id常小于40%,说明CPU负荷过重。
  2. 当手机正常使用时,有较小的free是好事,说明cache使用更有效率, 除非此时有不断的写入swap,disk (so, bo). cache值如果偏大,且bi值小,表示data存于cache中不必块读取,使用效率高。Android中当内存不够时会由oom killer来根据优先级顺序将不太重要的后台cached进程杀掉来释放这段内存。当该值忽大忽小时,需要注意是否有cache被清理出去,cache对系统的性能和流畅性影响很大。
  3. 如果swapd值大于0,而si,so都显示0,此时系统性能还是正常的。
  4. 如果free值很少或者接近0并不代表内存不够用,此时如果si,so也很少(大多时候是0)系统性能不会受到影响的。
  5. 如果bi,bo出现较大值,而si,so却维持在0值,表示系统IO负载过重,要查看IO处理或者Rom是否有异常。
  6. 如果bi,bo和si,so同时为较大数值,表示内存swapping频繁,RAM太小。
  7. bi或bo出现0的次数太过频繁,除非是系统处于闲置状态,否则需要查看I/O方面是否出现问题
  8. 进程kswapd是负责确保闲置内存可被释放,每次启动扫描会尝试释放32个pages,并且一直在重复这个程序直到限制内存数值高于pages_high(核心参数)


Case Examples


测试机: Android M系统,8核, 3G内存

CPU的核数,最大进程数

~$ adb shell cat /proc/cpuinfo

==> CPU architecture: 8

内存信息

~$ adb shell cat /proc/meminfo

==> MemTotal:        2935484 kB

Standard State:

空闲内存72M,cache占用1.37G, CPU dile几乎100%

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  0      0  72516  64824 1374296   0    0   294    33    0   95  1  1 98  0
 0  0      0  72392  64824 1374296   0    0     0     0    0  112  0  0 100 0
 1  0      0  72392  64824 1374300   0    0     0     0    0  201  0  0 100 0
 0  0      0  72392  64824 1374300   0    0     0     0    0  129  0  0 100 0
 0  0      0  72392  64824 1374300   0    0     0    64    0  342  0  0 100 0

CPU User Load Example

该例中同时打开多个手机应用。可以看出CPU intensive,r值达到27,us值保持在50%以上:

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
23  2      0  36676   5100 459584    0    0   395    40    0  116  2  1 96  0
27  5      0  34748   5416 455932    0    0 139440 7168    1 12811 62 38 0  0
20  3      0  33908   5520 464280    0    0 240032 5744    1 16300 70 30 0  0
 7  8      0  34988   5360 454076    0    0 111696 9136    1 12001 68 30 1  1
 2 10      0  35744   4472 453188    0    0 86608 33520    0 8314  0  0 100 0

High IO Read Load Example

~$ adb shell dd if=/sdcard/Movies/back.mp4 of=/dev/null  count=5000000

使用dd命令读取sdcard下的back.mp4(大文件)并写到/dev/null下。观察bi值(increased IO read load):

 procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 2  1      0  34932  17456 374784    0    0   581    60    0  148  3  2 95  0
 2  0      0  36240  11924 379944    0    0 497664  160    0 10685 21 20 49 10
 2  2      0  33876  11924 383456    0    0 502272    0    0 10569 21 19 49 10
 2  0      0  37168  11924 380212    0    0 80336     0    0 2396 16  5 77  2
 1  0      0  37092  11924 380624    0    0  1024     0    0  764 15  2 83  0

类似情景的有重负荷下应用扫描sdcard:

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 8  0      0  36244  20136 360800    0    0   517    51    0  142  4  2 94  0
19  4      0  36744  19904 354672    0    0 18032   400    0 8509  0  0 100 0
14  0      0  38004  19912 357240    0    0 21696   704    0 7252  0  0 100 0
 5  0      0  61652  19476 356324    0    0  7472   320    0 7538  0  0  0  0
 7  0      0  64084  20292 356680    0    0  5792   256    0 11859 0  0 100 0

High IO Write Load Example

~$ adb shell dd if=/dev/zero of=/sdcard/test count=50000

对比之前的例子,dd从/dev/zero中读取数据并写入/sdcard/test中。观察bo值(increased IO write load):

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 3  4      0  42168  35824 1540488   0    0  1273   238    0  294  5  3 93  0
 1  2      0  39448  35824 1543336   0    0     0 81616    0 1342  2  4 64 31
 2  1      0  34564  35812 1547864   0    0 14560 239440   0 3514  6 14 68 12
 3  2      0  34392  35144 1552408   0    0     0 61584    0  905  4 24 60 12
 2  2      0  36624  32908 1555352   0    0     0 50192    0  892  1 26 57 16

CPU Waiting for IO Example

此例是低内存重负荷下在sdcard上复制文件,CPU等待IO读取数据,观察wa值(waiting for IO):

  procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
  3  2      0  35380   6388 478248    0    0   523    53    0  144  3  2 95  0
  1  3      0  35564   6128 498504    0    0 154800   48    0 6432 22 17 37 25
  7  3      0  35308   6312 498076    0    0 31984   448    0 3678 22  9 43 27
  1  4      0  36536   6632 493988    0    0 23280 99136    0 3391 19  7 47 27
  1  3      0  37368   7140 486268    0    0 45632    16    0 4607 19  7 53 20

CPU System Load Example

waiting…

RAM Bottleneck (swapping) Example

waiting…


Contrastive Examples

  • 网络下载
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  0      0  75688  55400 1237092   0    0   292    33    0   99  1  1 98  0
 0  0      0  75532  55408 1237132   0    0     0   288    0 1062  0  0 100 0
 0  0      0  74312  55408 1237224   0    0     0     0    0 1096  1  1 98  0
 0  0      0  74188  55408 1237192   0    0     0     0    0  570  0  1 99  0
 0  0      0  73496  55408 1237144   0    0     0     0    0 1183  1  4 94  0
  • 网络下载 (高负荷)
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 5  0      0  44460   4036 391580    0    0   449    43    0  126  2  1 96  0
 2  0      0  40992   4044 392272    0    0  4112   224    0 3388 18  4 77  0
 2  0      0  36820   3824 389824    0    0 74368   896    1 8387 24 14 59  3
 2  0      0  34276   3832 389792    0    0     0  2832    0 3797 20  5 75  0
 5  0      0  36264   3768 385788    0    0 15856     0    0 3744 20  7 73  0
  • 播放在线视频
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  0      0  57016  56396 1313228   0    0   293    33    0   96  2  1 97  0
 0  0      0  55328  56452 1313592   0    0     0  2128    1 7316 11  8 80  0
 0  0      0  54956  56452 1313836   0    0     0     0    0 5293  4  4 93  0
 0  0      0  54988  56452 1313996   0    0     0     0    0 5133  3  3 94  0
 3  0      0  53216  56468 1314096   0    0     0  3632    0 6303  6  5 88  1
  • 播放在线视频 (高负荷)
 procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 5  0      0 149800   4664 407056    0    0   443    42    0  124  2  1 96  0
 1  0      0 144304   4696 411820    0    0 21552   720    0 5729 26  8 63  2
 4  0      0 158324   4696 411900    0    0     0     0    0 3330 18  4 78  0
 3  0      0 163568   4704 412036    0    0     0   272    1 2892 16  5 79  0
 3  0      0 188256   4712 412048    0    0     0    48    0 2808 18  3 78  0
  • 播放本地视频 (高负荷)
 procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 4  0      0  60684   4564 444688    0    0   636    62    0  155  3  2 95  0
 4  0      0  60292   4564 444760    0    0     0  4032    1 8606 35 10 55  0
 8  0      0  35252   4572 446272    0    0  7056   272    0 9923 38 22 41  0
 3  0      0  33776   4572 446552    0    0  1008     0    0 8063 28  8 64  0
 2  0      0  37472   4580 445044    0    0    16   208    0 7543 25  7 69  0
  • 玩神庙逃亡 (高负荷)
  procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
  3  0      0  49556   4896 382592    0    0   641    62    0  157  3  2 95  0
  1  0      0  51628   4896 382620    0    0     0     0    0 6480 27  7 66  0
  6  2      0  34836   5100 397580    0    0 75184   304    0 9519  0  0  0  0
  5  0      0  34904   4896 395656    0    0 72912   688    0 9172  0  0 100 0
  5  0      0  37900   4896 391528    0    0  1616   896    0 5282 30 10 59  0
  • 应用加载 (高负荷)
  procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
   r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
   3  0      0  40692   3396 358808    0    0   426    41    0  120  2  1 97  0
   1  0      0  38700   3396 359100    0    0     0     0    0 3792 22  6 72  0
   1  0      0  38320   3396 359060    0    0     0     0    1 3806 21  7 72  0
   2  0      0  36172   3404 359228    0    0     0   208    1 4951 21  5 74  0
   3  0      0  35920   3404 359328    0    0     0  1440    0 4287 20  5 75  0

备注:

高负荷时手机发烫,查看手机电池温度高为39.5度:

 ~$ adb shell cat /sys/class/power_supply/battery/temp