性能測試基礎--(IO)

磁盤IOPS


-----基礎有時候總是枯燥,需要耐心的閱讀和思考,本章知識大部來源于日常學習的積累-----

性能測試過程中經常會遇到磁盤的IOPS到達瓶頸,那么IOPS為什么會出現瓶頸呢,我們有該如何進行優化呢?還要從磁盤的基本知識說起。

首先,讓我們一起來了解一下磁盤的一些基本知識:


存儲容量=磁頭數×磁道(柱面)數×每道扇區數×每扇區字節數

(1)硬盤有數個盤片,每盤片兩個面,每個面一個磁頭

(2)盤片被劃分為多個扇形區域即扇區

(3)同一盤片不同半徑的同心圓為磁道

(4)不同盤片相同半徑構成的圓柱面即柱面

(5)公式: 存儲容量=磁頭數×磁道(柱面)數×每道扇區數×每扇區字節數

(6)信息記錄可表示為:××磁道(柱面),××磁頭,××扇區

一般普通磁盤(每個扇區可存儲128×2的N次方(N=0.1.2.3)字節信息)(一般普通磁盤是最多16個ZBR(ZonedBitRecording分區域記錄))(128B/256B/512B/1024B —1k/2048B —2k/4096B —4k/8192B —8k/16k/32k/64k/128K/256K/512K/1024K/2048k/4096K)

默認的情況下,在格式化的時侯,如果沒有指定簇的大小,那么系統會根據分區的大小選擇默認的簇值(NTFS支持512/1024/2048/4096/8192/16K/32K/64KB)

在文件系統中,簇的大小會影響到磁盤文件的排列,設置適當的簇大小,可以減少磁盤空間丟失和分區上碎片的數量。

上面提到的是磁盤的一般屬性,這些屬性再加上磁盤的轉速,我們可以得到一個值:

磁盤轉速x最小存儲單元(簇)

例如:7200轉(7200rpm)磁盤,NTFS文件系統64KB簇分區

吞吐量MAX:7200/60(S) x 64KB/1024 (MB)= 7.5 M/S

15K RPM磁盤,

吞吐量MAX:15000/60(S) x 64KB/1024 (MB)= 15M/S

當然這是理論上硬盤支持的最大值,而實際操作系統或軟件系統對硬盤的讀寫會有不同的讀寫方式和方法,也就是算法。(簡單來分就是同步IO和異步IO)(這里需要注意磁盤的IOPS 和主機/操作系統的IO是不一樣的,后面再逐漸介紹)。

磁盤IOPS:是指存儲設備(一般是磁盤或磁盤陣列)每秒可接受多少次主機發出的訪問。主機的一次IO需要多次訪問存儲才可以完成。一般主機寫入一個最小的數據塊,也要經過“發送寫入請求、寫入數據、收到寫入確認”等三個步驟,也就是3個存儲端訪問。

由于硬盤的限制,每個物理硬盤能處理的IOPS是有限制的,如:

10 K rpm 硬盤,一般情況下IOPS限制為100

15 K rpm 硬盤,一般情況下IOPS限制為150

普通ATA 硬盤,一般情況下IOPS限制為50

IOPS的高低主要取決于陣列的算法,cache命中率,以及磁盤個數。cache的命中率取決于數據的分布,cache size的大小,數據訪問的規則,以及cache的算法。如果一個陣列,讀cache的命中率越高越好,一般表示它可以支持更多的IOPS。

舉一個(摘錄來的)例子:


假定一個case,業務的iops是10000,讀cache命中率是30%,讀iops為60%,寫iops為40%,磁盤個數為120,那么分別計算在raid5與raid10的情況下,每個磁盤的iops為多少。

raid5:

單塊盤的iops = (10000*(1-0.3)*0.6 + 4 * (10000*0.4))/120

= (4200 + 16000)/120

= 168

這里的10000*(1-0.3)*0.6表示是讀的iops,比例是0.6,除掉cache命中,實際只有4200個iops

而4 * (10000*0.4) 表示寫的iops,因為每一個寫,在raid5中,實際發生了4個io,所以寫的iops為16000個

為了考慮raid5在寫操作的時候,那2個讀操作也可能發生命中,所以更精確的計算為:

單塊盤的iops = (10000*(1-0.3)*0.6 + 2 * (10000*0.4)*(1-0.3) + 2 * (10000*0.4))/120

= (4200 + 5600 + 8000)/120

= 148

計算出來單個盤的iops為148個,基本達到磁盤極限

raid10

單塊盤的iops = (10000*(1-0.3)*0.6 + 2 * (10000*0.4))/120

= (4200 + 8000)/120

= 102

可以看到,因為raid10對于一個寫操作,只發生2次io,所以,同樣的壓力,同樣的磁盤,每個盤的iops只有102個,還遠遠低于磁盤的極限iops。

在一個實際的case中,一個恢復壓力很大的standby(這里主要是寫,而且是小io的寫),采用了raid5的方案,發現性能很差,通過分析,每個磁盤的iops在高峰時期,快達到200了,導致響應速度巨慢無比。后來改造成raid10,就避免了這個性能問題,每個磁盤的iops降到100左右。


當然,我們要做優化,除了需要了解磁盤和磁盤整列的算法以外,這些限制條件下,我們還可以對操作系統或者軟件系統的算法進行優化,這就需要了解操縱系統的IO了。

操作系統IO


有很多資料上介紹了5種操作系統IO模型:阻塞IO/非阻塞IO/IO復用/信號驅動IO/異步IO。

在了解這些之前我們需要先了解一下操作系統的資源調度的一些概念,以Linux系統為例,我們來了解一下內核空間和用戶空間:

Linux操作系統包括內核空間和用戶空間(或者說內核態和用戶態),內核空間主要存放的是內核代碼和數據,是供系統進程使用的空間。而用戶空間主要存放的是用戶代碼和數據,是供用戶進程使用的空間。目前Linux系統簡化了分段機制,使得虛擬地址與線性地址總是保持一致,因此,Linux系統的虛擬地址也是0~4G。Linux系統將這4G空間分為了兩個部分:將最高的1G空間(從虛擬地址0xC0000000到0xFFFFFFFF)供內核使用,即為“內核空間”,而將較低的3G空間(從虛擬地址 0x00000000到0xBFFFFFFF)供用戶進程使用,即為“用戶空間”。同時由于每個用戶進程都可以通過系統調用進入到內核空間,因此Linux的內核空間可以認為是被所有用戶進程所共享的,因此對于一個具體用戶進程來說,它可以訪問的虛擬內存地址就是0~4G。另外Linux系統分為了四種特權級:0~3,主要是用來保護資源。0級特權最高,而3級則為最低,系統進程主要運行在0級,用戶進程主要運行在3級。

一般來說,IO操作都分為兩個階段,就拿套接口的輸入操作來說,它的兩個階段主要是:1)等待網絡數據到來,當分組到來時,將其拷貝到內核空間的臨時緩沖區中; 2)將內核空間臨時緩沖區中的數據拷貝到用戶空間緩沖區中;

5種操作系統IO模型

1、阻塞IO

默認情況下,所有套接口都是阻塞的。

假如recvfrom函數是一個系統調用:

###


2-1

說明:任何一個系統調用都會產生一個由用戶態到內核態切換,再從內核態到用戶態切換的過程,而進程(后面再逐漸介紹操作系統的進程調度)上下文切換是通過系統中斷程序來實現的,需要保存當前進程的上下文狀態,這是一個極其費力的過程。

2、非阻塞IO

當我們把套接口設置成非阻塞時,就是由用戶進程不停地詢問內核某種操作是否準備就緒,這就是我們常說的“輪詢”。這同樣是一件比較浪費CPU的方式。

###


2-2

3、IO復用

我們常用到的IO復用,主要是select和poll。這里同樣是會阻塞進程的,但是這里進程是阻塞在select或者poll這兩個系統調用上,而不是阻塞在真正的IO操作上。

另外還有一點不同于阻塞IO的就是,盡管看起來與阻塞IO相比,這里阻塞了兩次,但是第一次阻塞在select上時,select可以監控多個套接口上是否已有IO操作準備就緒的,而不是像阻塞IO那種,一次性只能監控一個套接口。

#####


2-3

4、信號驅動IO

信號驅動IO就是說我們可以通過sigaction系統調用注冊一個信號處理程序,然后主程序可以繼續向下執行,當我們所監控的套接口有IO操作準備就緒時,由內核通知觸發前面注冊的信號處理程序執行,然后將我們所需要的數據從內核空間拷貝到用戶空間。

####


2-4

5、異步IO

異步IO與信號驅動IO最主要的區別就是信號驅動IO是由內核通知我們何時可以進行IO操作了,而異步IO則是由內核告訴我們IO操作何時完成了。具體來說就是,信號驅動IO當內核通知觸發信號處理程序時,信號處理程序還需要阻塞在從內核空間緩沖區拷貝數據到用戶空間緩沖區這個階段,而異步IO直接是在第二個階段完成后內核直接通知可以進程后續操作了。

######


2-5

我們發現 前四種IO模型的主要區別是在第一階段,因為它們的第二階段都是在阻塞等待數據由內核空間拷貝到用戶空間;而異步IO很明顯與前面四種有所不同,它在第一階段和第二階段都不會阻塞。具體參考如下:

####


2-6

最后,總結下同步IO與異步IO的區別:

1)同步IO操作會引起進程阻塞直到IO操作完成。

2)異步IO操作不引起進程阻塞。


由上面引用這么多知識,我們大概可以了解到:

性能測試中IOPS是一項重要的性能監控指標,磁盤IO限制和操作系統以及軟件系統的IO算法都會對我們整個的業務系統產生性能影響,我們在做性能測試的時候,要綜合考慮從這些方面:

(1) 硬件磁盤的轉速(硬件設備)

(2) 磁盤個數(硬件設備)

(3) 磁盤陣列(算法)

(4) 磁盤的文件系統(分區結構算法)

(5) 操作系統和軟件系統讀寫(異步讀寫,批量讀寫等)

來進行優化。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,786評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,656評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,697評論 0 379
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,098評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,855評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,254評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,322評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,473評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,014評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,833評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,016評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,568評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,273評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,680評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,946評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,730評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,006評論 2 374

推薦閱讀更多精彩內容