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




























