前一篇博客介紹了利用 cgroup 來控制進(jìn)程的 CPU和內(nèi)存使用情況, 這次補(bǔ)上使用 cgroup 來控制進(jìn)程的IO優(yōu)先級的方法.
前提條件如果想控制進(jìn)程的IO優(yōu)先級, 需要內(nèi)核的支持, 內(nèi)核編譯時需要打開下面2個參數(shù).
CONFIG_BLK_CGROUP=yCONFIG_CFQ_GROUP_IOSCHED=y
查看是否開啟這2個內(nèi)核編譯選項的方法很簡單:
root@debian-113:~# grep -i 'blk_cgroup' /boot/config-`uname -r`root@debian-113:~# grep -i 'cfq_group' /boot/config-`uname -r`
如果這2個內(nèi)核選項沒有打開, 只能重新編譯內(nèi)核后再來實(shí)驗下面的實(shí)例了.
再次通過 /PRoc/cgroups 來查看 blkio 是否已經(jīng)啟用.
root@debian-113:~# cat /proc/cgroups #subsys_name hierarchy num_cgroups enabledcpuset 0 1 1cpu 0 1 1cpuacct 0 1 1memory 0 1 1devices 0 1 1freezer 0 1 1net_cls 0 1 1blkio 0 1 1 <-- enabled = 1, 說明已經(jīng)啟用perf_event 0 1 1
如果 blkio 沒有啟用, 可以通過grub設(shè)置啟動參數(shù)來啟用它.
類似的可以參考: Linux資源控制-CPU和內(nèi)存 中 實(shí)例4 - cgroup 對使用的內(nèi)存的控制 中啟用memory的方法。
除此之外, 還得查看是否能夠?qū)?CFQ 作為IO調(diào)度程序來使用.
root@debian-113:~# cat /sys/class/block/sda/queue/scheduler noop deadline [cfq]
上述結(jié)果表示支持cfq調(diào)度, []括住cfq 表示當(dāng)前使用的就是 cfq調(diào)度.
如果 cat 的結(jié)果中沒有 cfq, 需要重新編譯內(nèi)核, 使之能夠支持 cfq調(diào)度.
如果 cat 的結(jié)果中有 cfq, 但是 cfq 不是當(dāng)前正在使用的調(diào)度程序, 即 [] 沒有括在 cfq上, 那么
cat cfq /sys/class/block/sda/queue/scheduler <-- 將當(dāng)前的IO調(diào)度程序設(shè)置成 cfq
注: 上面的 sda 是我的測試的硬盤, 如果你的是 sdb 或者其它, 請對應(yīng)修改.
實(shí)例 - 控制IO優(yōu)先級實(shí)驗之前, 先制作測試腳本. (簡單寫了一個如下)
#!/bin/bash##################################################################### 1. 創(chuàng)造2個測試文件, 大小都是1G# 2. 將當(dāng)前進(jìn)程加入到指定 cgroup# 3. 執(zhí)行 dd 操作# 4. 刪除 測試文件# 5. 顯示log####################################################################function usage(){ echo "./blkio-test.sh <group1> <group2>" exit 1}if [ $# != 2 ]; then usagefigroup1_src=~/group1.srcgroup2_src=~/group2.srcgroup1_log=/tmp/group1.loggroup2_log=/tmp/group2.loggroup1=$1group2=$2echo "生成測試數(shù)據(jù) $group1_src 和 $group2_src (大小都是1G)"dd if=/dev/zero of=$group1_src count=1024 bs=1Mdd if=/dev/zero of=$group2_src count=1024 bs=1Mecho "同時在 $group1 和 $group2 中開始 dd 測試"echo 3 > /proc/sys/vm/drop_cachesecho $$ >> $group1/tasks(date; dd if=$group1_src of=/dev/null; date;) > $group1_log 2>&1 &echo $$ >> $group2/tasks(date; dd if=$group2_src of=/dev/null; date;) > $group2_log 2>&1 &waitecho "測試完成!"echo "開始清除測試文件"rm -rf $group1_src $group2_srcecho "測試文件清除完成"echo "------------------------------------------"echo "顯示group1 的log"cat $group1_logecho "------------------------------------------"echo "顯示group2 的log"cat $group2_logecho "------------------------------------------"開始實(shí)驗:
# 掛載 cgroup 文件系統(tǒng)root@debian-113:~# mount -t cgroup -o blkio cgroup /mnt/cgroup/root@debian-113:~# mkdir /mnt/cgroup/{A,B}root@debian-113:~# ll /mnt/cgroup/total 0drwxr-xr-x 2 root root 0 Sep 5 13:23 Adrwxr-xr-x 2 root root 0 Sep 5 13:23 B-r--r--r-- 1 root root 0 Sep 5 13:23 blkio.io_merged-r--r--r-- 1 root root 0 Sep 5 13:23 blkio.io_queued-r--r--r-- 1 root root 0 Sep 5 13:23 blkio.io_service_bytes-r--r--r-- 1 root root 0 Sep 5 13:23 blkio.io_serviced-r--r--r-- 1 root root 0 Sep 5 13:23 blkio.io_service_time-r--r--r-- 1 root root 0 Sep 5 13:23 blkio.io_wait_time--w------- 1 root root 0 Sep 5 13:23 blkio.reset_stats-r--r--r-- 1 root root 0 Sep 5 13:23 blkio.sectors-r--r--r-- 1 root root 0 Sep 5 13:23 blkio.time-rw-r--r-- 1 root root 0 Sep 5 13:23 blkio.weight <-- 這個就是設(shè)置IO優(yōu)先級的文件-rw-r--r-- 1 root root 0 Sep 5 13:23 blkio.weight_device-rw-r--r-- 1 root root 0 Sep 5 13:23 cgroup.clone_children--w--w--w- 1 root root 0 Sep 5 13:23 cgroup.event_control-rw-r--r-- 1 root root 0 Sep 5 13:23 cgroup.procs-rw-r--r-- 1 root root 0 Sep 5 13:23 notify_on_release-rw-r--r-- 1 root root 0 Sep 5 13:23 release_agent-rw-r--r-- 1 root root 0 Sep 5 13:23 tasks# 默認(rèn)2個組內(nèi)的IO優(yōu)先級都是500root@debian-113:~# cat /mnt/cgroup/A/blkio.weight500 <-- 這個值的范圍是 100 ~ 1000, 值越大優(yōu)先級越高root@debian-113:~# cat /mnt/cgroup/B/blkio.weight500# 默認(rèn)情況下的測試結(jié)果如下: A和B耗時都是 20秒root@debian-113:~# ./blkio-test.sh /mnt/cgroup/A /mnt/cgroup/B生成測試數(shù)據(jù) /root/group1.src 和 /root/group2.src (大小都是1G)1024+0 records in1024+0 records out1073741824 bytes (1.1 GB) copied, 6.01188 s, 179 MB/s1024+0 records in1024+0 records out1073741824 bytes (1.1 GB) copied, 9.4272 s, 114 MB/s同時在 /mnt/cgroup/A 和 /mnt/cgroup/B 中開始 dd 測試測試完成!開始清除測試文件測試文件清除完成------------------------------------------顯示group1 的logFri Sep 5 13:26:31 CST 20142097152+0 records in2097152+0 records out1073741824 bytes (1.1 GB) copied, 20.0504 s, 53.6 MB/sFri Sep 5 13:26:51 CST 2014------------------------------------------顯示group2 的logFri Sep 5 13:26:31 CST 20142097152+0 records in2097152+0 records out1073741824 bytes (1.1 GB) copied, 18.8583 s, 56.9 MB/sFri Sep 5 13:26:51 CST 2014------------------------------------------# 修改A的優(yōu)先級為100, B的優(yōu)先級為1000root@debian-113:~# echo 100 > /mnt/cgroup/A/blkio.weightroot@debian-113:~# echo 1000 > /mnt/cgroup/B/blkio.weightroot@debian-113:~# cat /mnt/cgroup/A/blkio.weight100root@debian-113:~# cat /mnt/cgroup/B/blkio.weight1000# 不同優(yōu)先級下的測試結(jié)果如下: A耗時 19秒; B耗時 11秒root@debian-113:~# ./blkio-test.sh /mnt/cgroup/A /mnt/cgroup/B生成測試數(shù)據(jù) /root/group1.src 和 /root/group2.src (大小都是1G)1024+0 records in1024+0 records out1073741824 bytes (1.1 GB) copied, 6.52967 s, 164 MB/s1024+0 records in1024+0 records out1073741824 bytes (1.1 GB) copied, 8.01311 s, 134 MB/s同時在 /mnt/cgroup/A 和 /mnt/cgroup/B 中開始 dd 測試測試完成!開始清除測試文件測試文件清除完成------------------------------------------顯示group1 的logFri Sep 5 13:30:06 CST 20142097152+0 records in2097152+0 records out1073741824 bytes (1.1 GB) copied, 18.5598 s, 57.9 MB/sFri Sep 5 13:30:25 CST 2014------------------------------------------顯示group2 的logFri Sep 5 13:30:06 CST 20142097152+0 records in2097152+0 records out1073741824 bytes (1.1 GB) copied, 10.6127 s, 101 MB/sFri Sep 5 13:30:17 CST 2014------------------------------------------可以看出, IO優(yōu)先級調(diào)整之后, 確實(shí)優(yōu)先級高的cgroup中的進(jìn)程能更快完成IO操作.
總結(jié)其實(shí) cgroup 除了能夠IO優(yōu)先級之外, 還可以控制進(jìn)程的其它IO屬性, 具體參見掛載在 cgroup 的IO相關(guān)設(shè)置文件.
各個文件的具體含義, 請參考更詳細(xì)的 cgroup 相關(guān)文檔.
新聞熱點(diǎn)
疑難解答
圖片精選