一 、cgroup
① CGroups概述
CGroups 全称为 'Linux Control Group',其作用是'限制'一组'进程'使用的'资源'上限
思考1:既然是限制'进程'使用的'资源',为什么又说CGroups是容器技术'核心实现'原理之一
思考2:限制哪些'资源'?
备注:后续性能'优化'会用到这些'资源指标'
+++++++++++++++++++++++ "分割线" +++++++++++++++++++++++
引出:容器'本质'或者说对外表现,本身就是所寄托'宿主机'的一个'进程[process]'
引申:容器中的'资源管理'是通过'cgroup'实现的 --> '怎么管理的?'
② CGroups
的四个基本概念
(0) 'CGroup' 即'控制组'
1、一个控制组就是一组'按照某种标准划分'的 Tasks
2、可以理解为资源限制是以'进程组'为单位实现的
3、一个进程'加入'到某个控制组后,就会受到'相应配置'的资源限制
(1) '子系统'
1、cgroups中最关键的是一个概念就是到'子系统 subsystem'
2、每一个subsystem代表一种'资源的控制能力'
3、每个subsystem下可以建立'cgroups控制组',并写入'进程号',以起到对进行'限制资源'的作用
(2) 'Task'
在 cgroup 中,task 可以理解为一个进程,实际上是'进程 ID' 和'线程 ID 列表'
(3) Hierarchy '层级结构'
1、cgroup 的'层级'组织关系,cgroup 以'树形'层级组织
2、每个 cgroup 子节点'默认继承'其父 cgroup 节点的配置属性 --> '继承'
3、这样每个 Hierarchy 在'初始化'会有 root cgroup
一文搞懂ss/css/css_set/cgroup/hierarchy的关系
++++++++++++++++++++++++++++++++++"三步走原理"++++++++++++++++++++++++++++++++++
1、创建'控制组'
1) 在 Linux 中,通过在文件系统'/sys/fs/cgroup'中创建'目录'来创建'控制组'
2) 每个目录对应'一个'控制组
2、进行资源'限制'
1) 每个 Cgroup 目录下都会有一些'文件',这些文件对应于'不同资源'的限制
2) 管理员可以通过'echo 写入'这些文件来控制资源
备注:无法通过'vi/vim'方式进行编辑
3) 例如:
[1]、通过 'memory.limit_in_bytes' 文件可以设置'内存'的限制
[2]、通过 'cpu.cfs_quota_us' 文件可以限制 'CPU' 使用的'时间'
3、进程加入 Cgroup '控制组'
[1]、可以通过将'进程的 PID' 写入到 Cgroup 目录控制组的 'tasks' 文件中
[2]、将该进程'加入'到相应的 Cgroup 中,之后'进程的资源'使用将受到该 Cgroup 配置的限制
④ SubSystem 子系统
问题:查看'当前机器'的cgroup都支持对'哪些资源'进行控制? 查看cgroup 能限制哪些资源?
需求0:查看当前'支持的所有subsys 子系统'
lssubsys -a
需求1:查看'单个subsys'挂载的hierarchy
lssubsys –m cpu
需求2:查看当前'所有subsys'与对应的'挂载点'
lssubsys -am
hugetlb和hugepage技术分析 使用 hugetlb 提升性能
说明: cgroup 'v1'和'v2'版本限制的资源不同
1、查看'cgroups 版本' --> 'cgroup v1'
cgroup v1和v2的区别 判断cgroup是v1还是v2
cat /proc/cgroups
说明:在/proc/cgroups中可以看见'被编译进当前内核'的所有'subsystem'
需求:查看当前'所有'cgroup --> 'lscgroup' --> 这里只过滤'mysqld'服务
输出格式:'subsystem:/*/*' --> 与'层级目录'的关系
⑤ CGroups特点
在'使用 CGroups' 时需要'先挂载',我们可以使用 'df -h | grep cgroup' 命令进行查看
cgroup 其实是一种'文件系统'类型,所有的操作都是通过'文件'来完成的
备注:可以使用 'mount --type cgroup'命令查看当前系统'挂载了'哪些 cgroup: