黄页网站怎么查,wordpress主题手动安装,腾讯企业邮箱登录页面,诚信档案建设网站首页前言
Linux 内核负责系统中所有进程与硬件的安全交互#xff0c;内核必须确保将硬件资源合理分配给各个进程#xff0c;以确保计算机可以正常运行。不至于某一个进程直接占用完所有资源#xff0c;导致其它进程无法工作#xff0c;甚至操作系统直接崩溃。比如#xff0c;…前言
Linux 内核负责系统中所有进程与硬件的安全交互内核必须确保将硬件资源合理分配给各个进程以确保计算机可以正常运行。不至于某一个进程直接占用完所有资源导致其它进程无法工作甚至操作系统直接崩溃。比如内核引入了OOMOut Of Memory Killer 机制在系统内存耗尽前内核会主动 kill 掉某些进程以释放足够的内存防止系统崩溃。
既然内核知道哪些进程占用了大量的资源从而选择牺牲掉部分进程而保护核心进程那么内核自然也应该具备预先对进程占用资源进行限制的能力这就是 cgroup 诞生的背景。
Linux cgroupControl Groups技术诞生于2007年由 Google 的工程师发起目的是为了解决资源管理和隔离的问题。cgroup 可以限制进程组使用的 CPU、内存、磁盘 I/O 和网络带宽等资源防止某些进程过度消耗资源影响系统的整体性能并且可以实时地监控进程的监控与统计信息。
cgroup 的引入极大地增强了 Linux 系统在多租户环境下的资源管理能力是容器技术得以实现的重要基础。
cgroup 组成
cgroup 技术主要由以下几个组件组成
子系统Subsystems也称为控制器Controllers用于执行资源限制和管理。常见的子系统包括 cpu限制和监控CPU使用。memory限制和监控内存使用。blkio限制和监控块设备I/O。net_cls 和 net_prio管理网络带宽。pids限制进程数量。 层级Hierarchycgroup 是分层的允许创建父子关系的组。每个层级可以附加不同的子系统。cgroup 目录结构在文件系统中每个 cgroup 是一个目录包含用于配置和监控的文件。
这些组件共同工作实现对系统资源的精细控制和管理。
cgroup v1 v2
cgroup 存在两个版本分别是 v1、v2。
cgroups v1 是最初的实现随着时间的推移用户和开发者发现了一些设计上的局限性和复杂性。cgroups v2 是对 v1 的改进旨在解决其复杂性和一致性问题同时引入新的功能。两个版本共存是为了给用户和开发者提供过渡时间以便从 v1 迁移到 v2。
v1 和 v2 的区别主要有
v1 是模块化的每个子系统如 CPU、内存、I/O 等都有自己的层次结构因此管理和配置变得复杂v2 所有子系统共享一个单一的层次结构简化了管理v2 提供了更一致和简化的接口减少了配置的复杂性v2 提供了更精细的资源控制和隔离能力
cgroup 以文件系统的方式挂载到主机如下示例采用的是 v2 版本对应本地的/sys/fs/cgroup 目录。 /sys/fs/cgroup# mount | grep cgroup
cgroup2 on /sys/fs/cgroup type cgroup2cgroup v2 使用
要使用 cgroup你需要先给控制组取个名字然后在 /sys/fs/cgroup 下创建一个同名文件夹接着内核会自动生成一组文件和子目录这些文件和目录用于配置和监控 cgroup 的资源使用情况。
例如新建控制组 mygroupmkdir /sys/fs/cgroup/mygrou 创建文件夹后会发现内核已经帮我们创建好了子文件。 ls /sys/fs/cgroup/mygroup
cgroup.controllers cgroup.subtree_control cpu.uclamp.max cpuset.mems.effective memory.events.local memory.stat
cgroup.events cgroup.threads cpu.uclamp.min io.max memory.high memory.swap.current
cgroup.freeze cgroup.type cpu.weight io.pressure memory.low memory.swap.events
cgroup.kill cpu.idle cpu.weight.nice io.prio.class memory.max memory.swap.high
cgroup.max.depth cpu.max cpuset.cpus io.stat memory.min memory.swap.max
cgroup.max.descendants cpu.max.burst cpuset.cpus.effective io.weight memory.numa_stat pids.current
cgroup.procs cpu.pressure cpuset.cpus.partition memory.current memory.oom.group pids.events
cgroup.stat cpu.stat cpuset.mems memory.events memory.pressure pids.max要限制某个进程的资源直接把进程 ID 写入到cgroup.procs 文件即可如下所示把当前进程 ID 写入 echo $$ /sys/fs/cgroup/mygroup/cgroup.procscat /sys/fs/cgroup/mygroup/cgroup.procs
74343
78507限制 cpu 资源
前面已经把当前进程 ID 写入到cgroup.procs 代表当前进程已经被 mygroup 管理了。
要想限制进程的 cpu 资源把配置写到目录下的cpu.max 文件即可先查看格式 cat /sys/fs/cgroup/mygroup/cpu.max
20000 100000cpu.max 格式组成max_quota max_periodmax_period 是时间周期单位是微妙默认是 100000μs即 100ms。max_quota 是在这个时间周期内进程最多可以占用 cpu 的时间默认是 20000μs即 20ms。默认配置意味着进程最多可以占用 1/5 个cpu 核心。
现在我们让当前进程最多占用 0.5 个 cpu 核心 echo 50000 100000 /sys/fs/cgroup/mygroup/cpu.max测试验证当前进程运行一个死循环打满 cpu。 while : ; do : ; done top 命令查看 cpu 的使用情况我的主机是 2 核的所以实际占用 25% 左右限制生效了。 另外/sys/fs/cgroup/mygroup/cpu.stat 文件也详细记录了进程对 cpu 的消耗情况 cat /sys/fs/cgroup/mygroup/cpu.stat
usage_usec 87248657
user_usec 87068432
system_usec 180224
nr_periods 2531
nr_throttled 2448
throttled_usec 158217434限制 memory 资源
cgroup 限制进程内存资源对应的是memory.max 文件默认值 max 表示无限制 cat /sys/fs/cgroup/mygroup/memory.max
max这里修改配置限制最大内存 10M echo $((10 * 1024 * 1024)) /sys/fs/cgroup/mygroup/memory.maxcat /sys/fs/cgroup/mygroup/memory.max
104857600然后写个程序申请 20M 内存然后写满 0目的是真的申请物理内存 cat alloc.c
#include stdlib.h
#include stdio.hint main() {size_t size 1024 * 1024 * 20; // 20 MBvoid *ptr malloc(size);memset(ptr, 0, size);return 0;
}gcc 编译代码然后执行进程会被 kill代表内存限制生效了 gcc alloc.c./a.out
Killed其它类型的案例这里不再展示。
尾巴
Linux cgroupControl Groups技术可以限制进程组使用的CPU、内存、磁盘I/O等资源防止某个进程消耗过多资源影响系统稳定性。cgroup是容器技术如Docker、Kubernetes的基础确保每个容器的资源使用互不干扰。限制容器的资源使用防止恶意或错误的进程影响宿主机。
cgroup与命名空间namespace结合提供了容器化技术的核心功能实现了高效的资源管理和隔离。