這個問題來源於我書中引用的一幅圖:
我們從圖中明顯可以看某性能測試的結果表明普通機械磁盤的順序I/O性能指標是53.2M values/s,SSD的順序I/O性能指標是42.2M values/s,而內存的隨機I/O性能指標是36.7M values/s。雖然圖中沒有給出values的具體含義,但既然使用了相同的單位,應該是它們是可以比較的。由此似乎可以得出結論:磁盤的順序I/O性能要強於內存的隨機I/O性能。
當初引入這幅圖的主要目的是想說明Kafka順序訪問磁盤(特別是順序寫入)的性能並不像想象中的那么差。現在看來,這幅圖還是有一些問題的,里面具體的數值也值得推敲。
第一就是單位不明確。一般這種測試常見的統計單位應該是MB/s,即磁盤或內存的吞吐量(TPS)或帶寬(Bandwidth),但如果這里的values指的就是MB,顯然數值又太小了,所以我目前搞不清楚這個values指代的是什么。這是第一個問題。
第二個問題就在於沒有分開討論讀和寫。很多磁盤的讀寫TPS差異很大,特別是對於隨機I/O來說,不同塊大小(block size)的隨機IO相差巨大。這張圖里面只是籠統地給出了磁盤的順序I/O和隨機I/O性能,沒有顯式區分出讀寫來。這是第二個問題。
第三個問題就在於圖中的數值與我們平時的印象是矛盾的。一般情況下,我們會認為內存的TPS應該是很高的。即使是隨機I/O也不應該比磁盤的要差,但這張圖清晰地表明它真的就是差。特別是今天有人拿實際的測試結果反駁了圖中的結論。下面我們着重探討一下第三個問題。
首先是實際測試數據:內存使用的是DDR3的三星內存,TPS測試結果為2500MB/s,但沒有說清楚是讀TPS還是寫TPS,也沒有提及使用的chunk大小是多少,更沒有說是隨機IO訪問還是順序IO訪問。不過我們姑且認為是隨機IO吧,畢竟我們要PK的就是內存的隨機IO。磁盤這邊使用的是SSD,經測試最大的順序讀寫IO大約是63MB/s,同樣沒有說到底是讀IO還是寫IO。測試結果說明SSD磁盤順序IO TPS遠遜於內存IO TPS。那么到底哪個是對的呢?為什么圖中顯示磁盤順序IO是能勝過內存隨機IO的呢?
針對這個矛盾之處,我個人的看法是這里面存在着田忌賽馬的情形,也就是說圖中用於比較的SSD和內存應該不是同一個等級的,有可能找了一個很好的SSD去與一個普通的內存條進行比較。拿上面實際的例子而言DDR3的三星內存TPS為2500MB/s,但這不算什么太好的成績。還存在很多更好的內存產品遠不止2500MB/s的吞吐量,比如Corsair Vengeance DDR3宣稱能夠達到5000+MB/s的隨機IO TPS(它是以2MB chunk做的測試)。具體的數據來源詳見:https://www.storagereview.com/corsair_vengeance_ddr3_ram_disk_review
至於SSD,順序IO TPS超過2500MB/s的也有,比如這款基於MLC的Micron P420m SSD就宣稱其順序IO TPS能到3300MB/s。具體的數據來源詳見:https://www.storagereview.com/micron_p420m_enterprise_pcie_ssd_review
那么現在如果用Micron P420m SSD和上面的三星內存比,其順序IO的TPS就超過內存的隨機IO TPS。這樣看來,這不就是田忌賽馬嗎?用一個非常好的磁盤去PK一個普通的內存,結果就很可能是圖中的那個樣子。所以,個人認為不用太糾結圖中的數據,只需要了解磁盤順序讀寫性能很好或至少不差這個事實就好了:)
另外我感覺這張圖還有其他不太合理的地方,比如對於SSD而言,順序IO性能幾乎是隨機IO的40倍。的確,隨機IO是要慢於順序IO的,特別是對於寫入而言,但在SSD中這不總是成立的。
如果IO size很小或者說寫入數據很小(比如小於32MB),隨機寫入自然是要慢於順序寫入;但當IO size增加到某個程度后(比如和clustered block一樣大或是其整數倍),那么隨機寫和順序寫的表現是差不多的,因為不再需要做過多的拷貝擦除,而且SSD內部的並行機制會開始逐漸起作用,抵消隨機寫和順序寫之間的差異。從這個角度來說,我覺得圖中的兩組數值對比過於懸殊了,似乎也有不真實的地方。
總之,我對這張圖的結論是圖中的數字是有一些水分的,至少沒有給出完整的測試說明,缺乏必要的事實基礎,但圖要呈現的結論依然是成立的,即在某種程度下,磁盤順序I/O訪問(特別是寫操作)是能夠匹敵內存的隨機I/O訪問性能的。