1. 程式人生 > >KVM總結-KVM效能優化之磁碟IO優化

KVM總結-KVM效能優化之磁碟IO優化

前面講了KVM CPU(http://blog.csdn.net/dylloveyou/article/details/71169463)、記憶體(http://blog.csdn.net/dylloveyou/article/details/71338378)的優化,下面接著第三塊的內容,KVM磁碟效能方面的調優。磁碟IO我們可以從以下四個方面去著手優化:

  1. 磁碟型別選擇
  2. 快取模式選擇
  3. AIO 非同步讀寫方式選擇
  4. 磁碟IO排程器選擇

磁碟型別選擇

磁碟方面,建議是用Virtio模式,在CentOS7.1 中,磁碟的型別有IDE 、SATA 以及virtio 三種。磁碟這塊也有完全虛擬化和半虛擬化之分。virtio它就是半虛擬化的,最初是由澳大利亞的一個天才級程式設計師Rusty Russell編寫,是一個在hypervisor之上的抽象API介面,它讓客戶機知道自己執行在虛擬化環境中,從而與hypervisor一起根據 virtio 標準協作,因此,virtio能讓客戶機中達到更好的效能(特別是I/O效能)。

關於使用virtio的測試資料,如下圖所示,virtio模式的讀寫能力遠高於IDE的:
這裡寫圖片描述

圖上淡紫色的資料條是virtio的資料,紅色的是IDE的,效能幾乎是相差很大。

所以大家在選擇磁碟模式的時候,注意選擇virtio模式,特別是在雲環境裡,你製作的虛擬機器模版,最好選擇virtio模式。

快取模式選擇

目前KVM這塊支援5種磁碟快取模式,writethrough、writeback、none、directsync或者unsafe。一般用到的就是前面3種,後面兩種幾乎不會使用。

  • writethrough:(直寫模式)資料直接寫入磁盤裡,不使用快取;在資料更新時,同時寫入快取Cache和後端儲存。此模式的優點是操作簡單;缺點是因為資料修改需要同時寫入儲存,資料寫入速度較慢。
  • writeback:(回寫模式)在資料更新時只寫入快取Cache。只在資料被替換出快取時,被修改的快取資料才會被寫到後端儲存。此模式的優點是資料寫入速度快,因為不需要寫儲存;缺點是一旦更新後的資料未被寫入儲存時出現系統掉電的情況,資料將無法找回。
  • none:這種模式作用在Guest OS Pagecache和Physical Disk
    Cache中,相當於虛擬機器能直接訪問宿主機的磁碟,效能不錯!

這裡寫圖片描述
從圖中可以看到,writeback採用了guest和host兩層的page cache,也就是說同一個檔案會存在兩份cache,這是沒有必要的,none和writethrough都會繞過host層的page cache。

低於QEMU-KVM 1.2 的版本kvm預設的cache方式是writethrouh,這種方式是最安全的,不會造成資料的不一致性,但是效能也是最差的。

總的來說,這三種模式,從安全和效能兩角度分析,效果如下:
效能上: writeback > none > writethrough
安全上 :writeback < none < writethrough
關於這三種模式的測試結果,如下圖所示:
這裡寫圖片描述
其中淡紫色的是 none模式,我們發現它的效能資料幾乎很平均,所以選擇它是最合適的方式,既安全穩定效能又不錯。設定的方法也很簡單,直接在XML裡定義:

<driver name='qemu' type='qcow2' cache='none'/> 
  • 1

加上cache='none'即可

綜合資料的安全性和效能,建議選擇none模式,注意CentOS下預設是none。

AIO 非同步讀寫方式選擇

aio 這塊分為兩種,一種是native方式,還有一種是thread方式。

Linux系統上非同步IO常見的有兩種實現,一種是kernel native AIO,另外一種是threaded aio: user space AIO emulated by posix thread workers。

Kernel native AIO : Kernel的原生態非同步IO實現。

Threaded aio : linux使用者空間非同步IO的實現,其實它不是真正的非同步IO,是通過啟動一定數量的 blocking IO執行緒來模擬非同步IO。這種實現有不少缺點,畢竟有不少執行緒開銷,還在改進中。

因此,我們KVM裡選擇AIO這塊選擇Kernel的原生態的native更好。
開啟方式是:

<driver name='qemu' type='qcow2' cache='none' aio='native'/>
  • 1

磁碟IO排程器選擇

目前Linux 磁碟IO排程主要有3種,NOOP ,Deadline ,CFQ 。

Deadline I/O scheduler :用過期時間來排序io操作順序,保證先出現的io請求有最短的延遲時間,相對於寫操作,給讀操作更優先的級別,是比較好的一個排程模式。特別適合於讀取較多的環境(比如資料庫,Oracle 10G 之類)。

NOOP (elevator=noop): 這個排程模式會把所有的資料請求直接合併到一個簡單的佇列裡。在有些SAN 環境下,這個選擇可能是最好選擇。適用於隨機存取裝置, 不適合有機械結構的儲存器。因為沒有優化順序,會增加額外的尋道時間。屬於最簡單的一個排程模式,無視io操作優先順序和複雜性,執行完一個再執行一個,如果讀寫操作繁多的話,就會造成效率降低。

CFQ I/O scheduler:完全公平佇列,是anticipatory模式的替代品,沒有過多的做預測性排程,而是根據給定的程序io優先順序,直接來分配操作的順序。這個模式在linux上表現良好,但也許並不是最適合android的io排程模式,太強調均衡,而降低了連續讀寫資料的效能。適用於有大量程序的多使用者系統。

Linux預設是deadline,我們可以通過命令 cat /sys/block/sd*/queue/scheduler 檢視:
這裡寫圖片描述
如果要更改模式,我們就用:
格式:echo {SCHEDULER-NAME} > /sys/block/{DEVICE-NAME}/queue/scheduler
例:echo cfq > /sys/block/sda/queue/scheduler 改成cfq模式

這三種排程方式,得具體看你的虛擬機器跑的應用去選擇,一般的是選擇CFQ模式。

轉載自雲技術實踐微信公眾號,作者寶哥。