存储对手机性能的影响

前言

几年以前,我被派去厦门上门去分析一个用户的手机卡顿问题,该用户的手机经常莫名无响应,刷机,恢复出厂都没有用,经过一通分析,原来该用户从熟人店里买到了一张盗版的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学习资料

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467907.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python周末吃什么_中午不知道吃什么?用Python爬取美团外卖评论帮你选餐!

分析url的网页源代码,在源代码里有我们想要的评论数据,我们可以用正则(在这里正则还是比较好用的)把我们想要的信息弄下来开启循环,批量抓取保存数据至文本和数据库defparse_one_page(html):pattern2 re.compile( "m_type":"…

5类主题词汇(3)

道德价值 business ethics商业道德 professional ethics个人道德 virtue美德 moral value道德价值 improve public morals改进社会风气 safeguard public morals维护社会风气 injure public morality损害公共道德 fight against piracy抵制盗版 observe/obey the laws守法 be …

进阶攻略|前端最全的框架总结

前端的技术日渐更新,最近得空,花了一上午的时间,将前端常见的UI框架总结了一下,在开发的过程之中,有了这些,不断能够提高自己的工作效率,还可以在工作之余了解更多。希望大家喜欢。1.Layui官方网…

你知道char *s和char s[]的区别吗?

在一个夜深人静的晚上,有一个读者给我发了一个C语言题目。他问我,发哥,帮我看看这个代码有什么问题。我看了代码之后,心里一阵恐慌。我自认为我不是C语言高手。但我确实是一个喜欢解决问题的男人。就是在这样的背景驱使下&#xf…

5类主题词汇(4)

求职就业类 unemployment失业 job-hunting找工作 position职位 job resume就业简历 job interview工作面试 job prospects职业背景application letter求职信 the want ads招聘工作 fill in/out application form填写申请表 accept/take the post接受职位 take over the post接…

python连连看小游戏_利用Python制作一个连连看小游戏,边学边玩!

导语今天我们将制作一个连连看小游戏,让我们愉快地开始吧~开发工具Python版本:3.6.4相关模块:pygame模块;以及一些Python自带的模块环境搭建安装Python并添加到环境变量,pip安装需要的相关模块即可。先睹为快在cmd窗口…

上Google Adsense个人的一点体验

最近我想开通一个Google Adsense帐号,因为以前注册过一个Google帐号,所以我以为两个是可以共通的,因为很久没上Google帐号,我记不太清密码了,所以我先是登录了Google,登上去了,密码没记错。然后…

通俗易懂,嵌入式Linux驱动基础

前言上一篇分享的:《从单片机工程师的角度看嵌入式Linux》中有简单提到Linux的三大类驱动:我们学习编程的时候都会从hello程序开始。同样的,学习Linux驱动我们也从最简单的hello驱动学起。驱动层和应用层 还记得实习那会儿我第一次接触嵌入式…

记,我在深圳买房

今天晚上,有点时间,把这次买房的经历写下来。我并不是想炫耀,也不是想说明什么,只是为了记录自己的生活。这是对自己的一个阶段性总结,也希望自己的意见和想法对读者们有些帮助。再者,凭自己的努力&#xf…

tif 高程_使用ArcGIS提取高程点

地球表面形状的最常见数字化数据便是基于像元的数字高程模型(DEM),该数据可用作量化地表特征的输入。DEM属于一种连续表面的栅格制图表达,通常参考真实的地球表面,有的时候除了需要DEM还需要高程点,这里讲解一下如何使用ArcGIS从D…

《三毛。。。。》烂漫

(初衷)三毛,一个家喻户晓的人物,可她毕竟还不是流浪的三毛,她有深爱她的丈夫,父母,堂哥。。。。 (概述)本书介绍了三毛的人生遭遇,三毛还将自己的人生体验写成…

5类主题词汇(5)

日常应用类 complaint投诉 lodge the complaint投诉 fake products假冒产品 apply for 申请 apologize for 道歉 heartfelt welcome由衷地欢迎 letter of recommendation推荐信 decline a job offer婉拒工作机会 heartiest congratulation最衷心的祝贺 a farewell letter告别信…

你试试用心呼吸

我曾经历过掉水里,两次。第一次,是在水上乐园,不会游泳的我,从高滑梯上头朝下扎到水中。一下子,就感觉呼吸不了,非常惊恐,然后有人(救生员)揽住了我,我非常惊…

cython python3_30倍!使用Cython加速Python代码

原标题:30倍!使用Cython加速Python代码作者:George Seif、Thomas Wolf、Lukas Frei编译:116 | 公众号海外部前言你可能经常会一次又一次地听到关于Python的抱怨,Python跑起来太慢了!与许多其他编程语言相比…

Git安装及密钥的生成并上传本地文件到GitHub上

之前用的GitHub,不太熟练,一直在上传的过程中遇到了一些问题,看了网上诸多教程,总觉得很乱,特参考一些资料,总结了一篇完整的操作步骤,从下载安装到上传文件,亲测有效1.下载Git软件&…

100条常用写作谚语(1)(2)(3)(4)

文章目录勤奋 意志与成功学习方法与态度健康与心态品行与操守勤奋 意志与成功 where there is a will,there is a way有志者事竟成 No pains,no gains没有付出没有收获 Constant dropping wears away a stone水滴石穿,绳锯木断 Care and dil…

声明为数组定义为指针,声明为指针定义为数组

导语在这里我们做种强调的是在两个文件中,定义为数组声明为指针和定义为指声明为数组的这辆中情况。那么我们就需要两个源文件test.c和main.c。定义为数组,声明为指针test.cchar arr[] "abcdef";main.c#define _CRT_SECURE_NO_WARNINGS 1 #in…

100条常用写作谚语(5)(6)(7)(8)

文章目录金钱与财富珍惜时光择友与友谊常理与法则金钱与财富 Gold will not buy anything黄金不能买一切 The chief aim of man is not to get money 人的主要目的不是赚钱 The money the miser hoards will do him not good 守财奴积财,对自己毫无好处 What is we…

python中内置的集成开发工具_python应用(3):启用集成开发工具pycharm

之前写了个python程序给自己用,写代码时用的是macvim(vim的一种),macvim是个编辑工具,由于我已经设置过对python等各种语言的支持特性,所以什么缩进、对齐、高亮之类的表现都有,写起代码来非常舒服。可是,不…

python selenium环境配置Firefox和Chrome

1、下载Selenium库,可以使用pip install selenium https://pypi.python.org/pypi/selenium/ 2、下载驱动 Chrome: https://sites.google.com/a/chromium.org/chromedriver/downloads Firefox: https://github.com/mozilla/geckodriver/releases 3、配置环境变量 需要…