linux 使用 ionice 限制 Xen 虛擬機器磁碟 IO

Dus發表於2015-06-29

作為 VPS 服務商我們需要保證每個 VPS 公平的使用 host(伺服器)的資源,避免某個 VPS 因為程式死迴圈、掛起、濫用等因素 “拖累” 其他 VPS,如果出現這個情況如何臨時限制這個 VPS 的磁碟 IO 呢?有個辦法是通過通過修改每個虛擬機器 CPU 權重的辦法間接、不精確的限制 IO. 在 Linux 上限制資源(CPU、記憶體、IO 等)的通常辦法是用 cgroups,不過今天介紹的 ionice 要更容易一些。

首先找到哪個虛擬機器(VPS)正在大量 IO(假設是 vps0001),找到這個虛擬機器後用 xm list 查出這個虛擬機器使用的 ID 號,然後用 ID 配上 blkback(blkback.24)找出這個虛擬機器(通過 Xen 的 blkback 驅動)關聯哪些硬碟(blkback.24.xvda 和 blkback.24.xvdb),以及所使用的程式號(25089 和 25090):

 

1 # xm list vps0001
2 Name                                      ID Mem(MiB) VCPUs State   time(s)
3 vps0001                                   24     1024     2 -b----  70030.7
4 
5 # ps aux | grep blkback.24
6 root      7434  0.0  0.1  61172   768 pts/16   D+   02:48   0:00 grep blkback.24
7 root     25089  0.0  0.0      0     0 ?        S<    2012   0:00 [blkback.24.xvda]
8 root     25090  0.0  0.0      0     0 ?        S<    2012   0:00 [blkback.24.xvdb]

 

找到程式號後我們就可以 ionice 了:

# ionice -p 25089 -c 2 -n 7

 

使用 ionice 之前查一下幫助檔案,-c 是指定排程型別,這裡選擇的是 2,best-effort;-n 指定排程優先順序,0 最高,7最低;-p 是指定程式號:

OPTIONS
-c The scheduling class. 1 for real time, 2 for best-effort, 3 for
idle.

-n The scheduling class data. This defines the class data, if the
class accepts an argument. For real time and best-effort, 0-7 is
valid data.

-p Pass in a process pid to change an already running process. If
this argument is not given, ionice will run the listed program
with the given parameters.

ionice 把磁碟 IO 排程分成三類:

  • real time 實時排程,設定後立即訪問磁碟,不管系統中其他程式是否有 IO,可能會使得其他程式處於等待狀態,不能用在這裡;
  • best effort 預設排程,可以指定排程優先順序(從0到7,數值越小、優先順序越高);同一優先順序的程式採用 round-robin 演算法排程;
  • idle 空閒排程,只有當前系統沒有其他程式磁碟 IO 時,才能進行磁碟 IO.

額,如果太過分,我們就把這個程式的排程改成 idle,這樣會極大降低這個虛擬機器的 IO,虛擬機器只能保持基本可用狀態,不推薦~

 

# ionice -p 25089 -c 3

 

相關文章