日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

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


就把 /foo 這個(gè)控制組的 cpu.shares 參數(shù)設(shè)為了 2048 。
前面說 , 有些文件是每個(gè)目錄里共有的 。那些就是通用的設(shè)置 。其中 , tasks 和 cgroups.procs 是用來管理控制組中的進(jìn)程的 。要把一個(gè)進(jìn)程加入到某個(gè)控制組 , 把 pid 寫入到相應(yīng)目錄的 tasks 文件即可 。如
代碼如下:
# echo 5678 》/sys/fs/cgroup/cpu/foo/tasks
就把 5678 進(jìn)程加入到了 /foo 控制組 。那么 tasks 和 cgroups.procs 有什么區(qū)別呢?前面說的對(duì)“進(jìn)程”的管理限制其實(shí)不夠準(zhǔn)確 。系統(tǒng)對(duì)任務(wù)調(diào)度的單位是線程 。在這里 , tasks 中看到的就是線程 id 。而 cgroups.procs 中是線程組 id , 也就是一般所說的進(jìn)程 id。將一個(gè)一般的 pid 寫入到 tasks 中 , 只有這個(gè) pid 對(duì)應(yīng)的線程 , 以及由它產(chǎn)生的其他進(jìn)程、線程會(huì)屬于這個(gè)控制組 , 原有的其他線程則不會(huì) 。而寫入 cgroups.procs 會(huì)把當(dāng)前所有的線程都加入進(jìn)去 。如果寫入 cgroups.procs 的不是一個(gè)線程組 id , 而是一個(gè)一般的線程 id , 那會(huì)自動(dòng)找到所對(duì)應(yīng)的線程組 id 加入進(jìn)去 。進(jìn)程在加入一個(gè)控制組后 , 控制組所對(duì)應(yīng)的限制會(huì)即時(shí)生效 。想知道一個(gè)進(jìn)程屬于哪些控制組 , 可以通過 cat /proc/《pid》/cgroup 查看 。
要把進(jìn)程移出控制組 , 把 pid 寫入到根 cgroup 的 tasks 文件即可 。因?yàn)槊總€(gè)進(jìn)程都屬于且只屬于一個(gè) cgroup , 加入到新的 cgroup 后 , 原有關(guān)系也就解除了 。要?jiǎng)h除一個(gè) cgroup , 可以用 rmdir 刪除相應(yīng)目錄 。不過在刪除前 , 必須先讓其中的進(jìn)程全部退出 , 對(duì)應(yīng)子系統(tǒng)的資源都已經(jīng)釋放 , 否則是無法刪除的 。
前面都是通過文件系統(tǒng)訪問方式來操作 cgroups 的 。實(shí)際上 , 也有一組命令行工具 。
lssubsys -am 可以查看各子系統(tǒng)的掛載點(diǎn) , 還有一組“cg”開頭的命令可以用來管理 。其中 cgexec 可以用來直接在某些子系統(tǒng)中的指定控制組運(yùn)行一個(gè)程序 。如 cgexec -g “cpu , blkio:/foo” bash。其他的命令和具體的參數(shù)可以通過 man 來查看 。
下面是個(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=“$rndidtd${g_path}”
if [ ! -d “$path” ]; then

推薦閱讀