存储对手机性能的影响
前言
幾年以前,我被派去廈門上門去分析一個用戶的手機卡頓問題,該用戶的手機經常莫名無響應,刷機,恢復出廠都沒有用,經過一通分析,原來該用戶從熟人店里買到了一張盜版的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學習資料
總結
以上是生活随笔為你收集整理的存储对手机性能的影响的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 让这个该死的服务跑起来了~
- 下一篇: 计算机音乐与制谱,电脑音乐编辑、制谱与视