第7期:硬碟的性能特徵
我們都知道內存比硬碟要快得多,大概能快出一兩個數量級(價格也要貴這麼多)。不過,硬碟的問題並不只是訪問速度慢。
硬碟不適合做頻繁小量訪問
所謂頻繁小量訪問,是指運算過程中每次獲取的數據量很小,而讀取的次數很多。對於內存,每次取10位元組、取1000萬次、總共訪問1億位元組;和每次取1000萬欄位、取10次、也訪問1億位元組;這兩者耗時是差不多的。內存訪問數據的最小單位就是位元組,無論怎麼做,最後涉及到的位元組數是一樣的。
但硬碟的機制完全不同,在硬碟中數據是按扇區存放的,數據訪問的最小單位是扇區(一般是512位元組),也就是說從硬碟上讀1個位元組和讀512位元組的時間幾乎一樣的(內存複製時間相對於硬碟時間忽略不計了)。這樣,每次取10位元組取1000萬次,和每次取1000萬位元組取10次,訪問量一樣,但耗時就可能會有巨大的差異,前者可能會多取很多無用的數據。
實際情況還要更惡劣一些,我們常常直接使用操作系統中的文件存儲數據,而大部分文件系統的讀取單位是簇,預設大小一般是4K,比512位元組要大8倍。而且,讀取硬碟是一個複雜的動作,不象內存那樣執行一條CPU指令就可以讀取,訪問硬碟需要一系列的動作來啟動硬碟控制器並確定讀取位置,讀取1000萬次就要執行1000萬次這樣的動作,當然一次讀1000萬位元組時也會涉及較多次的磁碟動作(1000萬位元組會在很多扇區中),但總次數仍然會少得多,批量不頻繁讀取的性能就會遠遠好於頻繁小量讀取。
不連續的隨機訪問是罪魁
不過,我們在上述結論中用了「可能」二字,而沒有用肯定的語氣,這是因為還要考慮數據存儲是否連續。如果要訪問的數據在硬碟上是連續存儲的,那取1000萬次10位元組也不會很慢,因為後面的10位元組已經在前面讀出的扇區裡面而不必再讀,硬碟控制器以及操作系統都有緩存功能,實際硬碟讀取次數並沒有那麼多,結果的性能相差也不會非常大。所以我們還要在"頻繁小量"前面加上「隨機」這個定語,也就是讀取的內容不連續,這時候,前面讀出的扇區取出需要的部分外,其它內容和後面要訪問的數據沒有關係,只能浪費掉,而且後面再訪問又要再次讀,」可能「就會變成」肯定「了。
對於目前仍在大量採用的機械硬碟,隨機訪問還存在磁頭跳動問題,也就是硬碟指標中的平均尋道時間。尋道是個非常慢的機械動作,比讀一個扇區要慢得多得多。這樣,即使每次讀出扇區(簇)都沒有任何浪費,在隨機訪問時的尋道成本卻可能超過讀取本身。使用機械硬碟時要特別注意避免隨機頻繁小時訪問。
固態硬碟的情況要好一些,它沒有尋道的機械動作了,這樣在隨機讀取時也沒有尋道時間問題。不過,儘管固態硬碟並不是按扇區形式存儲數據,操作系統仍將它模擬得和機械硬碟類似,必須按某個基本單位(簇)讀寫,這樣,隨機的頻繁小量(小於簇)訪問g還是會有前述的低效問題。對於許多需要隨機訪問小量數據的運算,簇(扇區)這個單位太大了。
並行和並發導致隨機訪問
那麼,對於只需要連續批量訪問的運算(比如遍歷匯總或查找),使用硬碟時的性能是否就只是其本身訪問速度決定的呢?
對於單線程或單任務的運算基本上是這樣。但現在研究高性能計算時顯然不可能不考慮並行運算,而且許多運算服務也需要支持多並發。並行和並發運算會使原本可以連續訪問的硬碟數據一定程度變成隨機訪問,原因很簡單:多線程實際上在共享同一套硬碟,不同線程的訪問請求顯然不會連續,硬碟要同時響應這些請求就會發生跳動,也就是隨機訪問了。
對於機械硬碟這個後果常常很嚴重,如果線程之間切換頻繁,就會導致頻繁的尋道動作,結果就會發生多線程反而比單線程慢的現象。而有些單任務時性能尚可的場景,一旦並發了性能就會急劇下降。一個補救的辦法是加大讀數據的緩衝區,每個線程每次讀出的數據足夠多且連續,這樣能使尋道時間佔比變小而感覺不明顯。但同時也會加劇內存佔用,線程越多對內存需求越大。固態硬碟就好得多,緩衝區達到簇(扇區)的規模就可了。
有點類似的場景是列式存儲,數據是按列連續存放的,需要多列計算時,即使單線程也會發生硬碟隨機訪問現象,涉及列較多時就未必會比行存有優勢,多線程還會進一步加劇這個問題。在機械硬碟上用列存時要特殊注意這個問題,不一定總能提高性能。
外存運算需要採用不同的演算法
由於硬碟的這些特徵,有些運算從內存換到外存時會採用完全不同的方法,性能下降的程度也不是簡單按比例做乘法。
比較典型的是JOIN運算,對於外鍵式1:N的JOIN,如果數據全部在內存中,可以使用針對外鍵維表主鍵做HASH索引,遍歷事實表時用索引直接可以找到維表的相應記錄,事實表有多個外鍵指向不同維表時也只要遍歷一次就可以全解析。但如果維表過大而不能裝入內存時就不能採用同樣的演算法了,因為硬碟無法支持隨機頻繁小量的訪問,而訪問維表記錄恰恰是這種運算,強行使用這種方案的性能會惡劣到還不如把數據先排序再來歸併的地步。外存大表JOIN時要按鍵值(的HASH值)分段,每段都足夠小可以裝入內存做JOIN,這種方法一次只能解析掉一個關聯,事實表指向多個外鍵大維表時就要做多輪解析,運算量比內存JOIN大得多。
單機內存不足時還可以利用集群來避免複雜的外存運算。網路本身的延遲和硬碟差不多,通過網路獲取集群機的內存數據時,單位數據量的訪問性能不會比硬碟好多少,但卻可以利用內存的隨機訪問能力和並發能力。不過網路和硬碟類似,每次啟動一個網路連接的消耗較大,也不合適頻繁小量的訪問,要把多次獲取數據的請求和返回結果積累起來一起傳輸。用這種方法做大維表JOIN,比內存計算麻煩,但比外存運算還是簡單很多,仍然可以一次性解析掉多個關聯。
正文結束
蔣步星,清華大學計算機碩士,著有《非線性報表模型原理》等
1989年中國國際奧林匹克數學競賽團體冠軍成員,個人金牌。
2000年創立潤乾公司,首次在潤乾報表中提出非線性報表模型,完美解決了中國式複雜報表製表難題,目前該模型已經成為報錶行業的標準。
2008年開始研發不依賴關係型數據的計算引擎,歷經多個版本後,於2014年集算器正式發布。有效地提高了複雜結構化大數據計算的開發速度和運算效率。
2016年榮獲中國電子信息產業發展研究院評選的「2016年中國軟體和信息服務業 ? 十大領軍人物」。
2017年將帶領潤乾軟體朝著擁有自主產權的非關係型強計算數據倉庫、雲資料庫等產品邁進。


※北京+永洪科技+UI設計工程師、項目經理,實施和售前工程師+8-30k
※手把手教你用Django搭建博客(五)
※手把手教你用Django搭建博客(三)
TAG:天善智能 |
※三星970系列固態硬碟跑分:消費級高性能產品
※英特爾混合硬碟到來:性能容量全都有!
※英特爾的驕傲:全球首個QLC固態硬碟660p測試
※價格不變性能升級:對比兩塊東芝TR200固態硬碟的新發現
※貓盤Plus智能硬碟盒上架小米有品:399元
※更強的穩定性和壽命!三星860EVO固態硬碟評測
※英特爾終於被補丁拖垮:硬碟性能大幅落後AMD
※假期裝機固態SSD硬碟首選:性價比之王,東芝TR200系列
※同樣的M.2硬碟:不同位置安裝性能差出一大截!
※7毫米世界最薄!這款2TB硬碟真神了 還特便宜
※英特爾QLC快閃記憶體硬碟660P曝光:起步512GB,性能有驚喜
※機械硬碟撲街 更大容量的三星860QVO固態硬碟性能曝光
※SSD性能派:固態硬碟跑分一時爽,一直跑一直爽!
※魅藍6T僅一塊硬碟的價格還配備了雙攝 網友:真的是百元手機?
※英特爾固態硬碟760p 512GB評測:三星850的價格960的性能,賺了!
※歷史的模樣第三期:1956年5MB IBM 硬碟原來這麼大!
※移動硬碟也升級:體積縮小一圈,性能狂翻一倍!
※山寨固態硬碟的5個特點 全中的可以扔了
※固態硬碟進階知識:壽命篇:(五)600TB級寫入測試
※再等等 2018年固態硬碟走勢是這樣的