对于cgroup的操作驱动,大多数linux发行版上,默认的驱动都为systemd
systemd与cgroupfs都是CGroup管理器。systemd是大多数Linux发行版原生的。当选择systemd作为Linux发行版的init system时,init proccess生成并使用root控制组
(/sys/fs/cgroup),并充当CGroup管理器。systemd与CGroup紧密集成,并为每个system unit分配一个CGroup。
简单了解到的两个驱动的区别:

cgroupfs是文件驱动修改,内核功能没有提供任何的系统调用接口,而是对 linux vfs 的一个实现,因此可以用类似文件系统的方式进行操作。
systemd封装了 cgroups 的软件也能让你通过它们定义的接口控制 cgroups 的内容,因此是通过接口调用驱动修改。

1 Cgroupfs

Cgroup提供了一个原生接口并通过cgroupfs提供(从这句话我们可以知道cgroupfs就是Cgroup的一个接口的封装)。类似于procfs和sysfs,是一种虚拟文件系统。并且cgroupfs是可以挂载的,默认情况下挂载在/sys/fs/cgroup目录。
在这里插入图片描述
可以看到这里有很多控制文件,其中以cpuset开头的控制文件都是cpuset子系统产生的,其他文件则由Cgroup产生。tasks文件记录了这个Cgroup的所有进程(包括线程),在系统启动后默认没有对Cgroup做任何配置的情况下,cgroupfs只有一个根目录,并且系统所有的进程都在这个根目录中,即所有进程pid都在根目录的tasks文件中,如下图所示:
在这里插入图片描述
Cgroupfs限制CPU、内存的简单操作方法:

#创建Cgrou,通过mkdir创建一个新的目录,也就是常见了一个新的Cgroup
mkdir /sys/fs/cgroup/cpuset/demo
#配置Cgrou,配置这个Cgroup的资源配额,通过以下命令,可以先哲这个Cgroup的进程只能在0号cpu上运行,并且只能在0号内存节点分配内存。
echo 0 > /sys/fs/cgroup/cpuset/demo/cpuset.cpus
echo 0 > /sys/fs/cgroup/cpuset/demo/cpuset.mems
#使能Cgroup,通过将进程id写进tasks文件,将整个进程移动到Cgroup中,Cgroup真正起作用了
echo KaTeX parse error: Expected 'EOF', got '#' at position 37: …set/demo/tasks #̲ 表示当前进程id

2 Systemd

Systemd也是对于Cgroup接口的一个封装。systemd以PID1的形式在系统启动的时候运行,并提供了一套系统管理守护程序、库和实用程序,用来控制、管理Linux计算机操作系统资源。通过systemd-cgls命令我们可以看到systemd工作的进程PID是1,而目录/sys/fs/cgroup/systemd是systemd维护的自己使用的非subsystem的cgroups层级结构。
在这里插入图片描述
Systemd限制CPU、内存的简单操作方法、
#限制计划任务的CPU占用为0.1个CPU,内存为200MB
systemctl set-property cron.service CPUShares=100 MemoryLimit=200M

3 Docker

通过docker-daemon.json文件可配置启动参数,修改对应的cgroupdriver=systemd

sudo mkdir /etc/docker
cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

sudo systemctl daemon-reload
sudo systemctl restart docker

4 K8s

更改kubelet的CGroup驱动(配置文件位于/var/lib/kubelet/config.yaml)
在这里插入图片描述
或者
vim /etc/sysconfig/kubelet
KUBELET_CGROUP_ARGS=“–cgroup-driver=systemd”
systemctl daemon-reload
systemctl restart kubelet

cat /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
systemctl daemon-reload
systemctl restart kubelet

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐