SCSI軟件層如何對性能造成影響
對于閃存存儲而言,一切都發生了變化,SSD的性能無論是帶寬還是IOPS都非常高,因此,存儲的性能瓶頸點從Disk端轉移到了CPU、OS以及網絡端。
在閃存存儲領域,我們可以看到無論在市場、客戶還是在研發,大家都在支持NVMe標準,其很重要的一個原因是傳統的SCSI已經不能滿足性能需求,其變成了存儲系統的一個重要性能瓶頸點。從軟件層、傳輸協議效率、軟件接口標準、芯片接口、傳輸鏈路,傳統的SAS/SATA都存在很多不足的地方。今天存儲老吳和大家一起分享一下SAS/SATA接口在軟件層面的重要性能瓶頸點,從研發的角度來解釋為什么SCSI軟件層是一個重要的性能瓶頸點。
大家都比較清楚SCSI軟件層的組織結構,其主要由三大部分組成:
1, SCSI上層驅動層。這層驅動主要完成SCSI設備的功能,例如磁盤的驅動、Tape的驅動,CD-ROM的驅動都在這層實現。對于磁盤驅動,通常也被稱之為SD驅動,實現了一個塊設備功能。對上接入塊設備驅動層;對下和SCSI中間層對接。
2, SCSI中間層。中間層軟件主要完成SCSI命令的處理、出錯處理、超時處理等。中間層的上面是各個SCSI的功能驅動;下面是SCSI的底層驅動。
3, SCSI底層驅動。底層驅動實現了SCSI的數據傳輸和HBA的驅動。在底層可以實現ISCSI的發送器;可以模擬一個SCSI的HBA;當然也可以實現LSI的HBA驅動程序,并通過DMA的方式將數據提交給實際的硬件板卡。
在傳統磁盤存儲中,性能瓶頸點在磁盤端。CPU處理器、NUMA體系架構、軟件的并發性對存儲的性能影響幾乎為零。存儲老吳在07年研發Thin Provisioning邏輯卷系統的時候,試圖通過優化鎖資源競爭來提升IO性能,結果是預料之中的徒勞。對于磁盤存儲來說,CPU性能一直是搓搓有余的。一個磁盤的IOPS最多只能跑到200,所以中斷對CPU來說也毫無壓力,在這種情況下,SCSI軟件層無論如何實現對性能基本是沒有影響的。所以,磁盤存儲是一個實實在在的IO Intensive應用。
但是,對于閃存存儲而言,一切都發生了變化,SSD的性能無論是帶寬還是IOPS都非常高,因此,存儲的性能瓶頸點從Disk端轉移到了CPU、OS以及網絡端。在這種情況下,我們再來看一看SCSI的軟件棧。如下圖所示,每個SCSI設備只提供了一個請求隊列(request queue),那么無論系統中存在多少個處理線程,無論系統中存在多少個CPU核,所有的請求都會以競爭的方式入隊列。SCSI設備的請求隊列是系統的一個競爭資源。
對于SMP系統而言,競爭資源的處理都需要通過加鎖的方式來實現訪問。在Linux的實現中通過Spinlock的方式對請求隊列進行互斥保護。由于SSD性能非常高,所以系統中的CPU都在忙于請求的處理,這些忙碌的CPU最終都需要去競爭請求隊列鎖,將請求放入隊列。這種大量的競爭導致每個CPU的處理效率大為降低,大量時間處于自旋狀態,等待獲取請求隊列鎖。從而使得整體IO處理的效率降低,存儲性能由于軟件上的限制而得不到提升。
針對這個問題,我們做過實際的測試,發現當IO壓力上來之后,系統中的CPU絕大部分時間都處于自旋狀態,都在競爭請求隊列的自旋鎖。所以,SCSI層的單請求隊列是一個嚴重的性能瓶頸點。
為了解決這個問題,Linux對SCSI的單隊列做了改進,引入了Multi-queue的方式。通過多隊列的方式可以減少、避免線程/CPU之間的競爭,可以充分發揮單個CPU處理IO的效率,從而整體提升IO處理的性能。SCSI引入多隊列之后的示意圖如下圖所示:
需要注意的是,在軟件上為每個SCSI設備引入多隊列之后,同樣需要在HBA端為軟件訪問提供多隊列支持,否則性能將會局限在HBA卡上。閃存存儲軟件的設計與實現和傳統存儲相比,不僅數據分布、數據的組織形式發生了變化;而且軟件的實現效率、CPU并發潛能的挖掘、計算機體系結構的考慮都會變得尤其重要。所以,我一直認為,閃存存儲不僅玩的是存儲技術,而是高性能計算技術。