轉載自:http://blog.csdn.net/letterwuyu/article/details/53542291
在數據庫優化和存儲規划過程中,總會提到IO的一些重要概念,在這里就詳細記錄一下,對這個概念的熟悉程度也決定了對數據庫與存儲優化的理解程度,以下這些概念並非權威文檔,權威程度肯定就不能說了。
讀/寫IO,最為常見說法,讀IO,就是發指令,從磁盤讀取某段扇區的內容。指令一般是通知磁盤開始扇區位置,然后給出需要從這個初始扇區往后讀取的連續扇區個數,同時給出動作是讀,還是寫。磁盤收到這條指令,就會按照指令的要求,讀或者寫數據。控制器發出的這種指令+數據,就是一次IO,讀或者寫。
大/小塊IO,指控制器的指令中給出的連續讀取扇區數目的多少,如果數目很大,比如128,64等等,就應該算是大塊IO,如果很小,比如1, 4,8等等,就應該算是小塊IO,大塊和小塊之間,沒有明確的界限。
連續/隨機IO,連續和隨機,是指本次IO給出的初始扇區地址,和上一次IO的結束扇區地址,是不是完全連續的,或者相隔不多的,如果是,則本次IO應該算是一個連續IO,如果相差太大,則算一次隨機IO。連續IO,因為本次初始扇區和上次結束扇區相隔很近,則磁頭幾乎不用換道或換道時間極短;如果相差太大,則磁頭需要很長的換道時間,如果隨機IO很多,導致磁頭不停換道,效率大大降底。
順序/並發IO,這個的意思是,磁盤控制器每一次對磁盤組發出的指令套(指完成一個事物所需要的指令或者數據),是一條還是多條。如果是一條,則控制器緩存中的IO隊列,只能一個一個的來,此時是順序IO;如果控制器可以同時對磁盤組中的多塊磁盤,同時發出指令套,則每次就可以執行多個IO,此時就是並發IO模式。並發IO模式提高了效率和速度。
IO並發幾率。單盤,IO並發幾率為0,因為一塊磁盤同時只可以進行一次IO。對於raid0,2塊盤情況下,條帶深度比較大的時候(條帶太小不能並發IO,下面會講到),並發2個IO的幾率為1/2。其他情況請自行運算。
IOPS。一個IO所用的時間=尋道時間+數據傳輸時間。 IOPS=IO並發系數/(尋道時間+數據傳輸時間),由於尋道時間相對傳輸時間,大幾個數量級,所以影響IOPS的關鍵因素,就是降底尋道時間,而在連續IO的情況下,尋道時間很短,僅在換磁道時候需要尋道。在這個前提下,傳輸時間越少,IOPS就越高。
每秒IO吞吐量。顯然,每秒IO吞吐量=IOPS乘以平均IO SIZE。 Io size越大,IOPS越高,每秒IO吞吐量就越高。設磁頭每秒讀寫數據速度為V,V為定值。則IOPS=IO並發系數/(尋道時間+IO SIZE/V),代入,得每秒IO吞吐量=IO並發系數乘IO SIZE乘V/(V乘尋道時間+IO SIZE)。我們可以看出影響每秒IO吞吐量的最大因素,就是IO SIZE和尋道時間,IO SIZE越大,尋道時間越小,吞吐量越高。相比能顯著影響IOPS的因素,只有一個,就是尋道時間。
提升磁盤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將使系統的緩存機制失效,此時將強制把內容刷到磁盤上。除非必需,否則不要執行強制刷盤操作。
注:如果沒有特別說明,文中說的磁盤指的是硬盤。