Control groups(cgroups) 控制组
linux内核提供的可以限制、记录、隔离进程组所使用的物理资源的机制。为容器而生,没有cgroups就没有今天的容器技术
yum -y install libcgroup
systemctl start cgconfig.service
systemctl enable cgconfig.service
systemctl status cgconfig
限制资源步骤
lssubsys
这个能够看到支持限制的所有资源
cgroups资源配置相关的目录
ls /sys/fs/cgroup/
限制cpu的话首先需要查看cpu总分片有多少,然后按照分片进行资源限制
ls /sys/fs/cgroup/cpu/
cat /sys/fs/cgroup/cpu/cpu.shares
# 比如这里cpu分片显示1024,如果你设置512的话相当于设置占用50%的cpu时间分片
资源限制一般通过资源组,资源组的配置文件为 /etc/cgconfig.conf
这个配置文件中
vim /etc/cgconfig.conf
group lowgroup {
cpu {
cpu.shares=200;
}
}
group highgroup{
cpu {
cpu.shares=824;
}
}
systemctl restart cgconfig
#!/bin/bash
a=1
while true
do
a=$[$a+1]
done
在不同终端,手动执行,打开3个
cgexec -g cpu:lowgroup sh ~/looptrue.sh # terminal 1
cgexec -g cpu:highgroup sh ~/looptrue.sh # terminal 2
# 第三个终端查看cpu情况,确认限制是否生效,这俩加起来cpu才应该是100%
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iKctr1Zd-1690816533922)(/Users/daroyal/Library/Application Support/typora-user-images/Screen Shot 2023-07-31 at 10.58.56 PM.png)]
我们看到,好像并没有限制, 因为cpu都是100%,这是因为多核cpu不太好限制资源
lscpu
# 查看cpu情况
CPU(s): 2
这里因为cpu 2核
为了更好的演示效果,我们可以把其他cpu下线处理,只保留一个cpu
lscpu
echo 0 > /sys/devices/system/cpu/cpu0/online
echo 1 > /sys/devices/system/cpu/cpu1/online
# echo 1 > /sys/devices/system/cpu/cpu0/online
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wIyNohGX-1690816533923)(/Users/daroyal/Library/Application Support/typora-user-images/Screen Shot 2023-07-31 at 11.05.44 PM.png)]
ls /sys/devices/system/cpu
cpu0 cpuidle kernel_max modalias offline possible present
cpu1 isolated microcode nohz_full online power uevent
这里的cpu0和cpu1就是我们的两个cpu
查看CPU状态
查看是否在线
cat /sys/devices/system/cpu/cpu0/online
ll /sys/fs/cgroup/
ll /sys/fs/cgroup/cpu/
cat /sys/fs/cgroup/cpu/cpu.shares
cpu分片可以按照时间分片百分比进行限制
cgroup资源组: 进程运行在具体的资源组,通过资源组进行定量限制
cgroup配置文件 cat /etc/cgconfig.conf
cgroups(控制组)和 namespaces(命名空间)都是 Linux 内核功能,它们都用于隔离和限制进程所使用的资源,但是关注的焦点和工作方式有所不同。
Namespaces主要关注的是资源隔离。通过将进程放入不同的 namespaces,你可以让这些进程各自拥有自己的全局系统资源视图,例如 PID、网络接口和挂载点等。例如,你可以让同一台机器上运行的两个进程拥有完全不同的网络配置,或者让他们各自看到不同的进程列表,即使他们实际上运行在同一台机器上。
cgroups,或称为控制组,主要关注的是资源限制和计费。cgroups 允许你限制进程可以使用的资源量(例如 CPU、内存、磁盘I/O 等),并跟踪这些进程使用的资源量。这对于防止某些进程占用过多资源,或者在多租户环境中计算每个租户的资源使用量非常有用。
两者可以联合使用,以创建更高级别的资源管理策略。例如,在 Linux 容器(如 Docker)中,namespaces 和 cgroups 被用于一起工作,以创建隔离的环境,它看起来就像是一个独立的 Linux 系统:namespaces 提供了资源隔离,而 cgroups 提供了资源限制。