作為 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