這個問題來源於我書中引用的一幅圖:cors
咱們從圖中明顯能夠看某性能測試的結果代表普通機械磁盤的順序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指代的是什麼。這是第一個問題。blog
第二個問題就在於沒有分開討論讀和寫。不少磁盤的讀寫TPS差別很大,特別是對於隨機I/O來講,不一樣塊大小(block size)的隨機IO相差巨大。這張圖裏面只是籠統地給出了磁盤的順序I/O和隨機I/O性能,沒有顯式區分出讀寫來。這是第二個問題。內存
第三個問題就在於圖中的數值與咱們平時的印象是矛盾的。通常狀況下,咱們會認爲內存的TPS應該是很高的。即便是隨機I/O也不該該比磁盤的要差,但這張圖清晰地代表它真的就是差。特別是今天有人拿實際的測試結果反駁了圖中的結論。下面咱們着重探討一下第三個問題。ci
首先是實際測試數據:內存使用的是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_reviewrsa
那麼如今若是用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訪問性能的。