# 虚拟化之cgroups

虚拟化之cgroups

Control groups(cgroups) 控制组

linux内核提供的可以限制、记录、隔离进程组所使用的物理资源的机制。为容器而生,没有cgroups就没有今天的容器技术

CGroups功能

  • 资源限制(Resource Limitation):cgroups 可以对进程组使用的资源总额进行限制。如设定应用运行时使用内存的上限,一旦超过这个配额就发出 OOM(Out of Memory)。
  • 优先级分配(Prioritization):通过分配的 CPU 时间片数量及硬盘 IO 带宽大小,实际上就相当于控制了进程运行的优先级。
  • 资源统计(Accounting): cgroups 可以统计系统的资源使用量,如 CPU 使用时长、内存用量等等,这个功能非常适用于计费。
  • 进程控制(Control):cgroups 可以对进程组执行挂起、恢复等操作。

安装cgroups服务

yum -y install libcgroup
systemctl start cgconfig.service 	
systemctl enable cgconfig.service
systemctl status cgconfig

限制资源

限制资源步骤

  • 查看资源按照什么分片的
  • 知道对应资源配置文件
  • 按照资源组进行资源限制
  • 写个测试脚本进行测试

查看资源限制子系统

lssubsys

这个能够看到支持限制的所有资源

cgroups资源配置相关的目录

ls /sys/fs/cgroup/

限制CPU

限制cpu的话首先需要查看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)]

查看CPU状态

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和namespace区别

cgroups(控制组)和 namespaces(命名空间)都是 Linux 内核功能,它们都用于隔离和限制进程所使用的资源,但是关注的焦点和工作方式有所不同。

  • Namespaces主要关注的是资源隔离。通过将进程放入不同的 namespaces,你可以让这些进程各自拥有自己的全局系统资源视图,例如 PID、网络接口和挂载点等。例如,你可以让同一台机器上运行的两个进程拥有完全不同的网络配置,或者让他们各自看到不同的进程列表,即使他们实际上运行在同一台机器上。

  • cgroups,或称为控制组,主要关注的是资源限制和计费。cgroups 允许你限制进程可以使用的资源量(例如 CPU、内存、磁盘I/O 等),并跟踪这些进程使用的资源量。这对于防止某些进程占用过多资源,或者在多租户环境中计算每个租户的资源使用量非常有用。

两者可以联合使用,以创建更高级别的资源管理策略。例如,在 Linux 容器(如 Docker)中,namespaces 和 cgroups 被用于一起工作,以创建隔离的环境,它看起来就像是一个独立的 Linux 系统:namespaces 提供了资源隔离,而 cgroups 提供了资源限制。


你可能感兴趣的:(linux,云原生及容器化,网络,linux,服务器)