我的编程空间,编程开发者的网络收藏夹
学习永远不晚

linux中cgroups怎么用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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怎么用”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

linux中cgroups怎么用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

linux中cgroups怎么用

这篇文章主要介绍了linux中cgroups怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。从 2.6.24 版本开始,linux 内核提供了一个叫做 cgroups(控
2023-06-13

Linux中如何使用cgroups限制cpu

这篇文章主要讲解了“Linux中如何使用cgroups限制cpu”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux中如何使用cgroups限制cpu”吧!cgroups 里,可以用 c
2023-06-13

Linux中如何使用cgroups控制内存资源

这篇文章将为大家详细讲解有关Linux中如何使用cgroups控制内存资源,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。cgroups 中有个 memory 子系统,用于限制和报告进程的内存使用情况。其中
2023-06-13

Linux中如何使用cgroups管理进程磁盘io

这篇文章给大家分享的是有关Linux中如何使用cgroups管理进程磁盘io的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。linux 的 cgroups 还可以限制和监控进程的磁盘 io。这个功能通过 blkio
2023-06-13

Linux中!怎么用

小编给大家分享一下Linux中!怎么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!执行上一条命令例如,在执行完上面一条命令后,可以使用下面的方式再次执行上一条命令:$ whereis bash #执行命令 bash:
2023-06-16

linux中shellcheck怎么用

小编给大家分享一下linux中shellcheck怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!shellcheckshellcheck就是这样的一个工具。
2023-06-15

linux中ClusterShell怎么用

这篇文章给大家分享的是有关linux中ClusterShell怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。ClusterShellClusterShell 是一个事件驱动的开源 Python 库,旨在在服
2023-06-16

linux中at怎么用

这篇文章主要为大家展示了“linux中at怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“linux中at怎么用”这篇文章吧。在linux中,at用于规定在一个指定的时间执行一个指定任务,语
2023-06-22

Linux中tcpreplay怎么用

这篇文章将为大家详细讲解有关Linux中tcpreplay怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Linux常用命令tcpreplay是一种pcap包的重放工具,它可以将用ethreal、wi
2023-06-28

linux中for怎么用

这篇文章主要为大家展示了“linux中for怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“linux中for怎么用”这篇文章吧。在linux中,for命令用于创建一个循环,该循环通过一系列
2023-06-22

Linux中usernetctl怎么用

这篇文章给大家分享的是有关Linux中usernetctl怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Linux常用命令usernetctl命令在用于被允许时操作指定的网络接口。在使用上和”ifup”、”
2023-06-28

linux中curl怎么用

这篇文章将为大家详细讲解有关linux中curl怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是 curl ?curl 是用于构造 HTTP 请求的命令行工具。我喜欢使用 curl,因为它能够很
2023-06-16

linux中Hegemon怎么用

小编给大家分享一下linux中Hegemon怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Hegemon 是什么?Hegemon 是一个正在开发中的模块化系
2023-06-16

linux中kvm怎么用

这篇文章主要为大家展示了“linux中kvm怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“linux中kvm怎么用”这篇文章吧。一、kvm的安装及状态查看1、安装软件yum -y inst
2023-06-09

Linux中Inxi怎么用

这篇文章将为大家详细讲解有关Linux中Inxi怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Inxi 最初是为控制台和 IRC(网络中继聊天)开发的一个强大且优秀的命令行系统信息脚本。可以使用它
2023-06-16

linux中rtop怎么用

小编给大家分享一下linux中rtop怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!rtop 是一个基于 SSH 的直接的交互式远程系统监控工具,它收集并显
2023-06-16

linux中OnionShare怎么用

这篇文章将为大家详细讲解有关linux中OnionShare怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。OnionShare: 通过 Tor 匿名分享文件OnionShare 是一款有趣的开源工具
2023-06-15

linux中怎么用PiShrink

小编给大家分享一下linux中怎么用PiShrink,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!安装 PiShrink要在 Linux 机器上安装 PiShri
2023-06-16

linux中tmux怎么用

小编给大家分享一下linux中tmux怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!tmux 是终端复用器terminal multiplexer的缩写,它
2023-06-16

Linux中MySQL怎么用

这篇文章将为大家详细讲解有关Linux中MySQL怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.show databases;2.use mysql转换database3.show tables
2023-06-03

编程热搜

目录