一、什么是cgroup
cgroup是Linux内核提供的一种机制,用于限制、记录和隔离进程组的资源使用。它可以控制CPU、内存、IO等系统资源的分配和使用,并且支持动态调整资源限制。
使用cgroup技术可以实现多个应用程序之间的资源隔离和保护,从而避免应用程序之间的互相影响和冲突。同时,cgroup还可以用于限制系统服务的资源使用,以避免某个服务占用过多资源导致系统负载过高或崩溃。
cgroup技术被广泛应用于容器化技术中,如Docker、Kubernetes等,以帮助用户更好地管理和控制容器的资源使用,提高容器的性能和可靠性。当您使用 Kubernetes 中的资源管理功能(例如为 Pod和容器配置requests和limits)时,Kubernetes 使用 cgroups 来强制执行您的资源请求和限制。
Linux 内核提供了两个版本的 cgroup:cgroup v1 和 cgroup v2
二、什么是cgroup v2
cgroup v2是Linux内核提供的一种新版本的cgroup机制,相对于cgroup v1来说有一些重要的改进和优化。与cgroup v1不同,cgroup v2提供了更加灵活的层次结构,可以将多个cgroup嵌套在一个父cgroup中,从而更好地组织和管理资源。同时,cgroup v2也支持更多类型的资源控制,如CPU集合、内存压缩等。
另外,cgroup v2也引入了统一的hierarchy概念,使得cgroup的管理更加简单和统一。此外,cgroup v2还通过文件系统接口,提供了更加易用和直观的命令行工具,方便用户进行资源限制和查询。
cgroup v2 对 cgroup v1 进行了多项改进,例如:
- API 中单个统一的层次结构设计
- 更安全的子树委派给容器
- 更新的功能特性, 例如压力阻塞信息(
Pressure Stall Information,PSI) - 跨多个资源的增强资源分配管理和隔离
- 统一核算不同类型的内存分配(网络内存、内核内存等)
- 考虑非即时资源变化,例如页面缓存回写
与 v1 不同,cgroup v2 只有单个层级树(single hierarchy)。总之,cgroup v2相对于cgroup v1来说,在性能、可靠性、功能和易用性等方面都有所提高,因此正在逐渐成为Linux内核中的主流cgroup机制。
虽然cgroup v2早已在linux 4.5版本的时候就已经加入内核中了,而centos 8默认也已经用了4.18作为其内核版本,但是系统中仍然默认使用的是cgroup v1。
三、使用cgroup v2条件
1.1:内核版本在4.5以上
- 在 linux 4.5 版本中 cgroup v2
文章来源(Source):https://dqzboy.com 已经作为新特性加入到了内核代码,用户升级系统内核后,可以通过以下命令查看是否支持 cgroup v2 能力:
[root@localhost ~]# grep cgroup /proc/filesystems
nodev cgroup
nodev cgroup2
如果在K8s集群上启用cgroup v2需要检查Linux内核版本是否为5.8或者更高版本
~]# uname -sr
5.18.10-1.el7.elrepo.x86_64
1.2:容器运行时支持v2
- containerd v1.4 和更高版本
- cri-o v1.20 和更高版本
1.3:systemd cgroup 驱动
- kubelet 和容器运行时被配置为使用systemd cgroup 驱动
- kubernetes 1.25.0 版本已经全面支持 cgroup v2,官方文档 建议:将
cgroupDriver配置为systemd,这样将 kubelet 可以通过 systemd 在 cgroup 的 v1 和 v2 版本之间进行自适应。因此对 kubernetes/cri-runtime 进行 cgroup v2 适配,实际上是将 systemd 从默认的 cgroup v1 切换到 cgroup v2。
1.4:迁移至cgroup v2说明
(1)必须满足上面使用cgroup v2所需的条件
(2)由于v1与v2使用的是不同的API,如果之前的应用是直接访问的cgroup,那么需要将这些应用更新为支持cgroup v2的版本
- 独立运行的cAdvisor组件,需要更新到
v0.43.0或更高版本 - 比如你的项目是JAVA,那么JDK版本需要使用
JDK 11.0.16及更高版本
四、升级systemd版本
升级方案:
目前升级systemd版本有两种方案,一种是采用Facebook维护的一个第三方 Yum 仓库,通过该仓库可以将 systemd 最高升级到 234 版本,再通过配置系统引导参数
注意:一定要关闭SELINUX
sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0 && getenforce
# 查看systemd版本
[root@localhost ~]# systemctl --version

[root@localhost ~]# wget https://copr.fedorainfracloud.org/coprs/jsynacek/systemd-backports-for-centos-7/repo/epel-7/jsynacek-systemd-backports-for-centos-7-epel-7.repo -O /etc/yum.repos.d/jsynacek-systemd-centos-7.repo --no-check-certificate
[root@localhost ~]# yum update systemd

升级 systemd 后,需要重新升级当前的内核版本,然后启用新版本的 systemd。升级内核我这里就不再赘述步骤了。
- 通过
dmesg命令可以查看到当前使用的 systemd 版本:
[root@localhost ~]# dmesg | grep 'running in system mode'

五、启用cgroup v2
- 在 /etc/default/grub 下的 GRUB_CMDLINE_LINUX 中添加
systemd.unified_cgroup_hierarchy=1
~]# vim /etc/default/grub

- 运行
grub2-mkconfig命令来重新创建内核配置
grub2-mkconfig -o /boot/grub2/grub.cfg

#重新启动系统,然后重启后检查是否启用cgroupv2
~]# reboot
- 通过以下命令判断 systemd 是否正常启用
- cgroup v2,输出为
cgroup2fs - cgroup v1,输出为
tmpfs
- cgroup v2,输出为
stat -fc %T /sys/fs/cgroup/

以上就是本次文章所有知识点,如果文章对你有帮助就动动你那发财的小手,点个赞留个言,给本站加点热度。谢谢支持!

必须 注册 为本站用户, 登录 后才可以发表评论!