TRIM:提升磁盤性能,緩解Android卡頓

Android 系統(tǒng)越用越卡的問題,可能存在的原因

1邦泄、先 說內(nèi)存删窒。為了保證應(yīng)用可以快速被再次調(diào)起,Android 在內(nèi)存管理上采用如下策略:進(jìn)程保持在內(nèi)存中顺囊,在占用內(nèi)存未超過閾值之前不會(huì)系統(tǒng)進(jìn)行主動(dòng)清理肌索。但隨著應(yīng)用的增多,試圖保持在內(nèi)存中的進(jìn)程將會(huì)增多特碳,因此 影響系統(tǒng)的流暢度诚亚。可以說测萎,內(nèi)存與系統(tǒng)卡頓的關(guān)系早已是業(yè)界的共識(shí)亡电,其解決方案也比較明了,即賦予系統(tǒng)主動(dòng)清理內(nèi)存的能力硅瞧,例如待機(jī)后殺掉不必要的進(jìn)程份乒。

2、再聊磁盤腕唧。長(zhǎng)期使用 Android 手機(jī)必將產(chǎn)生大量的磁盤碎片或辖,而磁盤碎片將會(huì)降低磁盤的讀寫性能,從而影響系統(tǒng)流暢度枣接。但是磁盤碎片是否能對(duì)磁盤的讀寫性能造成了很大影響,以至于影響系統(tǒng)流暢度尚未可知颂暇,且暫時(shí)也沒有發(fā)現(xiàn)可以進(jìn)行嘗試的潛在優(yōu)化點(diǎn)。

逐步分析

Step 0:磁盤與系統(tǒng)流暢度的關(guān)系

其實(shí)但惶,日常的生活經(jīng)驗(yàn)(例如 SSD 可以讓老筆記本煥發(fā)新生)已經(jīng)我們能夠感覺得到磁盤對(duì)系統(tǒng)流暢度的影響很大耳鸯。但是,這里還是有再必要簡(jiǎn)單說一下膀曾,磁盤是如何影響系統(tǒng)流暢度的县爬。

開 發(fā)過 Android 項(xiàng)目的同學(xué)都知道 Android 在使用網(wǎng)絡(luò)的最佳實(shí)踐是使用3級(jí)緩存的設(shè)計(jì)來提升系統(tǒng)的流暢度并節(jié)省流量:CPU 首先嘗試從內(nèi)存中加載圖片,若此時(shí)圖片存在在內(nèi)存中則加載成功添谊,否則內(nèi)存會(huì)從磁盤中加載圖片财喳,若此時(shí)圖片存在在磁盤中則加載成功,否則磁盤會(huì)最終向網(wǎng)絡(luò)中 下載圖片斩狱。

其實(shí)上述的執(zhí)行邏輯耳高,也就解釋了磁盤是 如何影響系統(tǒng)流暢度的:對(duì)于系統(tǒng)流暢度(其實(shí)也是各個(gè)應(yīng)用的流暢度)影響最直接的就是 CPU 的執(zhí)行效率,但是如果這個(gè)過程中內(nèi)存所踊、磁盤以及網(wǎng)絡(luò)的讀寫速度如果跟不上 CPU 的執(zhí)行效率的話泌枪,就會(huì)造成 CPU 在處理任務(wù)的時(shí)候需要花費(fèi)時(shí)間等待數(shù)據(jù),從而影響了流暢度秕岛。

所以第一個(gè)問題就弄清楚了:磁盤的讀寫速度的降低會(huì)使得系統(tǒng)流暢度變差碌燕!那么乍赫,我們要分析的問題就轉(zhuǎn)化成:磁盤在長(zhǎng)期使用的過程中,其讀寫速度會(huì)不會(huì)降低陆蟆。

Step 1:弄清 Android 磁盤的讀寫機(jī)制

為了分析清楚磁盤“磁盤在長(zhǎng)期使用的過程中,其讀寫速度會(huì)不會(huì)降低”這個(gè)問題惋增,我們有必要先弄明白 Android 磁盤所采用的讀寫機(jī)制叠殷。

通 過資料查閱,我們了解到目前诈皿,Android 手機(jī)大多采用 NAND Flash 架構(gòu)的閃存卡來存儲(chǔ)內(nèi)容林束。NAND Flash 的內(nèi)部存儲(chǔ)單位從小到大依次為:Page、Block稽亏、Plane壶冒、Die,而一個(gè) Device 上可以封裝若干個(gè) Die截歉。下圖就是一個(gè) NAND Flash 組成結(jié)構(gòu)的示意圖胖腾。

為了方便理解,針對(duì)一個(gè) Die瘪松,我們?cè)俪橄笠幌孪套鳎琍age、Block宵睦、Plane记罚、Die 的關(guān)系如下圖所示。

雖然 NAND Flash 的優(yōu)點(diǎn)多多壳嚎,但是為了延長(zhǎng)驅(qū)動(dòng)器的壽命桐智,它的讀寫操作均是以 Page 為單位進(jìn)行的,但擦除操作卻是按 Block 為單位進(jìn)行的烟馅。

由于有大量的讀寫操作说庭,于是我們的 NAND Flash 制定了如下的讀寫規(guī)則:

刪除數(shù)據(jù)時(shí),芯片將標(biāo)記這些 Page 為閑置狀態(tài)焙糟,但并不會(huì)立馬執(zhí)行擦除操作口渔。

寫入數(shù)據(jù)時(shí),如果目前磁盤剩余空間充足穿撮,則由芯片指定 Block 后直接按 Page 為單位進(jìn)行寫入即可缺脉。

寫入數(shù)據(jù)時(shí),如果目前磁盤剩余空間不足悦穿,為了獲得足夠的空間攻礼,磁盤先將某塊 Block 的內(nèi)容讀至緩存,然后再在該 Block 上進(jìn)行擦除操作栗柒,最后將新內(nèi)容與原先內(nèi)容一起寫入至該 Block礁扮。

那 么問題來了知举!假如現(xiàn)在我要向磁盤中寫入一張圖片的數(shù)據(jù),這個(gè)圖片的數(shù)據(jù)大小剛好為一個(gè) Page太伊。最壞的情況就是雇锡,內(nèi)存中恰好只有一個(gè) Block 恰好有一個(gè) Page 的無效數(shù)據(jù)可以擦除。為了存下這張圖片僚焦,于是主控就把這個(gè) Block 的所有數(shù)據(jù)讀至緩存锰提,擦除Block上的內(nèi)容,再向緩存中加上這個(gè)4KB 新數(shù)據(jù)后最后寫回 Block 中芳悲。

我 的天啊立肘,其實(shí)想存儲(chǔ)的就是1個(gè) Page 的圖片內(nèi)容,但是實(shí)際上確造成了整個(gè) Block 的內(nèi)容都被重新寫入名扛,同時(shí)原本簡(jiǎn)單一步搞定的事情被還被分成了前后四步執(zhí)行(閃存讀取谅年、緩存改、閃存擦除肮韧、閃存寫入)造成延遲大大增加融蹂,速度變慢。這就是 傳說中的“寫入放大”(Write Amplification)問題弄企。而“寫入放大”也說明了磁盤在長(zhǎng)期使用的過程中殿较,其讀寫速度(尤其是寫入速度)會(huì)存在降低的現(xiàn)象。

Step 2:解決“寫入放大”問題的技術(shù)——TRIM

不過桩蓉,既然“寫入放大”(Write Amplification)都這么出名了淋纲,肯定不會(huì)沒有現(xiàn)成的解決方案的!這個(gè)很簡(jiǎn)單院究,Google 一下洽瞬,我們就知道解決方案就是 TRIM 技術(shù)。

TRIM 是一條 ATA 指令业汰,由操作系統(tǒng)發(fā)送給閃存主控制器伙窃,告訴它哪些數(shù)據(jù)占的地址是“無效”的。在 TRIM 的幫助下样漆,閃存主控制器就可以提前知道哪些 Page 是“無效”的为障,便可以在適當(dāng)?shù)臅r(shí)機(jī)做出優(yōu)化,從而改善性能放祟。這里要強(qiáng)調(diào)下鳍怨,TRIM 只是條指令,讓操作系統(tǒng)告訴閃存主控制器這個(gè) Page 已經(jīng)“無效”就算完了跪妥,并沒有任何其它多余的操作鞋喇。在測(cè)試的過程中,我們發(fā)現(xiàn) TRIM 的觸發(fā)需要操作系統(tǒng)眉撵、驅(qū)動(dòng)程序以及閃存主控三者都支持才能真正意義上實(shí)現(xiàn)侦香。例如:

操作系統(tǒng)不支持的情況:Android 4.3以下均不支持

閃存主控不支持的情況:Samsung Galaxy Nexus(I9250)所選用的閃存不支持

基于 TRIM 技術(shù)落塑,目前常見有兩種方案可以解決“寫入放大”的問題:

discard 選項(xiàng)。該方案將在掛載 ext4 分區(qū)時(shí)加上 discard 選項(xiàng)罐韩,此后操作系統(tǒng)在執(zhí)行每一個(gè)磁盤操作時(shí)同時(shí)都會(huì)執(zhí)行 TRIM 指令憾赁。該方案的優(yōu)點(diǎn)是總體耗時(shí)短,但影響會(huì)到刪除文件時(shí)的性能散吵。

fstrim 命令缠沈。該方案將選擇合適的時(shí)機(jī)對(duì)整個(gè)分區(qū)執(zhí)行 TRIM 操作。相對(duì)于方案一错蝴,該方案總體耗時(shí)較長(zhǎng),但不會(huì)影響正常操作時(shí)的磁盤性能颓芭。

不得不說顷锰,如果從用戶的角度出發(fā),還是 FSTRIM 的方法更靠譜一些亡问,但如何尋找合適的 TRIM 時(shí)機(jī)就是一個(gè)比較講究的問題了官紫。

Step 3:TRIM 在 Android 中的實(shí)現(xiàn)

根據(jù)前面的分析,我們不難理解在 Android 中的 TRIM 選擇通過 fstrim 命令的方式進(jìn)行實(shí)現(xiàn)州藕。那么束世,Google 又是如何設(shè)計(jì)觸發(fā)TRIM的時(shí)機(jī)呢?

通 過走讀 Android 源碼(AOSP 4.4.4)床玻,可以了解到 Android 通過系統(tǒng)服務(wù) IdleMaintenanceService 來進(jìn)行系統(tǒng)狀態(tài)監(jiān)控并決定何時(shí)觸發(fā) TRIM毁涉。根據(jù) IdleMaintenanceService.java 源碼,我們繪制了 fstrim 的觸發(fā)示意圖如下:

注釋:

有/無操作:距屏幕熄滅||屏保啟動(dòng)已超過71分鐘

是/否電量充足:維護(hù)期20%锈死,非維護(hù)期(充電狀態(tài)30%贫堰,非充電狀態(tài)80%)

是/否維護(hù)超時(shí):?jiǎn)?dòng)維護(hù)已超過71分鐘

是/否已到維護(hù)期:據(jù)上次啟動(dòng)維護(hù)超過1天

Step 4:分析閃存碎片及 TRIM 對(duì)磁盤 I/O 性能的影響

了解了這么多技術(shù)背景,那我們通過測(cè)試數(shù)據(jù)分析閃存碎片和 TRIM 對(duì)磁盤 I/O 性能的影響待牵。根據(jù)測(cè)試目的其屏,具體的測(cè)試設(shè)置如下:

測(cè)試目的

評(píng)估閃存碎片和TRIM對(duì)磁盤 I/O 性能的影響

測(cè)試方案

測(cè)試對(duì)象:LG Nexus 5 with cm-11-20140805-SNAPSHOT-M9-hammerhead

測(cè)試步驟

重新刷機(jī),使用 Bonnie++ 測(cè)試 SD 卡目錄的 I/O 性能缨该;

模擬長(zhǎng)期使用 SD 卡的過程(期間需要避免TRIM觸發(fā))偎行,使用 Bonnie++ 測(cè)試 SD 卡目錄的 I/O 性能;

主動(dòng)觸發(fā) TRIM贰拿,使用 Bonnie++ 測(cè)試 SD 卡目錄的 I/O 性能蛤袒。

備注:

模擬長(zhǎng)期使用 SD 卡的過程的方法:開發(fā)專用的測(cè)試應(yīng)用,該應(yīng)用將向 SD 卡目錄不停寫入大小隨機(jī)的文件膨更,當(dāng) SD 卡剩余空間不足時(shí)將刪除所寫入的文件汗盘,然后繼續(xù)上述操作直到應(yīng)用退出。

避免 TRIM 觸發(fā)的方法:根據(jù) Android 的觸發(fā)過程分析询一,只需設(shè)置屏幕常亮并即可避免 TRIM 的觸發(fā)隐孽。

測(cè)試數(shù)據(jù)

數(shù)據(jù)解讀:

通過反復(fù)擦寫 SD 卡癌椿,可以發(fā)現(xiàn) SD 卡的 I/O 效率指標(biāo)均存在一定幅度的下滑,其中反映磁盤空間分配性能及文件數(shù)據(jù)寫回性能的指標(biāo)下滑明顯菱阵;

Sequential Output-Block 可以反映分配磁盤文件空間的效率踢俄,經(jīng)反復(fù)擦寫 SD 卡后,該效率降低至原始值的15-20%晴及,應(yīng)該是大量的磁盤閑置數(shù)據(jù)塊造成的影響都办;

Sequential Output-Rewrite 可以反映文件系統(tǒng)緩存和數(shù)據(jù)傳輸?shù)乃俣龋?jīng)反復(fù)擦寫 SD 卡制造閑置數(shù)據(jù)塊后虑稼,該效率降低至原始值的50%琳钉。

主動(dòng)調(diào)用 TRIM 后,可以發(fā)現(xiàn) SD 卡的 I/O 效率指標(biāo)均恢復(fù)至接近原始值水平(但仍未完全達(dá)到初始狀態(tài)的水平)蛛倦。

測(cè)試結(jié)論

在 TRIM 無效的情況下歌懒,長(zhǎng)期使用 SD 卡,磁盤寫入速度會(huì)受到明顯影響;

TRIM 對(duì)因閑置數(shù)據(jù)塊造成的 I/O 性能下降有一定的恢復(fù)作用溯壶;

大量的讀寫操作對(duì) SD 卡造成了一定量的不可恢復(fù)的損耗及皂。

Step 5:FSTRIM 系統(tǒng)自動(dòng)觸發(fā)測(cè)試

完成了上面的工作,不由得讓我們大吃一鯨:原來 TRIM 對(duì) SD 卡的讀寫速度的維護(hù)如此重要且改!前面也說到验烧,Android 選擇 FSTRIM 方案的來實(shí)現(xiàn) TRIM,那么 Android 所設(shè)計(jì)的 FSTRIM 觸發(fā)時(shí)機(jī)有沒有什么問題呢又跛?

根據(jù) Android 系統(tǒng)的設(shè)定碍拆,F(xiàn)STRIM 預(yù)期是每隔24小時(shí)觸發(fā)一次。所以慨蓝,接下來我們需要評(píng)估一下倔监,F(xiàn)STRIM 能否依據(jù)上述設(shè)定成功被系統(tǒng)觸發(fā)。

測(cè)試目的

分析 FSTRIM 能否被按時(shí)被系統(tǒng)觸發(fā)

測(cè)試方案

測(cè)試對(duì)象:2臺(tái) Samsung Galaxy Nexus 及2臺(tái) LG Nexus 5

測(cè)試步驟

刷機(jī)后菌仁,安裝常用應(yīng)用并啟動(dòng)(均無SIM卡浩习,其中1臺(tái)設(shè)備開啟 Wifi,另1臺(tái)設(shè)備關(guān)閉 Wifi)济丘;

進(jìn)行 Log 記錄谱秽;

強(qiáng)制執(zhí)行一次 FSTRIM;

滅屏等待30小時(shí)左右摹迷,提取 Log 記錄進(jìn)行分析疟赊。

測(cè)試數(shù)據(jù)

開啟WiFi

關(guān)閉WiFi

Samsung Galaxy Nexus啟動(dòng)FSTRIM 1次啟動(dòng)FSTRIM 1次

LG Nexus 5未啟動(dòng)FSTRIM啟動(dòng)FSTRIM 1次

數(shù)據(jù)解讀:

FSTRIM 大多數(shù)情況會(huì)被自動(dòng)觸發(fā),但也存在無法觸發(fā)的情況峡碉;

根據(jù) FSTRIM 的觸發(fā)邏輯近哟,是否開啟 WIFI 對(duì) FSTRIM 的影響主要是有無推送消息(影響滅屏條件)以及不同的耗電。

測(cè)試結(jié)論

測(cè) 試數(shù)據(jù)顯示 FSTRIM 大多數(shù)情況會(huì)被自動(dòng)觸發(fā)鲫寄,但也存在無法觸發(fā)的情況吉执》枰可能的原因是:FSTRIM 對(duì)電量的要求略高,所以一旦發(fā)生意外情況(如應(yīng)用的 PUSH 消息)終止了計(jì)劃 FSTRIM 的執(zhí)行之后戳玫,很長(zhǎng)時(shí)間之內(nèi)都無法再滿足 FSTRIM 的啟動(dòng)條件熙掺。

所以,如需提高其觸發(fā)頻率咕宿,我們可以考慮降低觸發(fā)條件中對(duì)電量的要求币绩。

總結(jié):

磁盤碎片(更準(zhǔn)確的說法是 SD 卡中的閑置數(shù)據(jù)塊)會(huì)嚴(yán)重影響磁盤的讀寫性能,可能會(huì)導(dǎo)致 Android 系統(tǒng)越用越卡府阀,而 Android 系統(tǒng)的 FSTRIM 對(duì)此有恢復(fù)的作用缆镣;

經(jīng)過實(shí)驗(yàn)分析, FSTRIM 并不一定能夠按期(每天一次)執(zhí)行试浙。而導(dǎo)致這一問題的原因可能是 IdleMaintenanceService 對(duì)電量的要求過高(未充電狀態(tài)下大于80%)董瞻。

優(yōu)化:

FSTRIM 對(duì)電量的要求略高,如需提高其觸發(fā)頻率可以從降低觸發(fā)條件中對(duì)電量的要求川队;

在必要的情況下,可以發(fā)送特定的 Intent 事件睬澡,使系統(tǒng)強(qiáng)制觸發(fā) FSTRIM固额。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市煞聪,隨后出現(xiàn)的幾起案子斗躏,更是在濱河造成了極大的恐慌,老刑警劉巖昔脯,帶你破解...
    沈念sama閱讀 223,002評(píng)論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啄糙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡云稚,警方通過查閱死者的電腦和手機(jī)隧饼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來静陈,“玉大人燕雁,你說我怎么就攤上這事【ㄓ担” “怎么了拐格?”我有些...
    開封第一講書人閱讀 169,787評(píng)論 0 365
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)刑赶。 經(jīng)常有香客問我捏浊,道長(zhǎng),這世上最難降的妖魔是什么撞叨? 我笑而不...
    開封第一講書人閱讀 60,237評(píng)論 1 300
  • 正文 為了忘掉前任金踪,我火速辦了婚禮浊洞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘热康。我一直安慰自己沛申,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評(píng)論 6 398
  • 文/花漫 我一把揭開白布姐军。 她就那樣靜靜地躺著铁材,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奕锌。 梳的紋絲不亂的頭發(fā)上著觉,一...
    開封第一講書人閱讀 52,821評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音惊暴,去河邊找鬼饼丘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛辽话,可吹牛的內(nèi)容都是我干的肄鸽。 我是一名探鬼主播,決...
    沈念sama閱讀 41,236評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼油啤,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼典徘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起益咬,我...
    開封第一講書人閱讀 40,196評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤逮诲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后幽告,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梅鹦,經(jīng)...
    沈念sama閱讀 46,716評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評(píng)論 3 343
  • 正文 我和宋清朗相戀三年冗锁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了齐唆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,928評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡冻河,死狀恐怖蝶念,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情芋绸,我是刑警寧澤媒殉,帶...
    沈念sama閱讀 36,583評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站摔敛,受9級(jí)特大地震影響廷蓉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評(píng)論 3 336
  • 文/蒙蒙 一桃犬、第九天 我趴在偏房一處隱蔽的房頂上張望刹悴。 院中可真熱鬧,春花似錦攒暇、人聲如沸土匀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽就轧。三九已至,卻和暖如春田度,著一層夾襖步出監(jiān)牢的瞬間妒御,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工镇饺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乎莉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,378評(píng)論 3 379
  • 正文 我出身青樓奸笤,卻偏偏與公主長(zhǎng)得像惋啃,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子监右,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容