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:
- 如果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(核心参数)
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