系統(tǒng)之家 - 系統(tǒng)光盤(pán)下載網(wǎng)站!

當(dāng)前位置:系統(tǒng)之家 > 系統(tǒng)教程 > Linux下cgroups知識(shí)

Linux中cgroups的基礎(chǔ)知識(shí)

時(shí)間:2014-12-22 11:44:24 作者:qipeng 來(lái)源:系統(tǒng)之家 1. 掃描二維碼隨時(shí)看資訊 2. 請(qǐng)使用手機(jī)瀏覽器訪(fǎng)問(wèn): https://m.xitongzhijia.net/xtjc/20141222/33087.html 手機(jī)查看 評(píng)論

  Linux下cgroups可用于物理內(nèi)存的控制,適用于多種應(yīng)用場(chǎng)景,因?yàn)閏groups中的東西較多,本文就給大家簡(jiǎn)單介紹下Linux cgroups,讓大家對(duì)其有個(gè)初步的了解。

 Linux中cgroups的基礎(chǔ)知識(shí)

  從 2.6.24 版本開(kāi)始,linux 內(nèi)核提供了一個(gè)叫做 cgroups(控制組)的特性。cgroups 就是 control groups 的縮寫(xiě),用來(lái)對(duì)一組進(jìn)程所占用的資源做限制、統(tǒng)計(jì)、隔離。也是目前輕量級(jí)虛擬化技術(shù) lxc (linux container)的基礎(chǔ)之一。每一組進(jìn)程就是一個(gè)控制組,也就是一個(gè) cgroup。cgroups 分為幾個(gè)子系統(tǒng),每個(gè)子系統(tǒng)代表一種設(shè)施或者說(shuō)是資源控制器,用來(lái)調(diào)度某一類(lèi)資源的使用,如 cpu 時(shí)鐘、內(nèi)存、塊設(shè)備 等。在實(shí)現(xiàn)上,cgroups 并沒(méi)有增加新的系統(tǒng)調(diào)用,而是表現(xiàn)為一個(gè) cgroup 文件系統(tǒng),可以把一個(gè)或多個(gè)子系統(tǒng)掛載到某個(gè)目錄。如

  代碼如下:

  mount -t cgroup -o cpu cpu /sys/fs/cgroup/cpu

  就將 cpu 子系統(tǒng)掛載在了 /sys/fs/cgroup/cpu 。也可以在一個(gè)目錄上掛載多個(gè)子系統(tǒng),甚至全部掛載到一個(gè)目錄也是可以的,不過(guò)我覺(jué)得,把每個(gè)子系統(tǒng)都掛載在不同目錄會(huì)有更好的靈活性。用 mount|awk ‘$5==“cgroup” {print $0}’ 可以看到當(dāng)前掛載的控制組。用 cat /proc/cgroups 可以看到當(dāng)前所有控制組的狀態(tài)。下面這個(gè)腳本,可以把全部子系統(tǒng)各種掛載到各自的目錄上去。

  代碼如下:

  #!/bin/bash《/p》 《p》cgroot=“${1:-/sys/fs/cgroup}”

  subsys=“${2:-blkio cpu cpuacct cpuset devices freezer memory net_cls net_prio ns perf_event}”《/p》 《p》mount -t tmpfs cgroup_root “${cgroot}”

  for ss in $subsys; do

  mkdir -p “$cgroot/$ss”

  mount -t cgroup -o “$ss” “$ss” “$cgroot/$ss”

  done

  看看那些目錄里都有些啥,比如 ls 一下 /sys/fs/cgroup/cpu。

  代碼如下:

  cgroup.event_control cpu.cfs_period_us cpu.rt_period_us cpu.shares notify_on_release tasks

  cgroup.procs cpu.cfs_quota_us cpu.rt_runtime_us cpu.stat release_agent

  其中 “cpu.” 開(kāi)頭的就是這個(gè)子系統(tǒng)里特有的東西。其他的那些是每個(gè)子系統(tǒng)所對(duì)應(yīng)目錄里都有的。這些文件就是用來(lái)讀取資源使用信息和進(jìn)行資源限制的。要?jiǎng)?chuàng)建一個(gè)控制組,就在需要的子系統(tǒng)里創(chuàng)建一個(gè)目錄即可。如 mkdir /sys/fs/cgroup/cpu/foo 就創(chuàng)建了一個(gè) /foo 的控制組。在新建的目錄里就會(huì)出現(xiàn)同樣一套文件。在這個(gè)目錄里,也一樣可以繼續(xù)通過(guò)創(chuàng)建目錄來(lái)創(chuàng)建 cgroup。也就是說(shuō),cgroup 是可以和目錄結(jié)構(gòu)一樣有層次的。對(duì)與每個(gè)子系統(tǒng)掛載點(diǎn)點(diǎn)目錄,就相當(dāng)于根目錄。每一條不同的路徑就代表了一個(gè)不同的 cgroup。在不同的子系統(tǒng)里,路徑相同就代表了同一個(gè)控制組。如,在 cpu、memory 中都有 foo/bar 目錄,就可以用 那 /foo/bar 來(lái)操作 cpu、memory 兩個(gè)子系統(tǒng)。對(duì)于同一個(gè)子系統(tǒng),每個(gè)進(jìn)程都屬于且只屬于一個(gè) cgroup,默認(rèn)是在根 cgroup。層次結(jié)構(gòu)方便了控制組的組織和管理,對(duì)于某些配置項(xiàng)來(lái)說(shuō),層次結(jié)構(gòu)還和資源分配有關(guān)。另外,也可以修改某個(gè)目錄的 owner ,讓非 root 用戶(hù)也能操作某些特定的安全組。

  cgroups 的設(shè)置和信息讀取是通過(guò)對(duì)那些文件的讀寫(xiě)來(lái)進(jìn)行的。例如

  代碼如下:

  # echo 2048 》/sys/fs/cgroup/cpu/foo/cpu.shares

  就把 /foo 這個(gè)控制組的 cpu.shares 參數(shù)設(shè)為了 2048。

  前面說(shuō),有些文件是每個(gè)目錄里共有的。那些就是通用的設(shè)置。其中,tasks 和 cgroups.procs 是用來(lái)管理控制組中的進(jìn)程的。要把一個(gè)進(jìn)程加入到某個(gè)控制組,把 pid 寫(xiě)入到相應(yīng)目錄的 tasks 文件即可。如

  代碼如下:

  # echo 5678 》/sys/fs/cgroup/cpu/foo/tasks

  就把 5678 進(jìn)程加入到了 /foo 控制組。那么 tasks 和 cgroups.procs 有什么區(qū)別呢?前面說(shuō)的對(duì)“進(jìn)程”的管理限制其實(shí)不夠準(zhǔn)確。系統(tǒng)對(duì)任務(wù)調(diào)度的單位是線(xiàn)程。在這里,tasks 中看到的就是線(xiàn)程 id。而 cgroups.procs 中是線(xiàn)程組 id,也就是一般所說(shuō)的進(jìn)程 id 。將一個(gè)一般的 pid 寫(xiě)入到 tasks 中,只有這個(gè) pid 對(duì)應(yīng)的線(xiàn)程,以及由它產(chǎn)生的其他進(jìn)程、線(xiàn)程會(huì)屬于這個(gè)控制組,原有的其他線(xiàn)程則不會(huì)。而寫(xiě)入 cgroups.procs 會(huì)把當(dāng)前所有的線(xiàn)程都加入進(jìn)去。如果寫(xiě)入 cgroups.procs 的不是一個(gè)線(xiàn)程組 id,而是一個(gè)一般的線(xiàn)程 id,那會(huì)自動(dòng)找到所對(duì)應(yīng)的線(xiàn)程組 id 加入進(jìn)去。進(jìn)程在加入一個(gè)控制組后,控制組所對(duì)應(yīng)的限制會(huì)即時(shí)生效。想知道一個(gè)進(jìn)程屬于哪些控制組,可以通過(guò) cat /proc/《pid》/cgroup 查看。

  要把進(jìn)程移出控制組,把 pid 寫(xiě)入到根 cgroup 的 tasks 文件即可。因?yàn)槊總(gè)進(jìn)程都屬于且只屬于一個(gè) cgroup,加入到新的 cgroup 后,原有關(guān)系也就解除了。要?jiǎng)h除一個(gè) cgroup,可以用 rmdir 刪除相應(yīng)目錄。不過(guò)在刪除前,必須先讓其中的進(jìn)程全部退出,對(duì)應(yīng)子系統(tǒng)的資源都已經(jīng)釋放,否則是無(wú)法刪除的。

  前面都是通過(guò)文件系統(tǒng)訪(fǎng)問(wèn)方式來(lái)操作 cgroups 的。實(shí)際上,也有一組命令行工具。

  lssubsys -am 可以查看各子系統(tǒng)的掛載點(diǎn),還有一組“cg”開(kāi)頭的命令可以用來(lái)管理。其中 cgexec 可以用來(lái)直接在某些子系統(tǒng)中的指定控制組運(yùn)行一個(gè)程序。如 cgexec -g “cpu,blkio:/foo” bash 。其他的命令和具體的參數(shù)可以通過(guò) man 來(lái)查看。

  下面是個(gè) bash 版的 cgexec,演示了 cgroups 的用法,也可以在不確定是否安裝命令行工具的情況下使用。

  代碼如下:

  #!/bin/bash《/p》 《p》# usage:

  # 。/cgexec.sh cpu:g1,memory:g2/g21 sleep 100《/p》 《p》blkio_dir=“/sys/fs/cgroup/blkio”

  memory_dir=“/sys/fs/cgroup/memory”

  cpuset_dir=“/sys/fs/cgroup/cpuset”

  perf_event_dir=“/sys/fs/cgroup/perf_event”

  freezer_dir=“/sys/fs/cgroup/freezer”

  net_cls_dir=“/sys/fs/cgroup/net_cls”

  cpuacct_dir=“/sys/fs/cgroup/cpuacct”

  cpu_dir=“/sys/fs/cgroup/cpu”

  hugetlb_dir=“/sys/fs/cgroup/hugetlb”

  devices_dir=“/sys/fs/cgroup/devices”《/p》 《p》groups=“$1”

  shift《/p》 《p》IFS=‘,’ g_arr=($groups)

  for g in ${g_arr[@]}; do

  IFS=‘:’ g_info=($g)

  if [ ${#g_info[@]} -ne 2 ]; then

  echo “bad arg $g” 》&2

  continue

  fi

  g_name=${g_info[0]}

  g_path=${g_info[1]}

  if [ “$g_path” == “${g_path#/}” ]; then

  g_path=“/$g_path”

  fi

  echo $g_name $g_path

  var=“${g_name}_dir”

  d=${!var}

  if [ -z “$d” ]; then

  echo “bad cg name $g_name” 》&2

  continue

  fi

  path=“$mngyroh${g_path}”

  if [ ! -d “$path” ]; then

  echo “cg not exists” 》&2

  continue

  fi

  echo “$$” 》“${path}/tasks”

  done《/p》 《p》exec $*

  上面就是Linux cgroups的相關(guān)介紹了,cgroups可提供多種功能,本文只介紹了一些cgroups基礎(chǔ)知識(shí),如果你還想了解更多的cgroups,請(qǐng)持續(xù)關(guān)注系統(tǒng)之家網(wǎng)站。

標(biāo)簽 cgroups

發(fā)表評(píng)論

0

沒(méi)有更多評(píng)論了

評(píng)論就這些咯,讓大家也知道你的獨(dú)特見(jiàn)解

立即評(píng)論

以上留言?xún)H代表用戶(hù)個(gè)人觀(guān)點(diǎn),不代表系統(tǒng)之家立場(chǎng)

其他版本軟件

熱門(mén)教程

人氣教程排行

Linux系統(tǒng)推薦

官方交流群 軟件收錄