為什么要使用spdk?
主要原因就是:nvme已經快到一定程度了,很多東西,尤其是軟件已經趕不上他了,此時軟件反而成為了系統IO的瓶頸。
假如將24塊每秒傳輸幾個G的硬盤放在一起,也就是說這時的問題也就是放大了24倍。
對於一個8通道的內存而言,理論帶寬就是200GB/s,實際應用中也就是能達到100~150GB/S。
在24塊nvme硬盤組成的磁盤陣列中,它的理論速度也能達到100GB/S
而這些都是理論數據,在實際應用中都是不可能達到的。我們在實際的讀寫中,光是用來搬運來來往往的數據,就要占用到內存帶寬的一半,這就太沒有道理了。就算是Linux kernel,這么多的數據處理起來也會很有困難。
一般來說讀寫數據的運作方式是這樣的:OS kernel請求一組數據,硬盤回應“嗯,沒問題”,但是NAND閃存挺慢的,所以需要一點時間,將數據載入到硬盤的緩存中,准備好了就會告訴OS kernel。假設現在已經准備好了,就會給CPU發送一個中斷信號,“嘿,數據已經准備好了,沒問題了,可以來取那組數據了”。但是在這里會遇到一個問題:如果這個中斷信號在去到目標CPU核心的過程中,CPU核心正在忙着處理其他事情,或者暫時處於睡眠狀態,或者被重新分配到其他任務上的話(這種情況在多核心CPU中是很常見的),如果有以上情況發生的話,那么這個中斷信號永遠到不了,那么CPU永遠不會去取那組數據。這樣的結果就導致整個系統的讀取調用過程截然而止。也就是說當CPU在執行大量的計算任務時或者很繁忙的時候,那么讀寫任務可能受到嚴重的影響。
也就是說,使用nvme磁盤的系統,在CPU高負載的情況下可能會出現問題。
對此業界給出了一個解決方案,對於超高速設備(比如這里的nvme磁盤,基於RAM的緩存盤)以一種叫做“輪詢”的模式運作。這是一種完全不同的模式。說人話就是:系統內核假定設備非常快,快到“不用問准備好了沒,問就是准備好了”。(設備速度很快,馬上就可以把數據准備好)。
當然如果在比較慢的硬盤(比如機械硬盤)上這么搞會帶來很大的性能損耗。因為系統會不停的問“嘿,准備好了嗎?嘿,准備好了嗎?”,這樣一來,IO時延變高了,同時讀寫帶寬也會受影響。但是對於nvme盤,特別是前面提到的超快速的存儲設備,這么做是值得的。
而spdk的存在就是提供一種以輪詢的方式來訪問硬盤的方式,在高速設備上用於取代中斷的訪問方式。
但是如果是在小IO密集的場景下,是否還會有這么明顯的提升空間呢?
參考鏈接:
https://software.intel.com/en-us/articles/accelerating-your-nvme-drives-with-spdk