Android IO性能测试

关于IO流程

参考Linux–IO介绍

一般情况下,read,write系统调用并不直接访问磁盘。这个调用仅仅是在用户空间和内核空间的buffer之间传递目标数据。举个例子,下面的write系统调用仅仅是把3个字节从用户空间拷贝到内核空间的buffer之后就直接返回了

write(fd,”abc”,3);

在以后的某个时间点上,内核把装着“abc”三个字节的buffer写入(flush)磁盘。如果另外的进程在这个过程中想要读刚才被打开写的那个文件怎么办?答案是:内核会从刚才的buffer提供要读取的数据,而不是从磁盘读。

关于写数据

参考Linux–IO介绍

写100MB的数据

场景1:1次写1个字节,总共write 100M次;

场景2:1次写1K个字节,总共write 100K次;

场景3:1次写4K个字节,总共write 25K次;

场景4:1次写16k个字节,总共write大约不到7K次。

以上4种写入方式,内核写磁盘的次数基本相同,因为写磁盘的单位是block,而不是字节。现在的系统默认的block都是4k。

第1种性能非常差,user time和system time执行时间都很长,既然写盘次数都差不多,那他慢在哪儿呢?答案是系统调用的次数太多

第2种,user time和system time都显著降低,不过system time降低幅度更大

第2种以后,性能差别就不是很高了,第3种和第4种性能几乎一样

总而言之,得出的结论是以block的尺寸为write(fd, sizeof(buf),buf)的调用单位就可以了,再大对性能也没什么太大的提高。

logcat -f filename 调用android_log_printLogLine(system/core/liblog/logprint.c)单行默认写入大小为512,超过则按实际的单行大小写入,没有等到满4k写入,此处可以做一定优化,先缓存要写的数据,满4k或者接近4k再统一写入,但此处需要结合文件大小限制做处理,不一定写入同一个文件,逻辑复杂度有一定增加。 从以下测试看,当前IO消耗并不是很大,没有强烈要求优化,可不做优化。

iotop工具

Android9以上自带了iotop, 代码目录:system/extras/iotop。该版本比Linux版本简略了很多:

:/ iotop -h                                                                                                                                                                     
Usage: iotop [-h] [-P] [-d <delay>] [-n <cycles>] [-s <column>]
   -a  Show byte count instead of rate
   -d  Set the delay between refreshes in seconds.
   -h  Display this help screen.
   -m  Set the number of processes or threads to show
   -n  Set the number of refreshes before exiting.
   -P  Show processes instead of the default threads.
   -s  Set the column to sort by:
       pid, read, write, total, io, swap, sched, mem or delay.

不加-n默认1s抓一次,可以按以下命令抓取:

iotop -P -d 1 -m 50 > data/iotop.txt

结果分析:
read:读取速率
write:写入速率
total: 操作速率

IO: IO等待占比
swap: swap分区操作使用占比 备注:Swap分区,即交换区,系统在物理内存(这里应该是运行内存)不够时,与Swap进行交换。
sched:Scheduler使用占比 备注:每个系统调用(write read)在返回的时候,会有一个从内核态向用户态切换的间隙,每次在这个间隙里面,系统要干两个事情—-递送信号和进程调度。系统调用太多的话,递送信号和进程调度引起的计算量是不容忽视的。
mem:内存使用占比
total:以上资源总使用占比

:/ cat data/iotop.txt
                            --- IO (KiB/s) ---  ----------- delayed on ----------
   PID Command            read  write  total  IO     swap   sched  mem    total
 10461 kworker/u12:0         0     24     24  0.00%  0.00%  0.35%  0.00%  0.35%
  2308 panyportal:auth       0     20     20  0.00%  0.00%  0.00%  0.00%  0.00%
 12891 iotop                 0      8      8  0.00%  0.00%  0.11%  0.00%  0.11%
  1079 logcat                0      4      4  0.00%  0.00%  0.00%  0.00%  0.00%
     1 init                  0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
     2 kthreadd              0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
     3 ksoftirqd/0           0      0      0  0.00%  0.00%  0.04%  0.00%  0.04%
     5 kworker/0:0H          0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
     7 rcu_preempt           0      0      0  0.00%  0.00%  0.17%  0.00%  0.17%
     8 rcu_sched             0      0      0  0.00%  0.00%  0.01%  0.00%  0.01%
     9 rcu_bh                0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    10 migration/0           0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    11 watchdog/0            0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    12 watchdog/1            0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    13 migration/1           0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    14 ksoftirqd/1           0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    16 kworker/1:0H          0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    17 watchdog/2            0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    18 migration/2           0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    19 ksoftirqd/2           0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    21 kworker/2:0H          0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    22 watchdog/3            0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    23 migration/3           0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    24 ksoftirqd/3           0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    26 kworker/3:0H          0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    27 watchdog/4            0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    28 migration/4           0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    29 ksoftirqd/4           0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    31 kworker/4:0H          0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    32 watchdog/5            0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    33 migration/5           0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    34 ksoftirqd/5           0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    36 kworker/5:0H          0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    37 kdevtmpfs             0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    38 netns                 0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    39 perf                  0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    40 kconsole              0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    41 khungtaskd            0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    42 writeback             0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    43 ksmd                  0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    44 crypto                0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    45 bioset                0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    46 kblockd               0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    48 ata_sff               0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    49 devfreq_wq            0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    50 cfg80211              0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    51 cfinteractive         0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    69 kswapd0               0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    70 vmstat                0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
    71 fsnotify_mark         0      0      0  0.00%  0.00%  0.00%  0.00%  0.00%
       TOTAL                 0     56     56

busybox iostat 工具

busybox iostat 也是linux iostat的简略版本,不支持-x参数,但基本能看出磁盘整体使用情况。

tps: 每秒钟发送到的I/O请求数.
kB_read/s: 每秒读取的block数.
kB_wrtn/s: 每秒写入的block数.
kB_read: 读入的block总数.
kB_wrtn: 写入的block总数.

:/ busybox iostat  -k 1 60                                                                                                                                                      
Linux 4.4.167 (UC-P10-TD-I-C074AD24D038) 	02/22/22 	_aarch64_	(6 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           2.32    0.72    1.83    0.02    0.00   95.12

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
zram0             0.00         0.01         0.00        148          4
mmcblk1           4.79        79.99       184.37     952763    2195960
mmcblk1p5         0.00         0.00         0.00         17          0
mmcblk1p11        0.00         0.01         0.00        128          0
mmcblk1p16        0.00         0.01         0.01        132         64
mmcblk1p17        0.26         0.18       127.01       2178    1512832
mmcblk1p18        0.00         0.02         0.99        297      11764
mmcblk1p20        0.00         0.17         0.00       2048          0
mmcblk1p21        0.02         0.19         1.13       2308      13504
mmcblk1p22        0.84        43.74        24.21     520993     288368
mmcblk1p24        0.10         6.80         0.00      80997         20
mmcblk1p26        0.07         2.68         0.00      31929         36
mmcblk1p28        3.34        26.16        31.01     311632     369372
dm-0              5.34        26.15        31.01     311504     369372
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值