一、IOPS(IO請求數量)
IOPS,即每秒鐘處理的IO請求數量。IOPS是隨機訪問類型業務(OLTP類)很重要的一個參考指標。
1、一塊物理硬盤能提供多少IOPS?
從磁盤上進行數據讀取時,比較重要的幾個時間是:尋址時間(找到數據塊的起始位置),旋轉時間(等待磁盤旋轉到數據塊的起始位置),傳輸時間(讀取數據的時間和返回的時間)。其中尋址時間是固定的(磁頭定位到數據的存儲的扇區即可),旋轉時間受磁盤轉速的影響,傳輸時間受數據量大小的影響和接口類型的影響(不用硬盤接口速度不同),但是在隨機訪問類業務中,他的時間也很少。因此,在硬盤接口相同的情況下,IOPS主要受限于尋址時間和傳輸時間。以一個15K的硬盤為例,尋址時間固定為4ms,傳輸時間為60s/15000*1/2=2ms,忽略傳輸時間。1000ms/6ms=167個IOPS。
2、OS的一次IO請求對應物理硬盤一個IO嗎?
在沒有文件系統、沒有VM(卷管理)、沒有RAID、沒有存儲設備的情況下,這個答案還是成立的。但是當這么多中間層加進去以后,這個答案就不是這樣了。物理硬盤提供的IO是有限的,也是整個IO系統存在瓶頸的最大根源。所以,如果一塊硬盤不能提供,那么多塊在一起并行處理,這不就行了嗎?確實是這樣的??梢钥吹?,越是高端的存儲設備的cache越大,硬盤越多,一方面通過cache異步處理IO,另一方面通過盤數增加,盡可能把一個OS的IO分布到不同硬盤上,從而提高性能。文件系統則是在cache上會影響,而VM則可能是一個IO分布到多個不同設備上(Striping)。所以,一個OS的IO在經過多個中間層以后,發生在物理磁盤上的IO是不確定的??赡苁且粚σ粋€,也可能一個對應多個。
3、IOPS能算出來嗎?
對單塊磁盤的IOPS的計算沒有沒問題,但是當系統后面接的是一個存儲系統時、考慮不同讀寫比例,IOPS則很難計算,而需要根據實際情況進行測試。主要的因素有:
1)存儲系統本身有自己的緩存:緩存大小直接影響IOPS,理論上說,緩存越大能cache的東西越多,在cache命中率保持的情況下,IOPS會越高。
2)RAID級別:不同的RAID級別影響了物理IO的效率。
3)讀寫混合比例:對讀操作,一般只要cache能足夠大,可以大大減少物理IO,而都在cache中進行;對寫操作,不論cache有多大,最終的寫還是會落到磁盤上。因此,100%寫的IOPS要小于100%的讀的IOPS。同時,100%寫的IOPS大致等同于存儲設備能提供的物理的IOPS。
4)一次IO請求數據量的多少。一次讀寫1KB和一次讀寫1MB,顯而易見,結果是完全不同的。
當時上面N多因素混合在一起以后,IOPS的值就變得撲朔迷離了。所以,一般需要通過實際應用的測試才能獲得。
二、IO Response Time(響應時間)
即IO的響應時間。IO響應時間是從操作系統內核發出一個IO請求到接收到IO響應的時間。因此,IO Response time除了包括磁盤獲取數據的時間,還包括了操作系統以及在存儲系統內部IO等待的時間。一般看,隨IOPS增加,因為IO出現等待,IO響應時間也會隨之增加。對一個OLTP系統,10ms以內的響應時間,是比較合理的。下面是一些IO性能示例:
· 一個8K的IO會比一個64K的IO速度快,因為數據讀取的少些。
· 一個64K的IO會比8個8K的IO速度快,因為前者只請求了一個IO而后者是8個IO。
· 串行IO會比隨機IO快,因為串行IO相對隨機IO說,即便沒有Cache,串行IO在磁盤處理上也會少些操作。
需要注意,IOPS與IO Response Time有著密切的聯系。一般情況下,IOPS增加,說明IO請求多了,IO Response Time會相應增加。但是會出現IOPS一直增加,但是IO Response Time變得非常慢,超過20ms甚至幾十ms,這時候的IOPS雖然還在提高,但是意義已經不大,因為整個IO系統的服務時間已經不可取。
三、Throughput(吞吐量)
為吞吐量。這個指標衡量標識了最大的數據傳輸量。如上說明,這個值在順序訪問或者大數據量訪問的情況下會比較重要。尤其在大數據量寫的時候。
吞吐量不像IOPS影響因素很多,吞吐量一般受限于一些比較固定的因素,如:網絡帶寬、IO傳輸接口的帶寬、硬盤接口帶寬等。一般他的值就等于上面幾個地方中某一個的瓶頸。
1)IO Chunk Size
即單個IO操作請求數據的大小。一次IO操作是指從發出IO請求到返回數據的過程。IO Chunk Size與應用或業務邏輯有著很密切的關系。比如像Oracle一類數據庫,由于其block size一般為8K,讀取、寫入時都此為單位,因此,8K為這個系統主要的IO Chunk Size。
IO Chunk Size小,考驗的是IO系統的IOPS能力;IO Chunk Size大,考驗的時候IO系統的IO吞吐量。
2)Queue Deep
熟悉數據庫的人都知道,SQL是可以批量提交的,這樣可以大大提高操作效率。IO請求也是一樣,IO請求可以積累一定數據,然后一次提交到存儲系統,這樣一些相鄰的數據塊操作可以進行合并,減少物理IO數。而且Queue Deep如其名,就是設置一起提交的IO請求數量的。一般Queue Deep在IO驅動層面上進行配置。
Queue Deep與IOPS有著密切關系。Queue Deep主要考慮批量提交IO請求,自然只有IOPS是瓶頸的時候才會有意義,如果IO都是大IO,磁盤已經成瓶頸,Queue Deep意義也就不大了。一般來說,IOPS的峰值會隨著Queue Deep的增加而增加(不會非常顯著),Queue Deep一般小于256。
3)隨機訪問(隨機IO)、順序訪問(順序IO)
隨機訪問的特點是每次IO請求的數據在磁盤上的位置跨度很大(如:分布在不同的扇區),因此N個非常小的IO請求(如:1K),必須以N次IO請求才能獲取到相應的數據。
順序訪問的特點跟隨機訪問相反,它請求的數據在磁盤的位置是連續的。當系統發起N個非常小的IO請求(如:1K)時,因為一次IO是有代價的,系統會取完整的一塊數據(如4K、8K),所以當第一次IO完成時,后續IO請求的數據可能已經有了。這樣可以減少IO請求的次數。這也就是所謂的預取。
隨機訪問和順序訪問同樣是有應用決定的。如數據庫、小文件的存儲的業務,大多是隨機IO。而視頻類業務、大文件存取,則大多為順序IO。
選取合理的觀察指標:
以上各指標中,不用的應用場景需要觀察不同的指標,因為應用場景不同,有些指標甚至是沒有意義的。
隨機訪問和IOPS: 在隨機訪問場景下,IOPS往往會到達瓶頸,而這個時候去觀察Throughput,則往往遠低于理論值。
順序訪問和Throughput:在順序訪問的場景下,Throughput往往會達到瓶頸(磁盤限制或者帶寬),而這時候去觀察IOPS,往往很小。