提升磁盤IO性能的幾個技巧
目前磁盤都是機械方式運作的,主要體現在磁盤讀寫前尋找磁道的過程。磁盤自帶的讀寫緩存大小,對于磁盤讀寫速度至關重要。讀寫速度快的磁盤,通常都帶有較大的讀寫緩存。磁盤的尋道過程是機械方式,決定了其隨機讀寫速度將明顯低于順序讀寫。在我們做系統設計和實現時,需要考慮到磁盤的這一特性。
FastDFS是一個開源的高效分布式文件系統,它最初的實現,文件是按hash方式隨機分布到多個目錄中的,后來增加了順序存放的做法。通過對比測試,發現文件按目錄順序存儲,寫文件IO效率明顯高于按目錄隨機存儲。
目前磁盤順序讀取的速度并不差,比如普通硬盤的IO可以達到每秒40~60MB,好一些的硬盤可以達到每秒100MB左右。在多進程或多線程并發讀取磁盤的情況下,隨著并發數的增加,磁盤IO效率將大大下降。主要是因為每次讀寫,磁道可能存在較大的偏移,磁道尋址時間加大,導致磁盤IO性能急劇下降。對于這種場景,優化方案是盡可能減少并發讀寫的進程數或線程數。可以用鎖的機制,也可以采用專門的磁盤IO線程來對磁盤進行讀寫。FastDFS 2.x版本,磁盤讀寫就采用了專門的線程來完成。
為了充分發揮多塊磁盤的效率,不建議使用傳統的RAID方式。比較好的做法是每塊磁盤單獨mount,通過程序來控制對多塊磁盤進行并發讀寫。采用單盤mount,文件的備份和冗余可以通過多臺機器實現。
文件數多了之后,比如達到上千萬個文件,當隨機訪問眾多文件時,文件系統的性能會急劇下降。業界流行的做法是將多個小文件合并存儲到一個大文件中的方式來降低文件數。FastDFS 3.0支持將多個小文件合并存儲到一個較大文件中,目前開發進展比較順利,預計5月份可以發布3.0版本。
提升磁盤IO的另外一個技巧,一次盡可能多寫入或多讀取。也就是說,將程序的讀寫buffer設置得盡可能大一些。例如日志或者redo log的寫入,不是每次調用都直接寫磁盤,而是先緩存到內存中,等buffer滿了再寫入磁盤,也可以定時寫入磁盤。
操作系統和C庫函數通常會對寫入的文件內容做緩存,以減少實際寫文件的次數。直接調用系統函數fsync或C函數fflush將使系統的緩存機制失效,此時將強制把內容刷到磁盤上。除非必需,否則不要執行強制刷盤操作。
注:如果沒有特別說明,文中說的磁盤指的是硬盤。