優化建議 儲存效能優化。

2021-09-26 10:09:09 字數 3840 閱讀 5385

在**應用中,海量的資料讀寫對磁碟訪問造成巨大壓力,雖然可以通過cache解決一部分資料讀壓力,但是很多時候,磁碟仍然是系統最嚴重的瓶頸。而且磁碟中儲存的資料是**最重要的資產,磁碟的可用性和容錯性也至關重要。

機械硬碟是目前最常用的一種硬碟,通過馬達驅動磁頭臂,帶動磁頭到指定的磁碟位置訪問資料,由於每次訪問資料都需要移動磁頭臂,因此機械硬碟在資料連續訪問(要訪問的資料儲存在連續的磁碟空間上)和隨機訪問(要訪問的資料儲存在不連續的磁碟空間)時,由於移動磁頭臂的次數相差巨大,效能表現差別也非常大。機械硬碟結構如下圖所示。

固態硬碟又稱作ssd或flash硬碟,這種硬碟沒有機械裝置,資料儲存在可持久記憶的矽晶體上,因此可以像記憶體一樣快速隨機訪問。而且ssd具有更小的功耗和更少的磁碟震動與雜訊。ssd硬碟如下圖所示。

在**應用中,大部分應用訪問資料都是隨機的,這種情況下ssd具有更好的效能表現。但是目前ssd硬碟還不太成熟,可靠性、價效比有待提公升,因此ssd的使用還在摸索階段。但是相信隨著ssd工藝水平的提高,逐步替代傳統機械硬碟是遲早的事。

由於傳統的機械磁碟具有快速順序讀寫、慢速隨機讀寫的訪問特性,這個特性對磁碟儲存結構和演算法的選擇影響甚大。

為了改善資料訪問特性,檔案系統或資料庫系統通常會對資料排序後儲存,加快資料檢索速度,這就需要保證資料在不斷更新、插入、刪除後依然有序,傳統關聯式資料庫的做法是使用b+樹,如下圖所示。

b+樹是一種專門針對磁碟儲存而優化的n叉排序樹,以樹節點為單位儲存在磁碟中,從根開始查詢所需資料所在的節點編號和磁碟位置,將其載入到記憶體中然後繼續查詢,直到找到所需的資料。

目前資料庫多採用兩級索引的b+樹,樹的層次最多三層。因此可能需要5次磁碟訪問才能更新一條記錄(三次磁碟訪問獲得資料索引及行id,然後再進行一次資料檔案讀操作及一次資料檔案寫操作)。

但是由於每次磁碟訪問都是隨機的,而傳統機械硬碟在資料隨機訪問時效能較差,每次資料訪問都需要多次訪問呢磁碟影響資料訪問效能。

目前許多nosql產品採用lsm樹作為主要資料結構,如下圖所示。

lsm樹可以看作是乙個n階合併樹。資料寫操作(包括插入、修改、刪除)都在記憶體中進行,並且都會建立乙個新紀錄(修改會記錄新的資料值,而刪除會記錄乙個刪除標誌),這些資料在記憶體中仍然還是一棵排序樹,當資料量超過設定的記憶體閾值後,會將這棵排序樹和磁碟上最新的排序樹合併。當這棵排序樹的資料量也超過設定閾值後,和磁碟上下一級的排序樹合併。會用最新更新的資料覆蓋舊的資料(或者記錄為不同版本)。

在需要進行讀操作時,總是從記憶體中的排序樹開始索引,如果沒有找到,就從磁碟上的排序樹順序查詢。

在lsm樹上進行一次資料更新不需要磁碟訪問,在記憶體即可完成,速度遠快於b+樹。當資料訪問以寫操作為主,而讀操作則集中在最近寫入的資料上時,使用lsm樹可以極大程度減少磁碟訪問次數,加快訪問速度。

作為儲存結構,b+樹不是關聯式資料庫獨有的,nosql資料庫也可以使用b+樹。同理,關聯式資料庫也可以使用lsm,而且隨著ssd硬碟的日趨成熟及大容量持久儲存的記憶體技術的而出現,相信b+樹這一「古老」的儲存結構會再次煥發青春。

raid(廉價磁碟冗餘陣列)技術主要是為了改善磁碟的訪問延遲,增強磁碟的可用性和容錯能力。目前伺服器級別的計算機都支援插入多塊磁碟(8塊或者更多),通過使用raid技術,實現資料在多塊磁碟上的併發讀寫和資料備份。

常用raid技術有以下幾種,如下圖所示。

假設伺服器有n塊磁碟。

資料在從記憶體緩衝區寫入磁碟時,根據磁碟數量將資料分成n份,這些資料同時併發寫入n塊磁碟,使得資料整體寫入速度是一塊磁碟的n倍。讀取時也一樣,因此raid0具有極快的資料讀寫速度,但是raid0不做資料備份,n塊磁碟中只要有一塊損壞,資料完整性就被破壞,所有磁碟的資料都會損壞。

資料在寫入磁碟時,將乙份資料同時寫入兩塊磁碟,這樣任何一塊磁碟損壞都不會導致資料丟失,插入一塊新磁碟就可以通過複製資料的方式自動修復,具有極高的可靠性。

結合raid0和raid1兩種方案,將所有磁碟平均分成兩份,資料同時在兩份磁碟寫入,相當於raid1,但是在每乙份磁碟裡面的n/2塊磁碟上,利用raid0技術併發讀寫,既提高可靠性又改善效能,不過raid10的磁碟利用率較低,有一半的磁碟用來寫備份資料。

一般情況下,一台伺服器上不會出現同時損壞兩塊磁碟的情況,在只損壞一塊磁碟的情況下,如果能利用其他磁碟的資料恢復損壞磁碟的資料,這樣保證可靠性和效能的同時,磁碟利用率也得到大幅提公升。

在資料寫入磁碟的時候,將資料分成n-1份,併發寫入n-1塊磁碟,並在第n塊磁碟記錄校驗資料,任何一塊磁碟損壞(包括校驗資料磁碟),都可以利用其他n-1塊磁碟的資料修復。

但是在資料修改較多的場景中,修改任何磁碟資料都會導致第n塊磁碟重寫校驗資料,頻繁寫入的後果是第n塊磁碟比其他磁碟容易損壞,需要頻繁更換,所以raid3很少在實踐中使用。

相比raid3,方案raid5被更多的使用。

raid5和raid3很相似,但是校驗資料不是寫入第n塊磁碟,而是螺旋式的寫入所有磁碟中。這樣校驗資料的修改也被平均到所有磁碟上,避免raid3頻繁寫壞一塊磁碟的情況。

如果資料需要很高的可靠性,在出現同時損壞兩塊磁碟的情況下(或者運維管理水平比較落後,壞了一塊磁碟但是遲遲沒有更換,導致又壞了一塊磁碟),仍然需要修復資料,這時候可以使用raid6。

raid6和raid5類似,但是資料只寫入n-2塊磁碟,並螺旋式的在兩塊磁碟中寫入校驗資訊(使用不同演算法生成)。

在相同磁碟數目(n)的情況下,各種raid技術的比較如下表所示。

raid型別

訪問速度

資料可靠性

磁碟利用率

raid0

很快很低

100%

raid1

很慢很高

50%raid10

中等很高

50%raid5

較快較高

(n-1)/n

raid6

較快較(raid5)高

在hdfs中有兩種重要的伺服器角色:namenode(名字服務節點)和datanode(資料儲存節點)。namenode在整個hdfs中只部署乙個例項,提供元資料服務,相當於作業系統中的檔案分配表(fat),管理檔名block的分配,維護整個檔案系統的目錄樹結構。datanode則部署在hdfs集群中其他所有伺服器上,提供真正的資料儲存服務。

和作業系統一樣,hdfs對資料儲存空間的管理以資料塊(block)為單位,只是比作業系統中的資料塊(512位元組)要大得多,預設為64mb。hdfs將datanode上的磁碟空間分成n個這樣的塊,**用程式使用。

應用程式(client)需要寫檔案時,首先訪問namenode,請求分配資料塊,namenode根據管理的datanode伺服器的磁碟空間,按照一定的負載均衡策略,分配若干資料塊供client使用。

當client寫完乙個資料塊時,hdfs會將這個資料塊再複製兩份儲存在其他datanode伺服器上,hdfs預設同乙份資料有三個副本,保證資料可靠性。因此在hdfs中即使datanode伺服器有多塊磁碟,也不需要使用raid進行資料備份,而是在整個集群上進行資料複製,而且系統一旦發現某台伺服器宕機,會自動利用其他機器上的資料將這台伺服器上儲存的資料塊自動再備份乙份,從而獲得更高的資料可靠性。

hdfs配合mapreduce等平行計算框架進行大資料處理時,可以在整個集群上併發讀寫訪問所有的磁碟,無需raid支援。

效能優化 儲存優化

android系統提供4中基本的資料儲存方式,分別是sharedpreference 檔案儲存 sqlite資料庫 contentprovider。sharedpreference sharedpreference是一種簡單便捷的儲存方式,常用來儲存一些簡單配置資訊。儲存路徑 sharedprefe...

效能優化 記憶體優化建議(RAM)

原因 service的執行需要浪費記憶體,而且系統傾向保留這個service從而保留serivce的程序。解決方法 最後使用intentservice代替普通的service,當service不使用了就殺死。情景 當載入乙個bitmap的時候,將bitmap的大小設定為當前螢幕畫素的大小就可以了。原...

React Native 效能優化建議

react native 雖然一直標榜媲美native的體驗,但實際使用下來,其渲染性還是非常低效,基於scrollview和listview兩大容器,在渲染上,相當於web端的table布局,需要等整個大table渲染完成才顯示頁面,也就是說,當容器內有大量的子元素,其白屏時間會非常長。如何讓re...