系统运维

Centos 7 升级Systemd并启用Cgroup v2

浅时光博客 · 5月18日 · 2023年 · 2.9w 次已读

一、什么是cgroup

cgroup是Linux内核提供的一种机制,用于限制、记录和隔离进程组的资源使用。它可以控制CPU、内存、IO等系统资源的分配和使用,并且支持动态调整资源限制。

使用cgroup技术可以实现多个应用程序之间的资源隔离和保护,从而避免应用程序之间的互相影响和冲突。同时,cgroup还可以用于限制系统服务的资源使用,以避免某个服务占用过多资源导致系统负载过高或崩溃。

cgroup技术被广泛应用于容器化技术中,如Docker、Kubernetes等,以帮助用户更好地管理和控制容器的资源使用,提高容器的性能和可靠性。当您使用 Kubernetes 中的资源管理功能(例如为 Pod和容器配置requestslimits)时,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 版本,再通过配置系统引导参数文章来源(Source):浅时光博客的方式将 systemd 默认 cgroup 版本切换到 v2;另一种是才用源码编译的方式进行升级;目前个人推荐使用YUM源的方式升级,由于官方在相关issue已经说明 CentOS 7版本实在太老,不建议在本系统上进行升级,且很容易出现系统崩溃的问题,这对于运行在生产环境会是相当大的问题存在。

注意:一定要关闭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
stat -fc %T /sys/fs/cgroup/

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


本文作者:浅时光博客
原文链接:https://www.dqzboy.com/12274.html
版权声明:知识共享署名-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)协议进行许可,转载时请以>超链接形式标明文章原始出处和作者信息
免责声明:本站内容仅供个人学习与研究,严禁用于商业或非法目的。请在下载后24小时内删除相应内容。继续浏览或下载即表明您接受上述条件,任何后果由用户自行承担。

0 条回应

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