暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

cgroup 资源隔离

IT那活儿 2024-05-20
554
点击上方“IT那活儿”公众号--专注于企业全栈运维技术分享,不管IT什么活儿,干就完了!!!    

cpu隔离

1.1 隔离方式
  • cpuset
    以分配核心的方式进行资源隔离,可以提供的资源分配最小粒度是核心,不能提供更细粒度的资源隔离,但是隔离之后运算的相互影响最低。
    需要注意的是在服务器开启了超线程的情况下,要小心选择分配的核心,否则不同 cgroup 间的性能差距会比较大。
  • cpuquota
    提供了一种比 cpuset 可以更细粒度的分配资源的方式,并且保证了 cgroup 使用 cpu 比率的上限,相当于对 cpu 资源的硬限制。
  • cpushares
    提供了一种可以按权重比率弹性分配 cpu 时间资源的手段:当 cpu 空闲的时候,某一个要占用 cpu 的 cgroup 可以完全占用剩余 cpu 时间,充分利用资源。而当其他 cgroup 需要占用的时候,每个 cgroup 都能保证其最低占用时间比率,达到资源隔离的效果。
1.2 cpuset举例
查看系统是否支持cpuset子系统,即:内核编译选项 CONFIG_CPUSETS 是否开启。
cat /boot/config-`uname -r` | grep CONFIG_CPUSETS
如果不支持就需要重新编译系统内核挂载cpuset子系统:
//创建目录,并挂载cpuset子系统
mkdir mnt/cgroup
mount -t cgroup -o cpuset cgroup /mnt/cgroup/

//显示默认的cgroup
cd /mnt/cgroup
     cpuset.cpus //该文件用来设置关联的cpu

设置cpu隔离:
//创建子group,并设置cpu
mkdir sub_group_A
echo "{cpu_core_num, ...}" > sub_group_A/cpuset.cpus
echo "{mem_node, ...}" > sub_group_A/cpuset.mems

//设置程序
echo {program} > sub_group_A/tasks

NOTE:cpuset绑定,主要超线程的影响。


内存隔离举例

2.1 挂载内存子系统
mount -t cgroup -o memcg /mnt/cgroup

//显示默认的memory
cd /mnt/cgroup
memory.limit_in_bytes //限制内存使用的文件

2.2 设置内存隔离
//创建子group,并设置内存
mkdir sub_group_A
echo {mem_size} > sub_group_A/memory.limit_in_bytes

//设置程序
echo {program} > sub_group_A/tasks



cgconfig、cgrules的使用

3.1 安装软件
yum install libcgroup -y
yum install libcgroup-devel -y
yum install libcgroup-tools -y
systemctl start cgconfig.service
systemctl start cgred.service

3.2 配置文件
/etc/cgconfig.conf  //default configration file
/etc/cgconfig.d/    //default configration directory
/etc/cgrules.conf
/etc/cgsnapshot_blacklist.conf
/etc/sysconfig/cgred

3.3 /etc/cgconfig.conf 定义控制组,及其参数和挂载点
由mount,group,default三个部分组成。
mount部分:
mount {
          <controller> = <path>;
          ......
 }

  • <controller>
    子系统可在/proc/cgroups中找到;
    不同的<controller>可以合并挂载到相同的<path>,目录仅仅挂载一次。
  • <path>
    被挂载的目录,会被自动的创建;
    如果这部分没有,说明没有控制器被挂载。
group部分:
group <name> {
          [permissions]
          <controller> {
              <param name> = <param value>;
              ......
}
          ......
 }

  • <name>
    控制组的名字,只能是字符。
  •  [permissions]

    控制组权限,root对控制组可以做任何事情。

perm {
         task {
             uid = <task user>;
             gid = <task group>;
             fperm = <file permissions>
         }

         admin {
             uid = <task user>;
             gid = <task group>;
             dperm = <directory permissions>
             fperm = <file permissions>
         }
 }

  • task uid/gid
    用户和组的名字,拥有控制组的task文件。
  •  admin uid/gid
    用户和组的名字,拥有控制组其他的文件。
  •  <controller>
    内核子系统,如果为空,使用缺省内核参数。
  •  <param name>    
    文件名,  如:cpuset.cpus。
  •  <param value>  
    参数值, 如: "1-5,10-20"。
default部分:
default {
         perm {
             task {
                 uid = <task user>;
                 gid = <task group>;
                 fperm = <file permissions>
             }

             admin {
                 uid = <task user>;
                 gid = <task group>;
                 dperm = <directory permissions>
                 fperm = <file permissions>
            }
        }
}

默认权限,group部分中没有指定时才生效。
参考:man cgconfig.conf
3.4 /etc/cgrules.conf: 定义控制组的属主
<user>     <controllers>     <destination>
<user>:<process name>     <controllers>     <destination>

  • <user> 可以是
    - 用户名。
    - 组名,格式:@group。
    - 任意用户和组:*。
    - %, 用来表示一个用户的多行规则。
  • <process name> 
    - 进程名。
    - 程序命令行。
  • <controllers>     
    - *, 表示所有已经挂载的控制器。
    - 逗号隔开的控制器名。
  • <destination>     
    - 相对于控制器层级的路径(cgconfig.conf中定义的group)。
    - 下面是一些通配符模板:
             %u 用户名,如果解析uid失败;
             %U 用户id;
             %g 组名,如果解析gid失败;
             %G 组id;
             %p 进程名,如果名字不可用就是pid;
             %P pid 。
参考:man cgrules.conf
参考资料:https://www.v2ex.com/t/246791

END


本文作者:王佑文(上海新炬中北团队)

本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论