基础知识是啥

基础知识是啥,第1张

Linux中cgroups的基础知识

Linux下的Cgroups可以用来 *** 纵物理内存,适用于各种应用领域。由于cgroups的条目比较多,芒果云就给大家详细讲解一下linux下的CgroupsCgroups是controlgroups的缩写,是Linuxcore呈现的一种可以对物理资源(如cpu、内存、IO等)进行限制、记录和保护的系统。)由过程组应用。

从2.6.24版本开始,linux内核就出现了一个叫cgroups(控制组)的特性。Cgroups是controlgroups的缩写,用于限制、统计分析和保护一组进程占用的资源。也是目前轻量虚拟技术lxc(linux容器)的基础之一。每组进程是一个控制组,它是一个cgroup。Cgroups分为许多子系统,每个子系统意味着一种设备,也就是说,一个资源控制板,它用来产生和调度某一种资源的应用程序,如cpu数字时钟、运行内存、块机设备等。从完成度上来说,cgroups并没有升级新的系统进程,而主要表现为一个cgroup系统文件,可以把一个或几个子系统挂载到某个目录下。诸如

编码如下:

mount-tcgroup-oCPUCPU/sys/fs/cgroup/CPU

cpu子系统安装在/sys/fs/cgroup/cpu上。你也可以把几个子系统挂载在一个目录下,甚至可以全部挂载在一个目录下,但是我觉得把每个子系统挂载在不同的目录下会有更强的协调能力。使用mount|awk'$5=="cgroup"{print$0}'查看今天装载的控制组。使用cat/proc/cgroups,可以看到今天所有控制组的情况。以下脚本可以将所有子系统挂载到不同的目录中。

编码如下:

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

subsys="${2:-blKIOCPUCPUCCTCPUsetdevicesfreezermemorynet_clsnet_prionsperf_event}"《/p》p"mount-ttmpfscgroup_root"${cgroot}"

对于以$subsys表示的ss;做

mkdir-p"$cgroot/$ss"

mount-tcgroup-o"$ss""$ss""$CGroot/$ss"

完成的

看看这些目录里都有什么,比如ls/sys/fs/cgroup/cpu。

编码如下:

cgroup.event_controlCPU.CFS_period_usCPU.rt_period_usCPU.sharesnotify_on_release任务

cgroup.procsCPU.CFS_quota_usCPU.rt_runtime_usCPU.statrelease_agent

什么以“cpu”开头是该子系统中的唯一项目。其他的都是各子系统匹配的,都在目录里。这种文档用于加载资源应用的信息内容,限制资源。要建立一个控制组,只需在必要的子系统中建立一个目录。比如mkdir/sys/fs/cgroup/cpu/foo建立了一个/foo的控制组。同一组文档将出现在新创建的目录中。在这个目录下,可以根据建立的目录重新建立cgroup。换句话说,cgroup可以像目录结构一样具有层次结构。为每个子系统安装一个小目录相当于根目录。每种不同的方式都意味着不同的群体。在不同的子系统中,方式也意味着相同的控制组。例如,如果cpu和内存上都有foo/bar目录,那么可以使用那个/foo/bar来实际 *** 作cpu和内存这两个子系统。对于同一个子系统,每个进程只属于一个cgroup,默认设置在根cgroup。结构分析有助于控制组的组织和管理方法。对于某些设备项目,结构分析也与资源分配有关。此外,您可以更改目录的所有者,以便非根用户可以实际 *** 作一些特殊的安全组。

cgroups的设置和信息内容的加载是基于这些文档的读写能力。例如

编码如下:

#echo2048"/sys/fs/cgroup/CPU/foo/CPU.shares

控制组/foo的cpu.shares主参数设置为better2048。

如前所述,每个目录中都有一些文档。这些是通用设置。其中,tasks和cgroups.procs用于管理方法控制组中的流程。要向控制组添加流程,只需将pid加载到相对目录下的tasks文档中。诸如

编码如下:

#echo5678"/sys/fs/cgroup/CPU/foo/tasks

将5678进程添加到/foo控制组中。那么tasks和cgroups.procs有什么区别呢?其实前面提到的“过程”的管理方法的定义是不够准确的。同步系统线程的企业是线程。这里,您在任务中看到的是线程id。在cgroups.procs中是线程组id,通常称为进程id。当一个通用pid加载到任务中时,只有与这个pid匹配的线程和它引起的其他进程、线程才会属于这个控制组,而原来的其他线程就不容易了。并且加载cgroups.procs会添加今天所有的线程。如果用通用线程id而不是线程组id加载cgroups.procs,它将自动找到匹配的线程组id并添加它。流程添加控制组后,控制组匹配的限制将立即生效。如果想知道一个进程属于哪个控制组,可以根据cat/proc/PID/cgroup查询。

要从控制组中删除流程,请将pid加载到根cgroup的tasks文档中。由于每个进程只属于一个cgroup,所以在添加新的cgroup后,原来的关联将被消除。要删除cgroup,可以使用rmdir删除相对目录。但是,在删除它之前,必须先退出其中的所有进程,并且匹配的子系统的资源已经被释放,否则无法删除。

前面部分实际上是按照系统文件浏览方式来 *** 作cgroups的。其实也有一套命令行工具。

Lssubsys-am可以查询每个子系统的挂载点,一组以“cg”开头的指令可以用于管理方法。其中cgexec可用于立即运行某些子系统中特定控制组中的程序流。例如CGexec-g“CPU,blKIO:/foo”bash。其他指令和实际主要参数可根据man查询。

下面是cgexec的bash版本,演示了如何使用cgroups,可以在不确定是否安装命令行工具的情况下应用。

编码如下:

#!/bin/bash“/p”《p》#用法:

#。/cgexec.shcpu:g1,内存:G2/g21sleep100《p》blKIO_dir="/sys/fs/cgroup/blKIO"

memory_dir="/sys/fs/cgroup/memory"

CPUset_dir="/sys/fs/cgroup/CPUset"

性能事件目录="/sys/fs/cgroup/性能事件"

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》groups="$1"

shift“/p”《p》IFS=','g_arr=($groups)

对于${g_arr[@]}中的g;做

IFS=':'g_info=($g)

if[${#g_info[@]}-ne2];然后

回声"坏参数g"&;2

继续

船方不负担装货费用

g_name=${g_info[0]}

g_path=${g_info[1]}

if["$g_path"=="${g_path#/}"];然后

g_path="/$g_path"

船方不负担装货费用

echo$g_name$g_path

var="${g_name}_dir"

d=${!var}

if[-z"$d"];然后

回声"坏cg名称$g_name"&;2

继续

船方不负担装货费用

path="${d}${g_path}"

如果[!-d"$path"];然后

回声"cg不存在"&2

继续

船方不负担装货费用

回显“$$”“${path}/tasks”

done“/p”《p》exec$*

以上是我总结的Linuxcgroups的详细介绍。cgroups可以扮演各种角色。本文只详细介绍cgroups的一些基础专业知识。如果你想掌握大量的cgroups,请随时关注SystemHome的网站。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/770936.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-02
下一篇 2022-05-02

发表评论

登录后才能评论

评论列表(0条)

保存