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模式。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM