閃存存儲目前越來越多的應用于企業級環境,特别是提升資料庫性能方面。本次分享主要介紹閃存的特性,閃存的劣勢及其解決機制,以及采用閃存存儲時資料庫的一些優化思路。
目錄
閃存的特性
閃存的劣勢及其解決機制
資料庫場景測試
一.閃存的特性
凡是采用flash memory的儲存設備,可以統稱為閃存存儲。我們經常談的固态硬碟(ssd),可以由volatile/non-volatile memory構成,其實固态硬碟的範疇是大于閃存的,隻是目前的固态硬碟大多數采用閃存媒體,是以很多時候我們預設固态硬碟就是閃存盤。
除了閃存以外,還有其它多種快速存儲技術,如dram ,nvram, mram and spin-torque(自旋力矩磁阻式随機存取記憶體), carbon nanotube( 碳納米管 ), phase change memory(相變記憶體),memristor ( 憶阻器 )等等。
未來儲存設備的創新其實就是存儲材料的創新,這也是國外很多初創的半導體公司一個研發的方向。
從半導體的角度來看,閃存屬于非易失性存儲,但是屬于不可靠媒體。因為閃存是采用電子驅動,是以具有電子元器件所固有的缺陷,電子洩露,衰減等等。
決定閃存存儲大規模應用的主要因素是量産規模、穩定性以及經濟性。
閃存裝置随着使用時間和資料量的增長,壞塊會逐漸增加,會産生大量的ecc error,這時裝置性能和可靠性會大幅度下降,對應用性能和資料安全帶來影響。閃存産品在使用過程中往往會存在性能衰減和可靠性下降的問題。這裡提醒一下,如果我們使用閃存産品,一定要使用工具監控閃存産品的健康狀态,防止老化,資料丢失。
通過對閃存産品的良好設計和品質控制,也可以避免性能衰減和可靠性下降的問題,但是往往會帶來成本的增加和性能的下降(相比于直寫閃存)。
對于企業級應用而言,穩定是第一位,其次是易用性,第三才是性能。閃存裝置的性能相比于應用的需要是足夠的。
閃存在企業級以及資料中心的應用,實際上也是依賴于網際網路以及大資料的興起。
網際網路的分布式架構以及多副本保護機制,消除了集中式存儲的瓶頸,滿足了海量使用者以及應用的請求,帶來了更高的性能需求。同時多副本的保護機制,又解決了閃存作為不可靠媒體可能帶來的資料存儲安全的問題。
但是由于閃存的可靠性問題,其實網際網路客戶也是有選擇地在特定業務上使用閃存,并不是在所有業務上都使用閃存裝置。
有的時候我們還會發現意外斷電後,閃存裝置故障,這往往是由于電路保護機制不完善或固件bug造成的。
二. 閃存的劣勢及其解決機制
在使用閃存裝置的時候,我們需要考慮的問題要比使用磁盤多。
目前我們碰到的很多問題是,相比于iops,閃存比磁盤性能高上幾十甚至上百倍,但是我們将資料放置到閃存上,性能提升并沒有這麼高,甚至沒有提高。
原因是閃存主要解決的是io性能問題,并且主要随機寫的性能,而順序讀寫性能并不如多塊磁盤彙聚之後的性能。
linux檔案系統
以linux為例,linux ext4屬于日志型檔案系統,為了保護資料安全,通過journal機制提供一緻性保護。那麼我們在部署過程中可以将journal日志放置到閃存上,可以提升io性能。因為應用的io操作還是通過os層面完成的,是以os層面的io性能提升也可以帶來應用性能提升。
另外,作業系統以及應用的io層往往是針對磁盤的特性進行了優化,這些優化往往不适用于閃存裝置,甚至還有副作用。例如os層面io scheduler有三種模式,cfq、deadline和noop,其中前兩種模式是針對磁盤低io特性和實體尋道機制進行優化的,例如做io合并、尋道算法等等,會有預設的等待嚴實以等到更多的io block進行合并和處理。對于閃存而言,是不存在尋道處理的,是以前兩種處理機制反而會造成延時增加。如果我們在系統中使用了ssd,需要将io scheduler調整為noop模式。
三. 資料庫場景測試
剛才談到為了保證資料安全,我們需要在linux采用journal模式,但是mysql也有double write的機制,我們需要怎麼既保證資料安全,又不會增加過多的機制造成性能下降。我們在我們的閃存産品上做了這方面的測試。
上面是mysql的寫入機制。當系統意外斷電時,資料庫16k的頁面可能沒有完成,就會出現partial write,而partial write會造成資料庫損壞。
mysql 的double write就是為了解決partial write造成的問題,但是dw也會帶來兩個問題,性能懲罰和對ssd的磨損增加。
我們按照上面的場景在我們的閃存卡上進行了測試。
在安全性層面,隻要metadata journal+dw或metadata journal+data journal,都可以保護資料庫資料的安全,也就是意外掉電資料不會損壞,資料庫可以正常啟動,資料不丢失。
但是在cpu bound的情況下,前個組合的性能衰減(8%)要小于後面的保護組合(10%)。如果是在io bound的情況下,前個組合的性能衰減(10%)要小于後面的保護組合(34%)。但是dw下的資料寫入量會比後者增加23%,也就是會增加ssd的磨損。這個是我們在應用時需要注意的。
另外,我們在做db2的測試時也發現幾個問題:
閃存存儲在非分區表的簡單的查詢統計條件的查詢方面具有明顯的優勢和性能提升,性能提升3到4倍,但是在分區表的統計和加限制條件的查詢方面的性能提升并不明顯。而且對相應的複雜的存儲過程的統計計算未能展現出優勢。這可能是由于分區表設計機制主要是面向磁盤性能優化,在閃存上反而有負面影響。
另外我們在oracle資料庫上應用閃存測試時發現,帶子查詢的多表關聯查詢語句的存儲過程的調用性能表現很差,檢視awr發現大量的cache latch,出現長時間等待, 而在磁盤存儲上沒有這種情況。我們分析是由于閃存的性能比磁盤高很多,造成cursor資料量大,緩存内的latch沖突增加。通過增大share pool和将複雜查詢處理簡化為多個小查詢處理可以解決這個問題,性能也得到明顯提升。
q & a
q1 : 請問閃存和磁盤的比較中mtbf是什麼意思?
a1:mtbf(mean time before failure),失敗前平均工作時間。閃存其實是沒有mtbf的概念的,因為閃存有擦寫次數的限制,資料擦寫到一定數量後,閃存媒體就會實體性地損壞,閃存的壽命是可以通過監控使用狀況推算出來的。而磁盤的損壞其實是機率,會有mtbf名額。
q2 : 請問在測試db2的時候,是dpf環境,還是單機?
a2:單機。
q3:mysql是基于xfs測試的嗎?
a3:mysql測試時是基于ext4的。
q4:閃存産品有沒有不同的系列,類似傳統的高中低端存儲那樣的分類?
a4:閃存也分高中低的,用于企業級高性能的一般以pcie nvme卡的形式為主。其實閃存産品的品質标準還有很多細分,這裡就不細說了。
q5:請問能談談spacex用的閃存産品嗎?
a5:spacex用的是我們嵌入式閃存産品,和我們企業級閃存采用同樣的技術架構和閃存顆粒。主要用于控制代碼存儲和運作狀态資料存儲。
q6:請問您有測過雲主機的ssd 嗎?
a6 : 雲主機的ssd基本上都采用sata ssd,目前雲計算平台在資料庫應用方面還是個弱項。我們下一步計劃在ceph分布式存儲上進行資料庫測試,這也是嘗試在雲計算平台上運作關鍵資料庫應用。
q7:寫放大,和抖動的問題現在已經改善了很多吧?
a7 :寫放大和抖動問題是考驗閃存廠商的一個關鍵名額,在産品設計的時候就要考慮。各家處理的方式都不一樣。我們能做到最大的waf是6。而在性能抖動方面自認為處理最好的是我們的産品,因為性能抖動主要是由垃圾回收處理和磨損平衡處理引起的。而我們采用的分區擦除算法和三重磨損平衡算法是完全基于對閃存顆粒底層的特性了解和經驗積累。另外ssd還有一個很大的問題是性能衰減。使用1,2年後,性能可能隻有原來的一半或者更低,性能波動也會頻繁出現。
講師介紹:李炫輝
現任綠芯半導體系統科技(上海)有限公司業務發展副總裁,負責閃存解決方案的市場推廣和管理。
從事資訊化工作二十多年,先後在戴爾公司以及惠普公司負責企業級解決方案和存儲産品管理及銷售工作。
曾任戴爾中國區解決方案部進階技術經理,負責戴爾企業級解決方案架構設計,管理和實施, 先後負責dell網際網路行業客戶以及能源金融制造業伺服器、存儲和網絡解決方案。
<b></b>
<b>本文來自雲栖社群合作夥伴"dbaplus",原文釋出時間:2016-01-18</b>