前言

几年以前,我被派去厦门上门去分析一个用户的手机卡顿问题,该用户的手机经常莫名无响应,刷机,恢复出厂都没有用,经过一通分析,原来该用户从熟人店里买到了一张盗版的SD卡(这年头坑的就是朋友),该SD卡读写速度很慢,顺序读写只有20MB/s。那为什么SD卡的读写性能对手机性能影响那么大?当时我的知识水平,只能从对比测试中发现这个问题,然后更换SD卡解决了这个问题,但是无法从原理上解释这种现象。经过那么多年的学习积累,我现在终于可以解释这个问题。

一、什么叫存储设备

在电脑上,存储设备就是硬盘,一般有固态硬盘和普通机械硬盘,
在手机上,存储设备就是内部存储或者外置SD卡,有EMMC和UFS X.X等类型。

1.1 一个程序如何访问存储设备上的数据

三个重要硬件,CPU,内存,存储
三者的通信关系如下:
一个程序需要通过CPU->内存->存储设备,CPU是无法直接访问存储设备的。

1.2 三者执行速度做对比

可以很明显的看到存储的速度明显拖了CPU和内存的后腿,所以程序访问存储设备里的速度很大程度上取决于存储设备的读写速度。

有人说,怎么不把存储做的快了一点,你要知道越快的东西越贵。如果你有钱,也可以把存储都换成内存,假设1T的硬盘都换成内存,你算算需要多少钱,而且目前我们普通用户对电脑手机的性能要求,存储1毫秒响应时间足够了。

思考一个问题:存储那么慢,CPU那不是会闲,那不是浪费了吗?

答案:操作系统实现了多进程(Task),让每个进程轮流使用CPU,变相的对于单个进程来说,CPU的执行时间也就变长了。假设一个CPU,有100个进程轮流使用,那不就是变相的对于单个进程来说,CPU的执行时间不就是30纳秒了,这样子不就和内存,存储的速度匹配上了嘛。

1.3 测试存储性能的两个指标

随机读写性能
顺序读写性能
PS:通过跑分软件测试计算的速度是CPU,内存,存储设备同时作用的结果,对存储设备的速度有一定的参考意义,但是不能作为存储设备的绝对速度。

二、Android存储架构图

整个Android存储架构分为三个层

1.应用程序
2.Linux内核
3.硬件层

我们接下来从这三个方面来分析如何提升手机的存储性能。

三、硬件层

硬件层也就是块设备,例如SD卡,固态硬盘,机械硬盘,都是块设备,基本上增大块设备绝对读写速度只能通过硬件结构升级和驱动优化,硬件厂商提供存储设备硬件和驱动,对于我们OEM厂商来说,基本能优化的空间为零。前言中讲的用户问题,就是属于硬件层的问题,遇到这种问题,只能换硬件,也就是换SD卡。

手机常见的块设备速度对比

UFS 3.1 > UFS 3.0 > UFS 2.1 > EMMC

记住UFS数字越大,速度越快。

小米10的黑科技揭秘-WriteTurbo

最近小米10大肆宣传的WriteTurbo大概率属于供应商的优化,这个方案主要是增加顺序读写性能,基本原理就是在块设备内部加入一块高速缓冲区,这样子内存就是和高速缓冲区通信,提升顺序读写的响应速度。不管怎么吹,也比不过UFS 3.1。

四、Linux内核

Linux内核中主要分三层,VFS,FileSystem,Block Layer。

4.1 VFS

VFS是虚拟文件系统的缩写,属于linux内核的一个抽象层,我们能优化的机会不多,但是并不是完全没有,由于这块代码比较标准,一般也不建议去修改。想深入理解这块知识,可以看我的视频王小二图解Android【005】一切皆文件

4.2 FileSystem

FileSystem是文件系统,目前手机中常见的F2FS和EXT4,两者没有绝对的好坏,只是目前来看在相同的存储硬件下F2FS比EXT4随机读写速度更快,我们可以通过刷机修改我们存储的文件系统。

如何优化FileSystem,优化文件系统的基本思路

1.以内存换速度,提前合理的缓存可能即将打开的文件索引,文件系统发起IO请求到Block Layer的速度将会大大增快。
2.优化存储的结构,F2FS和EXT4文件系统会影响到存储设备中文件以及文件信息的存储位置,在不同场景下,两者有着不同的存储结构

文件系统的代码一般都是开源的,而且贡献者一般都是linux大神,优化的难度挺大,但是绝对有机会的。只是我现在的水平只能看看文件系统,没有达到能优化的能力

黑科技揭秘-F2FS文件浏览器

有厂商说我们是F2FS文件浏览器,比传统的文件浏览器快,其实只不过换了文件系统成F2FS,或者对F2FS有一定的代码优化。你的硬件跟不上,就算你的文件系统再牛逼也只能一定程度提升随机读写性能。打个比方:汽车1.5T再牛逼,也比不过2.0自然吸气,UFS 3.0怎么也比不过3.1。

4.3 Block Layer

Block Layer主要是串联各个块设备驱动和文件系统,例如电脑上可能存在多块硬盘,手机上可以外置一个SD卡。

IO调度算法

Block Layer最重要的就是IO调度算法,也是比较复杂,主要任务就是合并IO请求,重新排序IO请求,转发IO请求到块设备驱动,可以通过优化或者切换调用算法,提升IO请求的效率。
目前常见的IO调度算法是:CFQ,NOOP,Deadline
有关IO调度算法的介绍和测试手段参考下面这个链接
https://blog.51cto.com/scoke/490546

如何优化

通过调整不同进程的IO优先级,提升前台进程的IO调度的效率。
通过修改IO调度算法,提升某些场景下IO整体性能。

5、应用程序

作为App开发人员,基本无法去优化平台的存储性能,但是可以优化APP的代码,减少存储设备的访问,将经常访问的数据放到内存里来,减少数据库的交互。Android官方也是警告千万不要在主线程处理复杂的IO操作。

只要所有App都乖乖地减少对存储设备的访问,这样子IO负载就不会高,手机也就越流畅。

6、总结

其实我个人认为,现在手机硬件不断升级,一台好的手机不单单是CPU内存 ,一块好的存储设备也是非常重要的,如果说CPU决定了这台手机的上限,那么存储设备算是这台手机的下限。

作为工程师,我们要做的就是将一块好的存储设备优化到极致,将差的存储设备优化到正常使用,我目前正在这个方向上努力学习,努力进步中。

7、思考

想想你们日常写的代码中有哪些属于存储设备的读写,欢迎留言。

回复「 篮球的大肚子」进入技术群聊

回复「1024」获取1000G学习资料

存储对手机性能的影响相关推荐

  1. 更换新电池对iPhone手机性能的影响实测

    笔者最近对手中的iPhone6 Plus更换了新电池,想把更换前后的效果分享给各位机友. 首先,介绍下我的iPhone6 Plus的使用情况,iPhone6系列是2014年9月推出的,电池总容量291 ...

  2. 存储方式与介质对性能的影响

    摘要 数据的存储方式对应用程序的整体性能有着极大的影响.对数据的存取,是顺利读写还是随机读写?将数据放磁盘上还将数据放flash卡上?多线程读写对性能影响?面对着多种数据存储方式,我们如何选择?本文给 ...

  3. 安卓手机RAM的重要性以及与CPU、GPU对手机性能影响的影响

    RAM是什么?RAM,英文全称:RamdomAccessMemory 随机存取存储器,RAM就相当于电脑的内存,越大越好,直接影响电脑快慢性能.我用的512M的DEFY526,装好常用软件,运行几个游 ...

  4. 380免费云存储_从四个方面分析:云存储服务的特点、影响

    云存储就是将储存资源放到云上供人存取的一种新兴方案,使用者可以在任何时间.任何地方,透过任何可连网的装置连接到云上方便地存取数据.那么,云存储服务有什么特点,会给我们带来一些什么样的影响呢? 云存储是 ...

  5. 骁龙芯片性能排行2020_鲁大师2019年度手机性能、芯片、AI性能以及流畅排行榜:这些榜单你怎么看?...

    手机性能榜 2019年,高通打破了常规升级方案,在下半年推出了骁龙855 Plus处理器,成为了旗舰手机的标配,华为也发布了麒麟990和麒麟990 5G两款SOC,让旗下的机型有了更多的选择. 由于子 ...

  6. 小米6鲁大师html5评测,一加6T依然是顶级旗舰!鲁大师2018手机性能榜跑分排前三!...

    很多手机发烧友都知道,一加手机6T这台手机是一台各方面都非常均衡的旗舰机型.鲁大师2018年度报告手机综合性能跑分榜单一出炉,一加6T便不负众望以332592分顺利进入前列,排名第三! 一加手机6T在 ...

  7. C++ 性能剖析 (四):Inheritance 对性能的影响

    (这个editor今天有毛病,把我的format全搞乱了,抱歉!) Inheritance 是OOP 的一个重要特征.虽然业界有许多同行不喜欢inheritance,但是正确地使用inheritanc ...

  8. 数据库设计对性能的影响

    数据库结构设计和数据库优化呢,是我们后面几张主要的内容,所以我们这里先简单的看几个和数据库的设计,和SQL优化有关的对数据库性能产生影响的一些易犯的错误,我们现在对如何高性能的数据库设计,和SQL优化 ...

  9. 总结:服务器硬件对性能的影响

    前面介绍了服务器硬件中比较主要的部分,包括CPU,内存,IO子系统,还有网络对数据库性能的影响,内容不可能覆盖这里面几个完整的知识,但是对于数据库选择相应的硬件,应该呢已经足够了,下面简单来做一个总结 ...

最新文章

  1. 迪克森沉思录之做Global SAP项目的弊端
  2. MySQL查询结果复制到新表(更新、插入)
  3. java 链表 传递_java 链表 传递过程中的问题
  4. MySQL事务控制语句
  5. golang 标准库间依赖的可视化展示
  6. .NET平台下几种SOCKET模型的简要性能供参考
  7. MacOS 的 Automator 实用案例详解
  8. beego mysql按时间排序_beego的数据库操作优化
  9. 计算机科技作品大赛,世界编程大赛一等奖作品
  10. 【重磅推出】推荐系统系列教程之九:解密“看了又看”和“买了又买”(Item-Based)...
  11. 阿里云弹性计算负责人蒋林泉:亿级场景驱动的技术自研之路 | 问底中国 IT 技术演变...
  12. 手机号码正则 中文姓名正则
  13. 前端js、jQuery实现日期格式化、字符串格式化
  14. Yedda Twitter C# Library
  15. Word控件Spire.Doc 【邮件合并】教程(三):如何创建邮件合并和合并文本值
  16. 虚拟机安装麒麟操作系统网络设置
  17. [GXYCTF2019]禁止套娃
  18. 标量、向量、矩阵求导
  19. van访谈_谷歌业务分析师访谈
  20. 物联网智慧养老平台解析

热门文章

  1. 查询Oracle正在执行的sql语句
  2. [redis设计与实现][7]基本数据结构——对象
  3. 汇编题目:编写包含多个功能子程序的中断例程
  4. 部署Windows Server Update Services 4.0
  5. NA-NP-IE系列实验28:HDLC 和PPP 封装
  6. GNS3从入门到精通
  7. java获取操作系统信息
  8. Linux 命令之 cut
  9. c语言有趣代码_为什么C语言永远不会过时?
  10. 【机器学习】 关联规则Apriori和mlxtend——推荐算法