如何快速debug定位SSD延遲問題?

一塊固態硬碟設計背後,有硬體控制器,NAND快閃記憶體顆粒、DRAM,還有韌體FTL演算法等。SSD設計的本身其實是一件特別複雜的過程,需要考慮各種客戶需求且要保證可靠性、效能、穩定性。

如何快速debug定位SSD延遲問題?

針對SSD的相關效能測試,SNIA也有專門針對SSD相關測試SPEC,同時各個SSD廠商也有很多獨有的測試用例(

一家SSD廠商的測試用例很多也是靠多年的填坑積累完善的

)。現在看似SSD行業門檻很低,隨便買個主控、NAND/DRAM顆粒就可以組裝了(

的確市場上有魚龍混雜,有投機倒把之輩

)。但是,

如果真心要做出一款效能穩定的SSD,不但需要強大的技術實力,更需要豐富的經驗積累。

如何快速debug定位SSD延遲問題?

SSD出廠之前經過了嚴格的測試,到了使用者手裡,是不是就不會有延遲問題呢?答案是否定的。比如下面一幅圖就是業內最經典案例,4KB隨機寫最開始效能會很高,因為SSD內部還沒啟動GC,當SSD隨機預測完全後,此時4KB隨機寫才是穩態的效能。很多客戶在拿到SSD後測試的資料和經過一段時間測試後的會出現明顯的差異,在不瞭解SSD隨機預熱穩態的機理時,就會出現很多誤解。使用者使用方式,對延遲問題的定義也會有存在很大的差異。經常會出現一種情況:“

IO延遲,在某些場景,是一種不是問題的問題

!”

如何快速debug定位SSD延遲問題?

不同的客戶的業務場景,千差萬別,SSD的設計也不無法100%兼顧所有複雜的IO負載型別。

出現延遲問題並不可怕,可怕的是無從入手,不能快速debug定位延遲的來源

IO延遲定位前,我們先了解下Windows和Linux核心中的IO堆疊,簡單理解IO的產生、流動過程、最終目的地。

第一圖:Windows環境中IO堆疊

如何快速debug定位SSD延遲問題?

第二圖:Linux環境中IO堆疊

如何快速debug定位SSD延遲問題?

從上面的IO堆疊示意圖來看:

Windows和Linux IO堆疊的基本邏輯是一致的

IO在軟體層產生,經過檔案系統、核心模組、驅動層,最終達到硬體儲存裝置SSD。

IO延遲通常是應用客戶先感知到,使用者也是從最上層感知,但是經過這麼層的路徑,最終的延遲來源是在哪一層?這個並不能很清晰的展示,這也導致很多場景下,SSD也成為了背鍋俠,不管什麼原因導致的IO異常,首先都會被先扣在SSD頭上。所以,

快速IO定界也是幫助SSD解放“背鍋”壓力的有效辦法

目前用於IO延遲定界場景的軟體,也有多種:

在Windows場景下:開源的工具有perfmon,以及SNIA SSSI Workload I/O Capture Program (WIOCP) 推薦的hiomon,可以記錄隨機讀寫、順序讀寫的延遲、佇列深度QD,IO延遲統計等。

如何快速debug定位SSD延遲問題?

如何快速debug定位SSD延遲問題?

Linux場景下,常用的經典開源工具也有blktrace,可以記錄從IO產生,到最終返回的時間,跟IO分析工具iostat的延遲來源保持一致,與iostat一起搭配定位延遲問題最為合適。

在硬體定位過程中,I2D代表進入核心IO workqueue佇列到傳送給硬體的時間。D2C代表驅動IO下發到硬體完成IO返回的時間。

如何快速debug定位SSD延遲問題?

如何快速debug定位SSD延遲問題?

除了上面基礎的開源IO分析工具,目前第三方也有專業的商用軟體,比如Calypso的IOProfiler、Teledyne Lecroy的WorkloadIntelligence。

如何快速debug定位SSD延遲問題?

IO延遲定界過程中,如果定位延遲來源於硬體,此時,

SSD的延遲記錄能力也是至關重要

。市場上目前只有少數的廠商在資料中心客戶的強烈的需求下,有延遲定位功能。大部分SSD廠商還沒這個功能。不過,

隨著OCP也開始關注SSD延遲定位能力,相信後續會有更多的場景加入這個功能

如何快速debug定位SSD延遲問題?

在擁有Latency Monitoring功能的SSD上,可以清楚知道,在上層使用者看到延遲抖動的時候,SSD內部硬體延遲的真實分佈,可以快速確定延遲是不是來自於硬體,讓資料中心和SSD供應商都可以更加清楚業務的行為與SSD硬體的適配情況。

如何快速debug定位SSD延遲問題?

以下幾個是IO異常的案例,供大家參考:

案例1: 業務模型與延遲的關係

延遲升高的時候,佇列深度和程序數也在相應地增加。這種情況多數是跟業務的使用方式有關。

如何快速debug定位SSD延遲問題?

案例2:Trim對延遲的影響

讀延遲的升高的時間段,正好看到系統有Discard/Trim的操作。Trim操作會給讀延遲帶來極大的影響。雖然Trim可以提升隨機效能(

擴充套件閱讀:

SSD寫放大的最佳化策略要統一標準了嗎?),建議使用者執行Trim要在業務低谷觸發,不然上層會看到非常明顯的延遲抖動。

如何快速debug定位SSD延遲問題?

案例3:CPU core與延遲的關係

CPU所有core中只有少數core或者個別core出現IO繁忙的情況,導致IO集中,延遲升高。這個就需要從系統角度最佳化IO使用模式。

如何快速debug定位SSD延遲問題?

案例4: 同一負載下,不同SSD表現也有明顯差異

A/B/C/D/E/F:6個盤是消費級NVME SSD,容量在480GB-512GB

G/H/I:3個盤是企業級NVME SSD,容量在960GB-1000GB

如何快速debug定位SSD延遲問題?

同一個負載下,企業級SSD G表現最差,消費級SSD E表現相對穩定,可以媲美企業級SSD。通常情況下,企業級SSD相對消費級SSD做了很多IO的最佳化。

如何快速debug定位SSD延遲問題?

結語

IO延遲分析是一項複雜而有趣的工程,需要帶著好奇深挖每一個資訊,總會有不同的風景

。如果你有不同的經驗分享,歡迎留言交流~