Cgroup 控制组学习(二)
二 CGroups实验
本'篇章'主要是通过一些'实验案例场景'加深对'cgroup'的理解
① 前置回顾
前置1:'/sys/fs/cgroup' 目录下的'每个子目录'就对应着一个'子系统'补充:/sys/fs/cgroup 目录下列了各个subsystem'资源管理器'eg: CGroups 的 memory 子系统的'挂载点'是 /sys/fs/cgroup/memory前置2:cgroup是一种伪'文件系统'
② 查看systemd管理的mysqld服务进程cgroup
前置: 在'节点上'使用 systemd 管理了一个 'mysqld'的应用思考: 如何查看 'mysqld 进程'所在的 cgroup操作: 'systemctl status mysqld' 命令查看 'mysqld 进程'所在的 cgroup 为 /system.slice/mysqld.service
分析:上面显示的 CGroup 只是一个'相对'的路径,实际的'文件系统目录'是在对应的'子系统'下面
③ cgroup管理器
浅谈 Cgroups 和 Systemd linux中 Systemd 和 cgroups 的关系详解
++++++++++++ "containerd设置cgroup驱动" ++++++++++++1)在 'containerd' 的配置中,通常设置'--cgroup-manager=systemd'2)通过containerd '配置文件' /etc/containerd/config.toml 中的'SystemdCgroup参数'切换说明:SystemdCgroup = false --> 切换为'cgroupfs'驱动补充:如果'cat /proc/<容器PID>/cgroup'路径包含'system.slice'则使用'systemd'驱动
④ Centos系统使用libcgroup-tools管理控制组
+++++++++++ 掌握'cgcreate'、'cgclassify'、'cgdelete'、'cgexec'命令 +++++++++++1、使用cgcreate命令创建一个'新的控制组'cgcreate -g cpu,memory:wzj说明:在/sys/fs/cgroup目录下创建一个名为'wzj'的控制组,并关联'CPU'和'memory'子系统2、添加'进程'到控制组使用'cgclassify命令'将进程添加到'控制组'中cgclassify -g cpu,memory:wzj PID3、从控制组中'移动进程'使用cgclassify命令将进程从'一个'控制组移动到'另一个'控制组:cgclassify -g cpu,memory:another_wzj PID8) '删除'控制组使用'cgdelete'命令删除一个控制组:cgdelete cpu,memory:wzj
⑤ 手动创建空目录的形式管理控制组
实验目的:CGroup 如何'限制CPU'说明:mkdir创建'控制组【空目录】',会自动继承'父级'的特性备注:不推荐mkdir的方式+++++++++++++++++++++++ "【1】创建控制组" +++++++++++++++++++++++1)在 /sys/fs/cgroup/cpu 文件夹中新建'空目录' demo 2) demo 继承 'cpu 子系统',cgroups 的文件系统会在创建文件目录的时候'自动创建'这些配置文件
+++++++++++++++++++++++ "【2】启动服务获取进程pid号" +++++++++++++++++++++++1) 简单的 'Python 脚本'来消耗 CPU --> 'cpu 100%'# wzj.pywhile True:pass2) 通过'stress'命令方式stress -c 1 &>/dev/null & --> 'cpu 100%'3) #vim test.sh --> '创建一个无限循环的脚本'while :do:done
使用stress命令进行压力测试cpu、内存、磁盘
+++++++++++++++++++++++ "【3】将进程pid写入到tasks文件中" +++++++++++++++++++++++1、现在我们将这个进程 ID '' 写入到 /sys/fs/cgroup/cpu/demo/tasks 文件下面去等价命令 'cgexec -g cpu:demo python wzj.py' 将该程序'绑定'限制内存的 cgroup 执行这个命令是cgroup启动的cgexec命令在'指定的cgroup中'运行任务,不需要自己写入'tasks'中2、然后设置 /sys/fs/cgroup/cpu/demo/cpu.cfs_quota_us 为 10000us效果:在'每个100毫秒'的'调度周期'内,最多只能使用'10毫秒'的CPU时间3、效果:限制 该'pid' CPU 使用率为 '10%'备注:因为 cpu.cfs_period_us 默认值为 100000us
++++++++++++++++++++ "【4】使用 top 命令验证CPU使用率是否收限" ++++++++++++++++++++
++++++++++++++++++++ "【5】清理测试环境" ++++++++++++++++++++说明:如果要删除这个 'cgroup','rm'直接删除文件夹是不行的,需要通过'cgdelete'意外之喜:即使是'root'权限,也无法通过'rm'方式删除'cgroup'控制组的内容补充:kill -9 3286 --> '干掉服务进程'
⑥ cpu子系统各文件含义
1、前面讲解了'cpu.cfs_quota_us'和'cpu.cfs_period_us'参数来限制'CPU使用'
2、cpu.shares --> 按'权重比例'设定 CPU 的分配1)定义了cgroup在竞争CPU资源时'相对于其他cgroup'的'优先级'2) 默认值为'1024',范围从2到262144eg: 【1】如 cgroup A 设置 100,cgroup B 设置 300,那么cgroup A中的task运行 25% 的 CPU 时间【2】对于一个 4 核 CPU 的系统来说,cgroup A 中的 task 可以 100% 占有某一个 CPU备注:这个比例是'相对整体'的一个值
3、cpu.stat:'统计信息',包含:1)nr_periods (表示经历了几个cfs_period_us周期)2)nr_throttled (表示 task 被限制的次数)3)及throttled_time(表示 task 被限制的总时长)
4、'cpuacct' 控制选项备注:这个子系统的配置是'cpu子系统的补充',提供 CPU '资源用量的统计',时间单位都是'纳秒'
5、'cpuset' 控制选项 --> '指定进程绑定cpu'备注:'/sys/fs/cgroup/cpuset' 文件