存储对手机性能的影响
前言
幾年以前,我被派去廈門上門去分析一個用戶的手機卡頓問題,該用戶的手機經(jīng)常莫名無響應(yīng),刷機,恢復(fù)出廠都沒有用,經(jīng)過一通分析,原來該用戶從熟人店里買到了一張盜版的SD卡(這年頭坑的就是朋友),該SD卡讀寫速度很慢,順序讀寫只有20MB/s。那為什么SD卡的讀寫性能對手機性能影響那么大?當(dāng)時我的知識水平,只能從對比測試中發(fā)現(xiàn)這個問題,然后更換SD卡解決了這個問題,但是無法從原理上解釋這種現(xiàn)象。經(jīng)過那么多年的學(xué)習(xí)積累,我現(xiàn)在終于可以解釋這個問題。
一、什么叫存儲設(shè)備
在電腦上,存儲設(shè)備就是硬盤,一般有固態(tài)硬盤和普通機械硬盤,
在手機上,存儲設(shè)備就是內(nèi)部存儲或者外置SD卡,有EMMC和UFS X.X等類型。
1.1 一個程序如何訪問存儲設(shè)備上的數(shù)據(jù)
三個重要硬件,CPU,內(nèi)存,存儲
三者的通信關(guān)系如下:
一個程序需要通過CPU->內(nèi)存->存儲設(shè)備,CPU是無法直接訪問存儲設(shè)備的。
1.2 三者執(zhí)行速度做對比
可以很明顯的看到存儲的速度明顯拖了CPU和內(nèi)存的后腿,所以程序訪問存儲設(shè)備里的速度很大程度上取決于存儲設(shè)備的讀寫速度。
有人說,怎么不把存儲做的快了一點,你要知道越快的東西越貴。如果你有錢,也可以把存儲都換成內(nèi)存,假設(shè)1T的硬盤都換成內(nèi)存,你算算需要多少錢,而且目前我們普通用戶對電腦手機的性能要求,存儲1毫秒響應(yīng)時間足夠了。
思考一個問題:存儲那么慢,CPU那不是會閑,那不是浪費了嗎?
答案:操作系統(tǒng)實現(xiàn)了多進程(Task),讓每個進程輪流使用CPU,變相的對于單個進程來說,CPU的執(zhí)行時間也就變長了。假設(shè)一個CPU,有100個進程輪流使用,那不就是變相的對于單個進程來說,CPU的執(zhí)行時間不就是30納秒了,這樣子不就和內(nèi)存,存儲的速度匹配上了嘛。
1.3 測試存儲性能的兩個指標
隨機讀寫性能
順序讀寫性能
PS:通過跑分軟件測試計算的速度是CPU,內(nèi)存,存儲設(shè)備同時作用的結(jié)果,對存儲設(shè)備的速度有一定的參考意義,但是不能作為存儲設(shè)備的絕對速度。
二、Android存儲架構(gòu)圖
整個Android存儲架構(gòu)分為三個層
1.應(yīng)用程序
2.Linux內(nèi)核
3.硬件層
我們接下來從這三個方面來分析如何提升手機的存儲性能。
三、硬件層
硬件層也就是塊設(shè)備,例如SD卡,固態(tài)硬盤,機械硬盤,都是塊設(shè)備,基本上增大塊設(shè)備絕對讀寫速度只能通過硬件結(jié)構(gòu)升級和驅(qū)動優(yōu)化,硬件廠商提供存儲設(shè)備硬件和驅(qū)動,對于我們OEM廠商來說,基本能優(yōu)化的空間為零。前言中講的用戶問題,就是屬于硬件層的問題,遇到這種問題,只能換硬件,也就是換SD卡。
手機常見的塊設(shè)備速度對比
UFS 3.1 > UFS 3.0 > UFS 2.1 > EMMC
記住UFS數(shù)字越大,速度越快。
小米10的黑科技揭秘-WriteTurbo
最近小米10大肆宣傳的WriteTurbo大概率屬于供應(yīng)商的優(yōu)化,這個方案主要是增加順序讀寫性能,基本原理就是在塊設(shè)備內(nèi)部加入一塊高速緩沖區(qū),這樣子內(nèi)存就是和高速緩沖區(qū)通信,提升順序讀寫的響應(yīng)速度。不管怎么吹,也比不過UFS 3.1。
四、Linux內(nèi)核
Linux內(nèi)核中主要分三層,VFS,FileSystem,Block Layer。
4.1 VFS
VFS是虛擬文件系統(tǒng)的縮寫,屬于linux內(nèi)核的一個抽象層,我們能優(yōu)化的機會不多,但是并不是完全沒有,由于這塊代碼比較標準,一般也不建議去修改。想深入理解這塊知識,可以看我的視頻王小二圖解Android【005】一切皆文件
4.2 FileSystem
FileSystem是文件系統(tǒng),目前手機中常見的F2FS和EXT4,兩者沒有絕對的好壞,只是目前來看在相同的存儲硬件下F2FS比EXT4隨機讀寫速度更快,我們可以通過刷機修改我們存儲的文件系統(tǒng)。
如何優(yōu)化FileSystem,優(yōu)化文件系統(tǒng)的基本思路
1.以內(nèi)存換速度,提前合理的緩存可能即將打開的文件索引,文件系統(tǒng)發(fā)起IO請求到Block Layer的速度將會大大增快。
2.優(yōu)化存儲的結(jié)構(gòu),F2FS和EXT4文件系統(tǒng)會影響到存儲設(shè)備中文件以及文件信息的存儲位置,在不同場景下,兩者有著不同的存儲結(jié)構(gòu)
文件系統(tǒng)的代碼一般都是開源的,而且貢獻者一般都是linux大神,優(yōu)化的難度挺大,但是絕對有機會的。只是我現(xiàn)在的水平只能看看文件系統(tǒng),沒有達到能優(yōu)化的能力
黑科技揭秘-F2FS文件瀏覽器
有廠商說我們是F2FS文件瀏覽器,比傳統(tǒng)的文件瀏覽器快,其實只不過換了文件系統(tǒng)成F2FS,或者對F2FS有一定的代碼優(yōu)化。你的硬件跟不上,就算你的文件系統(tǒng)再牛逼也只能一定程度提升隨機讀寫性能。打個比方:汽車1.5T再牛逼,也比不過2.0自然吸氣,UFS 3.0怎么也比不過3.1。
4.3 Block Layer
Block Layer主要是串聯(lián)各個塊設(shè)備驅(qū)動和文件系統(tǒng),例如電腦上可能存在多塊硬盤,手機上可以外置一個SD卡。
IO調(diào)度算法
Block Layer最重要的就是IO調(diào)度算法,也是比較復(fù)雜,主要任務(wù)就是合并IO請求,重新排序IO請求,轉(zhuǎn)發(fā)IO請求到塊設(shè)備驅(qū)動,可以通過優(yōu)化或者切換調(diào)用算法,提升IO請求的效率。
目前常見的IO調(diào)度算法是:CFQ,NOOP,Deadline
有關(guān)IO調(diào)度算法的介紹和測試手段參考下面這個鏈接
https://blog.51cto.com/scoke/490546
如何優(yōu)化
通過調(diào)整不同進程的IO優(yōu)先級,提升前臺進程的IO調(diào)度的效率。
通過修改IO調(diào)度算法,提升某些場景下IO整體性能。
5、應(yīng)用程序
作為App開發(fā)人員,基本無法去優(yōu)化平臺的存儲性能,但是可以優(yōu)化APP的代碼,減少存儲設(shè)備的訪問,將經(jīng)常訪問的數(shù)據(jù)放到內(nèi)存里來,減少數(shù)據(jù)庫的交互。Android官方也是警告千萬不要在主線程處理復(fù)雜的IO操作。
只要所有App都乖乖地減少對存儲設(shè)備的訪問,這樣子IO負載就不會高,手機也就越流暢。
6、總結(jié)
其實我個人認為,現(xiàn)在手機硬件不斷升級,一臺好的手機不單單是CPU內(nèi)存 ,一塊好的存儲設(shè)備也是非常重要的,如果說CPU決定了這臺手機的上限,那么存儲設(shè)備算是這臺手機的下限。
作為工程師,我們要做的就是將一塊好的存儲設(shè)備優(yōu)化到極致,將差的存儲設(shè)備優(yōu)化到正常使用,我目前正在這個方向上努力學(xué)習(xí),努力進步中。
7、思考
想想你們?nèi)粘懙拇a中有哪些屬于存儲設(shè)備的讀寫,歡迎留言。
? 回復(fù)「?籃球的大肚子」進入技術(shù)群聊
回復(fù)「1024」獲取1000G學(xué)習(xí)資料
總結(jié)
以上是生活随笔為你收集整理的存储对手机性能的影响的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 让这个该死的服务跑起来了~
- 下一篇: 计算机音乐与制谱,电脑音乐编辑、制谱与视