1.简介
最近,通过智能手机访问互联网的数量超过了通过台式PC访问的数量[2]. 这意味着智能手机不再是办公辅助工具,而是日常生活中必不可少的设备。值得注意的是,截至2012年,Android平台的市场份额已达到全球智能手机操作系统的60%左右[2]. 这一事实表明,提高基于Android的智能手机的性能并非微不足道,而是一项有意义的努力。 基姆等最近的研究表明,存储I/O是控制智能手机整体系统性能的关键因素之一[三]. 生成准确的工作负载以正确测量和分析基于Android的智能手机的I/O性能有很大价值。 Android I/O堆栈由DBMS、文件系统、I/O守护进程和I/O调度程序组成。Android平台使用SQLite[4],外景4[5],百万立方厘米和CFQ调度程序[6]分别作为DBMS、文件系统、I/O守护进程和I/O调度程序。Android应用程序使用SQLite以持久方式维护信息。Android的默认DBMS SQLite在Android平台中生成90%的整个写操作[7,8]. Jeong(郑)等揭示了Android I/O行为效率低下,这是由EXT4和SQLite之间的不协调交互造成的,称为日志日志[8]. 通过适当的优化,他们将SQLite数据库性能提高了300%。Android中I/O工作负载的一些代表性特征如下:(I)4KB随机写入,然后是fsync()以及(ii)频繁创建和删除小型(小于12 KB)短寿命文件。 在基于Android的智能手机中,这些应用程序通常被称为“应用程序”,它们生成独特的I/O请求。现有的I/O工作负载生成器和跟踪捕获工具不是为了生成或捕获Android应用程序的这种独特I/O工作负载而设计的。本文介绍了Android存储性能分析工具,安卓步,专门为描述和分析基于Android的设备中I/O子系统的行为而定制。AndroStep由工作负载生成器(Mobibench)、工作负载分析器(MOST:移动存储分析器)和工作负载回放器(Mobigen)组成。
本文的其余部分组织如下:第2节解释了现有的工作负载生成工具,并介绍了Android I/O工作负载的分析。我们在中介绍了Android存储性能分析工具AndroStep第3节.第4节显示了AndroStep的实验结果。第5节论文的结论。 2.问题评估
2.1. 基于Android设备的I/O特性
基于Android的设备的I/O特性[7]与服务器的不同[9]或桌面[10,11]. 为了描述Android I/O堆栈的I/O行为,我们需要正确的工具来(I)正确捕获I/O行为的各种属性;(ii)生成表示Android I/O子系统的基本行为的合成工作负载;和(iii)回放I/O跟踪,以比较各种Android设备中I/O子系统的性能。本节研究现有工具是否能够捕获Android I/O特性并复制它们。本节进一步分析了现有基准的局限性。通过对现有基准测试工具的深入分析,我们不仅将我们的工具与现有工具区分开来,还为实现基于Android平台的基准奠定了基础。 有许多基准测试工具可用于测量文件系统或存储设备的性能;然而,现有的Android设备基准测试工具,如IOzone[12],邦妮++[13],或AndroBench[14],只能测量有限水平的Android资源。 Kim在基于Android平台的工作负载分析方面做了一项引人注目的工作等. [15]. 他们调查了Android应用程序使用的系统服务,并尝试使用I/O带宽使用模型为相应的应用程序分配足够的I/O带宽。他们将应用程序分为三类:突发、时间敏感和普通,并将其I/O管理使用模型应用于媒体应用程序。然而,他们的方法有两个问题。首先,他们选择对知名系统服务的I/O特性建模,而不是分析每个应用程序的I/O行为。其次,他们忽略了在运行应用程序时对各种场景进行建模,也没有考虑应用程序使用多个系统服务。 在为基于Android的设备生成I/O工作负载时,必须考虑四个基本功能。首先,工作负载生成器必须具有要生成的函数写入()然后fsync(),这是Android I/O的一个基本特征。其次,工作负载生成器不仅应该能够测量文件I/O的性能,还应该能够测量SQLite的性能。第三,工作负载生成器必须能够作为Android应用程序以及shell命令运行。最后,在测量文件I/O和DBMS的性能时,该工具必须为文件和数据库提供各种选项。
2.2. 现有工具的问题
IOzone公司[12]和Bonnie++[13]是广泛使用的用于测量文件系统性能的基准测试工具。IOzone和Bonnie++中存在一些问题,使它们不适合Android I/O子系统。 首先,IOzone和Bonnie++不提供更改写入操作同步模式的选项,例如。,fsync()或fdatasync(),这是SQLite执行的最重要的I/O操作之一[8]. SQLite调用fsync()或fdatasync()以使回滚日志更新和数据库更新持久化。IOzone提供以下选项fsync()仅当文件为关闭()或缓冲写入完成。 其次,IOzone和Bonnie++无法测量SQLite的性能,SQLite是Android系统中的默认DBMS。需要使用单独的应用程序来衡量数据库操作(如插入、更新或删除)的性能。我们提供了两个版本的工作负载生成器:作为Android应用程序和作为shell命令。
第三个问题涉及测试方法。在IOzone中,任何类型的基准测试,例如随机写入、随机读取等.之前创建一个给定大小的文件,这不仅耗时,而且大大缩短了NAND闪存的使用寿命。为了保证基准结果的有效性,同一基准经常重复多次。在每次运行中创建文件的开销是多余的,并且可能非常大,尤其是当文件大小很大时,例如几十GB时。
安卓长椅[14]是一个在Android系统中运行的文件基准测试工具。它只提供同步(_S)作为同步选项,不支持多线程基准测试环境。 2.3. Android I/O特征描述要求
传统I/O特性研究在四个维度上定义I/O特性:I/O类型(读取与.write)、I/O大小(KB)、空间位置(顺序与随机)和时间位置(热与.冷)。为了正确理解Android平台的I/O特性,需要在不同的上下文中获得上述四个特性:受文件类型、文件系统块类型(例如元数据、数据或日志)和Android应用程序(例如脸书、Youtube、,等例如,我们需要了解文件系统日志写入的同步写入比例。
然而,据我们所知,现有的捕获和分析工作负载的工具不适合研究Android平台中I/O行为的细节,因为这些工具无法识别文件类型,也无法识别为给定块发出访问权限的应用程序。为了解决这些问题,我们实现了以下两个功能: 2.4. 重播真实世界的痕迹
很难完全相信通过使用合成工作负载获得的性能结果。有许多工作解决了合成工作量的限制[17,18,19,20,21]. 这些工作利用了两种方法来捕获和重放应用程序的系统调用。第一种方法是在用户级别捕获系统调用,并以精确的计时重放它们[17,19,20,21]. 另一种方法是在内核级别(例如VFS层)捕获和重播系统调用[18]. 在用户级捕获和重放系统调用大大减少了在VFS层中实现额外I/O堆栈的编程开销。但是,要在跟踪的确切时间内发出I/O请求,需要非常细致的工作。与用户级方法相比,内核级方法减少了处理开销,但需要额外的层来处理跟踪。它还存在内核依赖性的固有问题。 在实现捕获和重放现实世界工作负载的工具时,应该考虑两个最重要的因素:重放跟踪的时间准确性和正确处理在多线程环境中生成的I/O。在多线程环境中发出的I/O在重放跟踪时需要特别注意锁和调度开销。安德森等. [17]提出利用旁路锁定和预旋方案来提高定时精度。梅斯尼尔等. [19]在重放多线程环境中捕获的跟踪时,解决了资源之间的依赖性问题。为了正确处理真实世界工作负载的性能,在捕获和重放真实世界应用程序的I/O时需要考虑上述因素。 3.AndroStep
Android存储性能分析工具由一个名为Mobibench(移动基准测试)的工作负载生成器组成[22],跟踪捕获工具称为MOST(移动存储分析仪)[23]和Mobigen(移动实际工作负载生成器)[24].图1演示了AndroStep的结构。
图1。AndroStep的结构(Mobibench、MOST和Mobigen)。
图1。AndroStep的结构(Mobibench、MOST和Mobigen)。
3.1. Mobibench公司
Mobibench是一个专门为模拟Android应用程序的I/O特性而设计的基准工具。Mobibench能够测量文件I/O和SQLite操作的性能。Mobibench实现了两个版本,一个是shell应用程序,另一个是Android应用程序(“应用程序”)。这两个版本使用用C语言编写的相同测量引擎。我们为基于应用程序的Mobibench使用JAVA Native Interface(JNI)来调用C中实现的函数。作为一个Android应用程序,基准测试可以使用由电话供应商预先链接的共享SQLite库。要将基准作为shell命令运行,我们需要将SQLite库静态链接到基准程序。智能手机供应商在优化SQLite方面付出了巨大努力。SQLite是根据Apache许可证发布的,供应商没有义务披露修改后的源代码。我们不知道有任何电话供应商披露生产SQLite代码。基于Shell命令的基准只能使用公开可用的库存SQLite。应该注意的是,在大多数智能手机中,基于应用程序的基准测试和基于shell命令的基准测试的性能结果很少一致。
如果使用共享库编译应用程序,则该应用程序将利用智能手机供应商预装的SQLite共享库。由于制造商提供了优化的SQLite库,因此使用该应用程序可以获得SQLite操作的准确优化性能。另一方面,如果应用程序是使用静态库编译的,则应用程序会利用SQLite静态库。由于Mobibench是一个统一的测量引擎,它允许测试和比较不同系统中的性能。
表1说明了三个基准测试的比较:Mobibench、IOzone和AndroBench。Mobibench提供了详细的基准配置选项,如分区选择、线程数量和工作负载特征。Mobibench使用其中一个/数据或/SD卡内部存储和/extSd卡在外部存储卡中。Mobibench允许配置线程数,以提供类似于智能手机的环境,在这种环境中,多个线程同时执行I/O和SQLite操作。 在Mobibench中,可以生成两种类型的工作负载:文件操作和数据库操作。Mobibench指定空间位置(随机与顺序),I/O模式(读取与.write)、文件大小、I/O单元大小和同步模式。有五种同步模式:缓冲、同步、直接、mmap和写入()+fsync().
数据库操作包括插入、更新和删除。这些操作的性能因SQLite的编译和PRAGMA选项而异。PRAGMA命令用于设置SQLite库的操作模式,如SQLite同步和日志模式。SQLite的性能因其日志模式而异。Mobibench可以构建为使用手机制造商提供的库存SQLite库或预链接SQLite库。
Mobibench生成三个性能值:吞吐量、CPU利用率和上下文切换数。在文件I/O测试中,连续操作的吞吐量单位为“KB/s”,随机操作的吞吐量为“IOPS”。SQLite操作的吞吐量单位为“事务/秒”。CPU的利用率区分了ACTIVE、IDLE和IO-WAIT,以了解测试如何利用CPU。Mobibench还统计上下文切换的数量,以测量上下文切换开销。
表1。功能比较。
| 功能 | 移动式长椅 | IOzone公司[12] | 安卓长椅[14] |
---|
工作量 | 顺序写入 | O(运行) | O(运行) | O(运行) |
顺序读取 | O(运行) | O(运行) | O(运行) |
随机读取 | O(运行) | O(运行) | O(运行) |
随机写入 | O(运行) | O(运行) | O(运行) |
写入()+fsync() | O(运行) | X(X) | X(X) |
多线程 | O(运行) | O(运行) | X(X) |
SQLite操作 | O(运行) | X(X) | O(运行) |
输出 | 吞吐量 | O(运行) | O(运行) | O(运行) |
CPU利用率 | O(运行) | O(运行) | X(X) |
上下文切换数 | O(运行) | X(X) | X(X) |
选项 | exe环境 | 外壳/应用程序 | 壳 | 应用程序 |
单独的文件I/O操作 | O(运行) | X(X) | X(X) |
单独的SQLite操作 | O(运行) | X(X) | X(X) |
文件同步模式 | O(运行) | O(运行) | X(X) |
SQLite日志模式 | O(运行) | X(X) | X(X) |
图2。Mobibench应用程序。(一)“测量”选项卡;(b条)设置选项卡。
图2。Mobibench应用程序。(一)“测量”选项卡;(b条)设置选项卡。
图2显示了Mobibench的屏幕快照。Mobibench中有三个选项卡。在“测量”选项卡中,有四个按钮:全部、文件I/O、SQLite和自定义。文件I/O运行顺序或随机读/写操作。SQLite运行插入、更新和删除数据库操作的事务。“All”选项执行文件操作和SQLite操作。“自定义”选项允许用户为工作负载生成定制各种选项。Mobibench显示一个进度条,以显示运行测试的状态,并说明测试完成后的结果。 我们维护Mobibench服务器,该服务器通过互联网收集来自智能手机的Mobibetch运行结果。Mobibench服务器保存提交的性能度量的等级记录;这允许在全球部署的各种Android设备之间进行比较。图3a显示了不同智能手机性能统计数据的屏幕快照。只有在用户同意的情况下,才会将结果提交给服务器。Mobibench还可以通过短信/邮件/脸书/推特与他人分享性能结果。图3b说明了七种实验模式中顺序写入性能的等级。每个移动设备都由设备名称和Android版本标识。如果有相同的设备有不同的Android版本,我们认为它们是不同的设备。
图3。数据采集功能。(一)结果屏幕;(b条)排名。
图3。数据采集功能。(一)结果屏幕;(b条)排名。
3.2. MOST:移动存储分析仪
移动存储分析仪(MOST)包括(i)修改的Linux内核;(ii)用于提取给定块的语义信息的块分析器;和(iii)块跟踪实用程序,黑色痕迹。要获取I/O不同属性之间的相关信息,即,文件类型与.随机性,块类型与同步模式下,我们必须获取全面的I/O属性,即,进程ID,文件系统中块的类型,文件的类型,等.,对于给定的LBA。现代I/O子系统由一组层组成,每个层通过定义良好的窄接口与其他层通信。无法访问其他层中的信息。例如,无法通过检查逻辑块地址来确定给定块是否属于SQLite回滚日志或SQLite数据库表。图4说明了MOST的总体组织结构。 MOST提供三个功能:(i)为给定块查找文件类型;(ii)查找访问给定块的应用程序;以及(iii)为给定块查找文件,即使该文件已被删除。查找给定块的“已删除”文件的功能对于研究Android中的I/O特性至关重要,因为在“删除”日志模式下,SQLite会在事务完成时删除其回滚日志文件。
第一个功能是块到文件映射。MOST可以将磁盘块反向映射到其所属的相应文件。它接受逻辑块号作为输入并生成文件名。MOST使用调试[25]为了反向映射EXT4文件系统中的块,我们开发了一个模块来反向映射FAT32文件系统的块[23]. 第二个特性是块地址到进程ID的映射。MOST可以识别发出给定I/O的原始进程。在Android中,百万立方厘米守护进程管理mmc卡设备驱动程序,并负责发出所有块I/O。对于每个区块访问,黑色痕迹记录每个块的进程ID。什么时候?黑色痕迹在Android I/O堆栈中使用,大型比赛指定百万立方厘米作为所有I/O访问的进程。MOST的目标是识别发出给定I/O的应用程序app。为此,我们修改了Linux内核。我们在内核中的进程ID表中添加了块地址,该表维护给定LBA的进程ID。表中的条目为<LBA,进程ID>。当I/O调度器将I/O请求插入队列时,MOST将<LBA,进程ID>信息插入映射表的条目中。MOST在死后检查表,以检索发出给定LBA访问的原始进程的ID。
MOST允许回顾性LBA映射。在Android中,我们发现许多文件都是短命的;它们由SQLite创建并快速删除。这是由于SQLite的“DELETE”回滚日志模式造成的。虽然它们的寿命很短,但这些文件fsync()NAND存储。当MOST启动给定LBA的分析程序时,块所属的临时文件可能已被删除,无法找到。为了解决这个问题,MOST为Linux内核中的逻辑块地址和inode编号对维护一个表。当I/O调度器将I/O请求插入队列时,MOST将<LBA,inode number>条目插入表中。MOST检查此表以获取给定逻辑块地址的文件信息。为了减小表格大小,MOST仅为临时文件保留<LBA,inode number>条目,即当文件扩展名为.db日志,.db-mjxxxx文件,.bak文件,或.tmp文件.
MOST将逻辑块分为三种类型:元数据,杂志,以及数据。在EXT4文件系统中,元数据块包括超级块、组描述符、数据块位图、索引节点位图和索引节点表。在FAT32文件系统中,元数据块包括引导记录和文件分配表(FAT)。杂志是EXT4文件系统的日志块。数据块是文件数据和目录条目。表2显示了MOST的输出格式。
表2。移动存储分析仪的输出。
1 | I/O完成时间 |
2 | 读写标志 |
三 | 扇区地址和I/O大小 |
4 | 进程ID和进程名称 |
5 | 块类型:元数据,杂志,或数据块 |
6 | 以下情况下的文件名数据块 |
3.3. Mobigen:移动实际工作负载生成器
虽然Mobibench是一个强大的微基准工具,可以生成基于Android的智能手机的I/O工作负载,但其工作负载是合成的为了正确分析给定系统配置的性能行为,必须分析人工生成工作负载下的系统行为。使用人工生成的工作负载的主要困难之一是重放能力。在不同的实验组中再现相同的人类行为并不是一件小事。我们开发了一个名为Mobigen公司来解决这个问题。Mobigen和Mobibench以协作方式工作。Mobigen使用记录系统调用斯特莱斯[26]并将其处理为Mobibench回放。图5显示了这两个工具的操作方式。Mobigen是用红宝石写的[27].
在捕获和重放I/O跟踪方面已经做了很多工作[17,18,19,20,21]. 据我们所知,我们的工作是第一次尝试捕获和回放Android应用程序的I/O跟踪。 Mobigen旨在记录和重播Android应用程序发出的系统调用跟踪。Mobigen由两个组件组成:跟踪收集器和跟踪清洁器。Mobigen使用现有斯特莱斯[26]在获取系统调用跟踪时。微量清洁剂是Mobigen的关键成分;它以Mobibench可以识别和重放的格式创建系统调用跟踪文件。 痕迹清洁器有三个主要作用。首先,它将获取的跟踪转换为关闭系统调用跟踪集。跟踪清洗器扫描系统调用跟踪并识别前面没有打开()系统调用。然后,它插入打开()在写入()系统调用。其次,为了减少Mobigen的处理开销,trace cleaner简化了工作负载的参数,如文件路径、打开标志和删除不必要的参数。通过简化,我们能够以时间准确的方式发布I/O。由于多线程环境,由于另一个系统调用的中断,一个系统呼叫可以分为两个系统调用。跟踪清理器合并这些系统调用,并减少在重播引擎中解析冗余系统调用的时间。
跟踪清洗器不仅分析所获取的系统调用跟踪中的线程信息,还删除特定于平台的系统调用,以提高发出的I/O的计时准确性,并允许在多线程环境中同步I/O。我们使用pthread库重放在多线程环境中生成的I/O。我们设计了一个重播引擎,允许每个线程根据各自的时间发出捕获的跟踪的相应I/O。
4.实验
我们验证了Mobibench对IOzone和AndroBench的性能结果。我们使用MOST分析现实世界中Android应用程序的I/O特性。所有实验均在Galaxy S4上进行[28](三星1.6 GHz八核处理器,2 GB RAM,32 GB eMMC,Android 4.2.2,Linux内核3.4.5)。 4.1. 准确性
Mobibench的主要功能是测量文件操作的性能和数据库操作的性能。应保证性能测量的准确性。我们使用Mobibench、IOzone和AndroBench提取了文件I/O的性能。图6说明了结果。
图6。内部eMMC上的I/O。(一)同步写入;(b条)直接读取。文件大小:512 MB;I/O大小:4 KB[三星Galaxy S4,Android 4.2.2(JB),/数据分区,EXT4]。
图6。内部eMMC上的I/O。(一)同步写入;(b条)直接读取。文件大小:512 MB;I/O大小:4 KB[三星Galaxy S4,Android 4.2.2(JB),/数据分区,EXT4]。
实验中的文件大小和I/O大小分别设置为512 MB和4 KB。Mobibench和IOzone在顺序操作和随机操作上的吞吐量和IOPS分别相似。在Mobibench和IOzone中观察到的随机写入性能差异仅为2%。
Mobibench和IOzone支持各种文件打开模式。我们比较了使用六种不同I/O模式的两个基准测试:缓冲读/写、mmap读/写、同步写和直接写。文件大小和I/O大小分别设置为512 MB和4 KB。我们测量了所有六种模式下顺序和随机I/O的性能。Mobibench的性能结果与IOzone的结果类似(图7). 然而,Mobibench在缓冲和mmap模式下的顺序读取性能比IOzone高20%到160%。因为IOzone呼叫fsync()在跑步结束时。
图7。Mobibench公司与.IOzone,内部eMMC上的I/O。(一)缓冲写入;(b条)缓冲读取;(c(c))mmap写入;(d日)mmap读取;(e(电子))同步写入;((f))直接写入。文件大小:512 MB;I/O大小:4 KB[三星Galaxy S4,Android 4.2.2(JB),/数据分区,EXT4]。
图7。Mobibench公司与.IOzone,内部eMMC上的I/O。(一)缓冲写入;(b条)缓冲读取;(c(c))mmap写入;(d日)mmap读取;(e(电子))同步写入;((f))直接写入。文件大小:512 MB;I/O大小:4 KB[三星Galaxy S4,Android 4.2.2(JB),/数据分区,EXT4]。
接下来,我们使用Mobibench和各种智能手机型号和Android版本测量了SQLite操作的性能。我们使用SQLite的TRUNCATE日志模式来测量性能。显示的结果是10000次跑步的平均值。图8显示了SQLite的插入和更新性能。我们总共测试了12款智能手机。我们在三星Galaxy S3上使用了两个不同版本的Android(果冻豆和冰淇淋三明治)。大多数装有果冻豆的设备表现出比装有冰淇淋三明治的设备更好的性能。性能差异有两个原因。第一个原因是硬件差异。装有果冻豆的智能手机型号配备了更快的CPU和更快的eMMC(智能手机NAND存储)。第二个原因是软件优化。我们在同一个智能手机设备Galaxy S3上加载了果冻豆和冰淇淋三明治,并检查了其性能。装有果冻豆的GS3的性能比装有冰淇淋三明治的GS3(63次/秒)高出约150%与.40次插入/秒)。
图8。SQLite插入并更新来自不同智能手机制造商的12款智能手机的性能。(一)插入;(b条)更新。SQLite日志模式:TURNCATE。GP:LG Optimus Pro,G2:LG擎天柱G2;HO:HTC ONE;GS4:三星Galaxy S4;GS3:三星Galaxy S3;GN2:三星Galaxy Note2;VR3:Pantech Vega R3;Ne7:谷歌Nexus 7;GNe:三星Galaxy Nexus;GS2:三星Galaxy S2;GN:三星Galaxy Note;下标i和j分别表示Android的版本:冰淇淋三明治(4.0.4)和果冻豆(4.2.x,4.3.x)。(/数据分区,EXT4)。
图8。SQLite插入并更新来自不同智能手机制造商的12款智能手机的性能。(一)插入;(b条)更新。SQLite日志模式:TURNCATE。GP:LG Optimus Pro,G2:LG擎天柱G2;HO:HTC ONE;GS4:三星Galaxy S4;GS3:三星Galaxy S3;GN2:三星Galaxy Note2;VR3:Pantech Vega R3;Ne7:谷歌Nexus 7;GNe:三星Galaxy Nexus;GS2:三星Galaxy S2;GN:三星Galaxy Note;下标i和j分别表示Android的版本:冰淇淋三明治(4.0.4)和果冻豆(4.2.x、4.3.x)。(/数据分区,EXT4)。
另一方面,两部装有果冻豆的智能手机Nexus 7(Ne7)和Galaxy Nexus(GNe)分别显示每秒20次插入和每秒10次插入。这些性能数字远低于装有冰淇淋三明治的Galaxy S3(GS3)的性能数字),40次插入/秒。Mobibench分析为我们带来了两个重要发现。首先,Android软件堆栈确实从SQLite性能的角度发展。Android中的每一次升级都是以其新功能、新用户界面/用户体验和与前一次相比的安全增强而闻名,但关于性能优化方面的工作却没有太多报道。我们发现,随着Linux内核和SQLite的不断发展,它们的效率越来越高,SQLite的性能提高了1.5倍。其次,硬件效率低下可以通过软件优化来抵消。同样,智能手机供应商需要使用更好的硬件,例如CPU、DRAM和eMMC,以克服软件效率低下的问题。
4.2. 新功能
Mobibench提供八种不同的同步选项,可以改变线程数。这些功能使我们能够有效地为目标环境定制基准工作负载。我们在文件I/O、SQLite和多线程程度方面进行了三个不同的实验。我们检查了4KB随机写入()然后fsync()我们改变了SQLite的日志和同步模式,并在多线程环境中进行了实验。我们使用了与上一节相同的设备和分区。
图9比较的结果写入()+fsync()分别使用512 MB和4 KB的文件和I/O大小进行同步和直接写入。写入()+fsync()和同步写入在顺序工作负载上显示出类似的性能。相反,使用随机写入工作负载时,textttfsync()导致的I/O数量增加。因此写入()+fsync()大约是同步写入速度的两倍。
图9。
写入()+fsync(),内部eMMC上的I/O。文件大小:512 MB;I/O大小:4 KB[三星Galaxy S4,安卓4.2.2(JB),/数据分区,EXT4]。
图9。
写入()+fsync(),内部eMMC上的I/O。文件大小:512 MB;I/O大小:4 KB[三星Galaxy S4,Android 4.2.2(JB),/数据分区,EXT4]。
图10显示了写入()+fsync()在不同的线程数下。请注意,在实验中,所有文件大小相等的线程的文件大小总和为512 MB。随着线程数量的增加,性能也会提高,因为Galaxy S4配备了八核CPU;然而,当线程数超过16个时,性能会饱和,因为所有H/W资源都被利用了。
图10。
写入()+fsync()内部eMMC上的多线程I/O。文件大小:512 MB;I/O大小:4 KB[三星Galaxy S4,Android 4.2.2(JB),/数据分区,EXT4]。
图10。
写入()+fsync()内部eMMC上的多线程I/O。文件大小:512 MB;I/O大小:4 KB[三星Galaxy S4,Android 4.2.2(JB),/数据分区,EXT4]。
Mobibench提供了更改SQLite日志和同步模式的选项。SQLite中有六种日志模式:DELETE、TRUNCATE、PERSIST、WAL、MEM和OFF。除了MEM和OFF日志模式外,SQLite建议WAL日志模式显示最佳性能[29]. 在MEMORY模式下,SQLite将日志信息存储在系统内存中。OFF模式不记帐日记帐。图11显示了运行10000个插入、更新和删除操作的平均TPS结果。在WAL模式下插入显示的性能大约是其他日志模式的4倍。另一方面,WAL模式下的更新性能略低于其他模式。这一结果背后的主要原因是Galaxy S4中修改了SQLite库。制造商将库修改为在DELETE、TRUNCATE和PERSISTENT模式的更新操作中使用OFF模式。使用strace,我们已经验证了除WAL模式外的所有模式在更新操作中都像OFF模式一样运行。
图11。内部eMMC上具有各种日志模式的SQLite操作。同步模式:FULL;SQLite版本:3.7.5[三星Galaxy S4,Android 4.2.2(JB),/数据分区,EXT4]。
图11。内部eMMC上具有各种日志模式的SQLite操作。同步模式:FULL;SQLite版本:3.7.5[三星Galaxy S4,Android 4.2.2(JB),/数据分区,EXT4]。
另一种对SQLite性能有显著影响的模式是同步模式。SQLite中有三种同步模式:FULL、NORMAL和OFF。SQLite调用的次数fsync()由模式决定。FULL模式调用fsync()以确保所有数据都写入存储设备。NORMAL模式仍在调用fsync()在最关键点,但比FULL模式少。OFF模式不调用fsync()处理事务时。
图12显示了运行插入、更新和删除SQLite操作时三种同步模式的结果。它表明,与所有SQLite操作中的NORMAL或FULL模式相比,使用OFF模式大大加快了事务处理速度。
图12。内部eMMC上具有各种同步模式的SQLite操作。日志模式:DELETE[三星Galaxy S4,Android 4.2.2(JB),/数据分区,EXT4]。
图12。内部eMMC上具有各种同步模式的SQLite操作。日志模式:DELETE[三星Galaxy S4,Android 4.2.2(JB),/数据分区,EXT4]。
Mobibench还支持多线程。图13说明了将线程数增加到32个的效果。当线程数超过12时,我们观察到没有进一步的性能提高。
图13。内部eMMC上具有多线程的SQLite操作。同步模式:FULL;日志模式:DELETE[三星Galaxy S4,Android 4.2.2(JB),/数据分区,EXT4]。
图13。内部eMMC上具有多线程的SQLite操作。同步模式:FULL;日志模式:DELETE[三星Galaxy S4,Android 4.2.2(JB),/数据分区,EXT4]。
4.3. 使用MOST的Android应用程序的I/O特性
在本节中,我们描述了对现实世界中Android应用程序的I/O特性的分析。在我们分析的应用程序中,我们描述了Facebook和Twitter的I/O特性。图14a显示了定向到eMMC分区的I/O的文件类型分布,这是使用MOST分析的。我们将文件分为六类:SQLite数据库(.db文件),SQLite日志(.db日志),可执行文件(.所以,.apk(.apk),以及.dex(索引)),资源(.dat日期和.xml文件)多媒体等。
图14。文件类型和块类型的I/O分布。(一)文件类型;(b条)块类型。每个条顶部的数字分别表示R(读)和W(写)的相应块I/O数。[三星Galaxy S4,Android 4.2.2(JB),EXT4]。
图14。文件类型和块类型的I/O分布。(一)文件类型;(b条)块类型。每个条顶部的数字分别表示R(读)和W(写)的相应块I/O数。[三星Galaxy S4,Android 4.2.2(JB),EXT4]。
我们发现,SQLite及其日志文件负责脸书和推特应用程序中大约90%的写I/O请求。对本地存储的写入I/O请求如此之多的原因是,Facebook和Twitter将时间轴记录缓存在其SQLite表中,这是现代SNS应用程序中提高处理速度和减少用户请求延迟的常见方法[30]. 我们还发现(.dat日期和.xml文件)和可执行文件负责大约60%的读取I/O请求。接下来,我们将文件系统分区中的块分为三种类型:元数据、日志和数据。图14b说明了文件类型分布的结果。元数据和日志分别占所有写I/O的10%和20%。 4.4. 跟踪重播
当您在修改文件系统或块设备层后想要重新检查工作负载的性能时,Mobigen特别有用。
我们衡量了写入()然后fsync()在五个不同的文件系统上。我们使用了EXT4、XFS、BTRFS、NILFS2和F2FS文件系统。图15显示了性能结果。与EXT4相比,F2FS的性能提高了约10%。
图15。使用随机写入fsync()在内部eMMC上。文件大小:100MB;I/O大小:4 KB。[三星Galaxy S4,Android 4.2.2(JB),/高速缓存分区,EXT4]。
图15。使用随机写入fsync()在内部eMMC上。文件大小:100MB;I/O大小:4 KB。[三星Galaxy S4,Android 4.2.2(JB),/高速缓存分区,EXT4]。
使用Mobigen,我们检查了不同Android平台在执行Facebook和Twitter时的性能。在这项研究中,人类用户在基线平台(GS4和EXT4)中分别使用Facebook和Twitter两分钟。使用Mobigen,我们记录了使用这些应用程序时生成的系统调用,并在四个不同的文件系统下重放了捕获的跟踪。对于每两分钟的运行,我们提取了总的I/O延迟。在EXT4中,总的I/O时间为3秒。使用F2FS,总I/O时间减少到2.3秒。在Twitter实验中观察到类似程度的改进。图16说明了结果。本实验的目的不在于分析文件系统行为。相反,这表明Mobigen可以大大促进基于人工生成工作负载的性能实验,而无需实际的人工干预。表3描述了使用Mobigen对I/O跟踪进行后处理所获取的跟踪的基本统计信息。
图16。使用Mobigen/Mobibench回放脚本的执行时间比较。(一)脸书;(一)推特。[三星Galaxy S4,安卓4.2.2(JB),/高速缓存分区,EXT4]。
图16。使用Mobigen/Mobibench回放脚本的执行时间比较。(一)脸书;(一)推特。[三星Galaxy S4,Android 4.2.2(JB),/高速缓存分区,EXT4]。
表3。使用Mobigen捕获的痕迹特征。
属性 | 脸谱网 | 推特 |
---|
运行时间(秒) | 120 | 120 |
线路(向外延伸) | 25,516 | 22,349 |
线路(Mobigen输出) | 23,231 | 20,641 |
线程数 | 107 | 81 |
写入大小(MB) | 2.81 | 1.91 |
读取大小(MB) | 1.52 | 3.11 |
5.结论
在这项工作中,我们开发了一个框架来分析Android I/O堆栈的行为。该框架有三个主要功能:(i)生成有效捕获Android i/O物理特性的i/O模式;(ii)捕获Android I/O堆栈(应用程序、文件系统和块设备)中上下文相关的I/O特性;以及(iii)使用AndroStep捕获和回放现实世界中的应用程序。
AndroStep是一套全面的工具,使用户能够彻底检查Android操作系统的整个I/O堆栈。它包括名为Mobibench的工作负载生成器(导出各种选项以生成不同性质的工作负载)、名为MOST的跟踪分析器(捕获块IO跟踪并分析其在文件系统级和应用程序级的特性)和Mobigen(收集系统调用跟踪并回放它们)。Mobigen旨在进行以人为中心的实验,而无需实际的人为干预。AndroStep使对Android I/O堆栈的研究变得非常通用。谷歌游戏商店提供Mobibench。AndroStep的源代码是公开的。