cpu隔离
cpuset 以分配核心的方式进行资源隔离,可以提供的资源分配最小粒度是核心,不能提供更细粒度的资源隔离,但是隔离之后运算的相互影响最低。 需要注意的是在服务器开启了超线程的情况下,要小心选择分配的核心,否则不同 cgroup 间的性能差距会比较大。 cpuquota 提供了一种比 cpuset 可以更细粒度的分配资源的方式,并且保证了 cgroup 使用 cpu 比率的上限,相当于对 cpu 资源的硬限制。 cpushares 提供了一种可以按权重比率弹性分配 cpu 时间资源的手段:当 cpu 空闲的时候,某一个要占用 cpu 的 cgroup 可以完全占用剩余 cpu 时间,充分利用资源。而当其他 cgroup 需要占用的时候,每个 cgroup 都能保证其最低占用时间比率,达到资源隔离的效果。
cat /boot/config-`uname -r` | grep CONFIG_CPUSETS
//创建目录,并挂载cpuset子系统
mkdir mnt/cgroup
mount -t cgroup -o cpuset cgroup /mnt/cgroup/
//显示默认的cgroup
cd /mnt/cgroup
cpuset.cpus //该文件用来设置关联的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绑定,主要超线程的影响。
内存隔离举例
mount -t cgroup -o memcg /mnt/cgroup
//显示默认的memory
cd /mnt/cgroup
memory.limit_in_bytes //限制内存使用的文件
//创建子group,并设置内存
mkdir sub_group_A
echo {mem_size} > sub_group_A/memory.limit_in_bytes
//设置程序
echo {program} > sub_group_A/tasks
cgconfig、cgrules的使用
yum install libcgroup -y
yum install libcgroup-devel -y
yum install libcgroup-tools -y
systemctl start cgconfig.service
systemctl start cgred.service
/etc/cgconfig.conf //default configration file
/etc/cgconfig.d/ //default configration directory
/etc/cgrules.conf
/etc/cgsnapshot_blacklist.conf
/etc/sysconfig/cgred
mount {
<controller> = <path>;
......
}
<controller> 子系统可在/proc/cgroups中找到; 不同的<controller>可以合并挂载到相同的<path>,目录仅仅挂载一次。 <path> 被挂载的目录,会被自动的创建; 如果这部分没有,说明没有控制器被挂载。
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 {
perm {
task {
uid = <task user>;
gid = <task group>;
fperm = <file permissions>
}
admin {
uid = <task user>;
gid = <task group>;
dperm = <directory permissions>
fperm = <file permissions>
}
}
}
<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 。

本文作者:王佑文(上海新炬中北团队)
本文来源:“IT那活儿”公众号

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




