linux的qos機制 – cgroup篇 (1)

來源:互聯網
上載者:User

cgroups全稱control groups,在RHEL6的2.6.32核心中已經包括了cgroup的patch。這裡強烈建議安裝RHEL6(CentOS6)來使用cgroups,如果沒有的話,只能升級核心了 ( > 2.6.26版本) 

下面的例子通過對cgroups的blkio, cpuset, memory三個子系統的實現來示範如何應用cgroups,我們這裡不使用紅帽子的libcgroup package提供的工具,通過該工具進行cgroup的操作詳見這篇 http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/pdf/Resource_Management_Guide/Red_Hat_Enterprise_Linux-6-Resource_Management_Guide-en-US.pdf

1. cpu子系統

cpu.shares:假設cgroup A的tasks的cpu.shares值為1,cgroup B的tasks的cpu.shares值為2,則cgroup B的進程佔用的cpu時間是cgroup A上進程的2倍。

cpu.rt_runtime_us

cpu.rt_period_us:這兩個值建議不要設,讓OS去調度佔用的CPU時間的絕對值。

# mkdir /cgroup/cpu

# mount -t cgroup -o cpu none /cgroup/cpu

# mkdir /cgroup/cpu/tinker

# mkdir /cgroup/cpu/tailor

首先建立好cpu subsys的 cgroups,一共3個,可以從/proc/cgroups查詢到。下面通過taskset -c 0指定程式的cpu affinity為cpu 0,啟動2個進程

# taskset -c 0 yes low > /dev/null &

# taskset -c 0 yes high > /dev/null &

同時把兩個pid分別echo $pid > tasks 檔案中。修改cpu/tinker的cpu.shares為2048, cpu/tailor的cpu.shares為512,下面通過ps看他們的cpu佔用率吧

# ps -C yes -opid,%cpu,psr,args
  PID %CPU PSR COMMAND
19163 20.8   0 yes low
19164 79.4   0 yes high

tips:

1) 較低核心版本有個bug,詳情見 http://lists.linux-foundation.org/pipermail/containers/2008-September/012948.html,推薦使用 > RHEL6.0作為伺服器

2) 刪除child cgroup請用rmdir,rm -rf是無效的

3) 可能是核心調度器的演算法,設定了cpu.shares之後CPU利用率不會立刻就變為shares指定的那樣,需要等待一段時間,基本上是個曲線的變化過程,之後就正確了。

2. cpuacct子系統

沒啥好講的,跳過

3. cpuset子系統

cpuset.cpus, cpuset.mems 表示不同cgroup的tasks可以使用的cpu核以及cpu對應的memory node (NUMA架構下),

cpuset.cpu_exclusive cpuset.mem_exclusive 表示是否共用該核以及對應的memory node (NUMA架構下),一般都為0表示可以共用

cpuset.sched_load_balance 表示是否對cpuset的所有CPU做Server Load Balancer

cpuset.sched_relax_domain_level 表示調度策略,具體不贅述了

cpuset是和cpu affinity相關的,做實驗如下:

# mount -t cgroup -o remount, cpuset none /cgroup/cpu

# mkdir tinker

# echo 0 > tinker/cpuset.cpus

啟動一個進程,查看其cpu affinity

# yes hello > /dev/null &

[1] 19425

# taskset -p 19425
pid 19425's current affinity mask: 3
# taskset -c -p 19425
pid 19425's current affinity list: 0,1

# echo 19425 > tinker/tasks

# taskset -c -p 19425
pid 19425's current affinity list: 0

可以看出由於cpuset只有CPU 0,當把進程掛到cgroup tinker上之後,其CPU affinity也變為0

下面把cgroup tinker的cpu_exclusive設為1,表示獨佔該CPU

# echo 1 > tinker/cpuset.cpu_exclusive

# mkdir tailor

# echo 0 > tailor/cpuset.cpus

此時報錯write error: Invalid argument,因為CPU 0已經被cgroup tinker獨佔,所以cgroup tailor只能使用CPU1

# echo 1 > tailor/cpuset.cpus 

DONE!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.