Windows XP Windows 7 Windows 2003 Windows Vista Windows教程綜合 Linux 系統教程
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟件教程
 Windows教程網 >> Linux系統教程 >> 關於Linux >> Linux中cgroups的基礎知識

Linux中cgroups的基礎知識

日期:2017/1/25 10:53:46      編輯:關於Linux

  Linux下cgroups可用於物理內存的控制,適用於多種應用場景,因為cgroups中的東西較多,本文就給大家簡單介紹下Linux cgroups,讓大家對其有個初步的了解。

 Linux中cgroups的基礎知識

  從 2.6.24 版本開始,linux 內核提供了一個叫做 cgroups(控制組)的特性。cgroups 就是 control groups 的縮寫,用來對一組進程所占用的資源做限制、統計、隔離。也是目前輕量級虛擬化技術 lxc (linux container)的基礎之一。每一組進程就是一個控制組,也就是一個 cgroup。cgroups 分為幾個子系統,每個子系統代表一種設施或者說是資源控制器,用來調度某一類資源的使用,如 cpu 時鐘、內存、塊設備 等。在實現上,cgroups 並沒有增加新的系統調用,而是表現為一個 cgroup 文件系統,可以把一個或多個子系統掛載到某個目錄。如

  代碼如下:

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

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

  代碼如下:

  #!/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.” 開頭的就是這個子系統裡特有的東西。其他的那些是每個子系統所對應目錄裡都有的。這些文件就是用來讀取資源使用信息和進行資源限制的。要創建一個控制組,就在需要的子系統裡創建一個目錄即可。如 mkdir /sys/fs/cgroup/cpu/foo 就創建了一個 /foo 的控制組。在新建的目錄裡就會出現同樣一套文件。在這個目錄裡,也一樣可以繼續通過創建目錄來創建 cgroup。也就是說,cgroup 是可以和目錄結構一樣有層次的。對與每個子系統掛載點點目錄,就相當於根目錄。每一條不同的路徑就代表了一個不同的 cgroup。在不同的子系統裡,路徑相同就代表了同一個控制組。如,在 cpu、memory 中都有 foo/bar 目錄,就可以用 那 /foo/bar 來操作 cpu、memory 兩個子系統。對於同一個子系統,每個進程都屬於且只屬於一個 cgroup,默認是在根 cgroup。層次結構方便了控制組的組織和管理,對於某些配置項來說,層次結構還和資源分配有關。另外,也可以修改某個目錄的 owner ,讓非 root 用戶也能操作某些特定的安全組。

  cgroups 的設置和信息讀取是通過對那些文件的讀寫來進行的。例如

  代碼如下:

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

  就把 /foo 這個控制組的 cpu.shares 參數設為了 2048。

  前面說,有些文件是每個目錄裡共有的。那些就是通用的設置。其中,tasks 和 cgroups.procs 是用來管理控制組中的進程的。要把一個進程加入到某個控制組,把 pid 寫入到相應目錄的 tasks 文件即可。如

  代碼如下:

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

  就把 5678 進程加入到了 /foo 控制組。那麼 tasks 和 cgroups.procs 有什麼區別呢?前面說的對“進程”的管理限制其實不夠准確。系統對任務調度的單位是線程。在這裡,tasks 中看到的就是線程 id。而 cgroups.procs 中是線程組 id,也就是一般所說的進程 id 。將一個一般的 pid 寫入到 tasks 中,只有這個 pid 對應的線程,以及由它產生的其他進程、線程會屬於這個控制組,原有的其他線程則不會。而寫入 cgroups.procs 會把當前所有的線程都加入進去。如果寫入 cgroups.procs 的不是一個線程組 id,而是一個一般的線程 id,那會自動找到所對應的線程組 id 加入進去。進程在加入一個控制組後,控制組所對應的限制會即時生效。想知道一個進程屬於哪些控制組,可以通過 cat /proc/《pid》/cgroup 查看。

  要把進程移出控制組,把 pid 寫入到根 cgroup 的 tasks 文件即可。因為每個進程都屬於且只屬於一個 cgroup,加入到新的 cgroup 後,原有關系也就解除了。要刪除一個 cgroup,可以用 rmdir 刪除相應目錄。不過在刪除前,必須先讓其中的進程全部退出,對應子系統的資源都已經釋放,否則是無法刪除的。

  前面都是通過文件系統訪問方式來操作 cgroups 的。實際上,也有一組命令行工具。

  lssubsys -am 可以查看各子系統的掛載點,還有一組“cg”開頭的命令可以用來管理。其中 cgexec 可以用來直接在某些子系統中的指定控制組運行一個程序。如 cgexec -g “cpu,blkio:/foo” bash 。其他的命令和具體的參數可以通過 man 來查看。

  下面是個 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=“${d}${g_path}”

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

  echo “cg not exists” 》&2

  continue

  fi

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

  done《/p》 《p》exec $*

  上面就是Linux cgroups的相關介紹了,cgroups可提供多種功能,本文只介紹了一些cgroups基礎知識,如果你還想了解更多的cgroups,請持續關注系統之家網站。

Copyright © Windows教程網 All Rights Reserved