GaussDB(DWS)cgroup技术介绍
本文将对GausDB(DWS)中资源管理应用的cgroup技术做简单的概述。
1、GausDB(DWS)中涉及到的子系统
1.1 Memory
cgroup.event_control #用于eventfd的接口
memory.usage_in_bytes #显示当前已用的内存
memory.limit_in_bytes #设置/显示当前限制的内存额度
memory.failcnt #显示内存使用量达到限制值的次数
memory.max_usage_in_bytes #历史内存最大使用量
memory.soft_limit_in_bytes #设置/显示当前限制的内存软额度
memory.stat #显示当前cgroup的内存使用情况
memory.use_hierarchy #设置/显示是否将子cgroup的内存使用情况统计到当前cgroup里面
memory.force_empty #触发系统立即尽可能的回收当前cgroup中可以回收的内存
memory.pressure_level #设置内存压力的通知事件,配合cgroup.event_control一起使用
memory.swappiness #设置和显示当前的swappiness
memory.move_charge_at_immigrate #设置当进程移动到其他cgroup中时,它所占用的内存是否也随着移动过去
memory.oom_control #设置/显示oom controls相关的配置
memory.numa_stat #显示numa相关的内存
一旦设置了内存限制,将立即生效,并且当物理内存使用量达到limit的时候,memory.failcnt的内容会加1,但这时进程不一定就会被kill掉,内核会尽量将
物理内存中的数据移到swap空间上去(swappiness参数可以选择是否使用swap),如果实在是没办法移动了(设置的limit过小,或者swap空间不足),默认
情况下,就会kill掉cgroup里面继续申请内存的进程。
当物理内存达到上限后,系统的默认行为是kill掉cgroup中继续申请内存的进程,那么怎么控制这样的行为呢?答案是配置memory.oom_control
如果写0到这个文件,将启动OOM-killer,当内核无法给进程分配足够的内存时,将会直接kill掉该进程;如果写1到这个文件,表示不启动OOM-killer,当内
核无法给进程分配足够的内存时,将会暂停该进程直到有空余的内存之后再继续运行;同时,memory.oom_control还包含一个只读的under_oom字段,用来表
示当前是否已经进入oom状态,也即是否有进程被暂停了。
1.2. CPU
CPU是用来设置CPU配额的子系统,所谓配额是指CPU的相对使用比例。配置CPU子系统的方法有两种:
一种是通过设置cpu.cfs_quota_us 和 cpu.cfs_period_us二者中的数值,来配置该cgroup中任务所占据的比例。
举个例子,cfs_period_us的值为100,表明一个cpu时间周期内100ms, cfs_quota_us 的值为200, 表明在一个cpu周期上,该
cgroup中的任务使用了200ms的时间,这表示该cgroup中的任务占用了两个cpu核心。
另外一个配置方法是修改cpu.shares中的数值,这个数值表明系统中若干个cgroup所占用cpu的比例值。
例如系统中有两个cgroup,分别为A与B,A的数值为1024(默认值),B的数值为2048,那么cgroup B所能占用的CPU时间为系统全部cpu时间的比例为:
2048/(1024+2048) = 2/3 = 66.6%
cpu.shares的配置方法有一个好处,就是如果系统没有在cpu资源占满的情况下,是不会触发这个机制的。也就是说,即便是cgroup A占有的cgroup比例
仅为33.3%, 在cgroup B中的任务不繁忙的时候,cgroup A中的任务仍然可以使用超过33.3%的资源。
与配置cfs调度中的时间片占用比例相比,使用shares参数可以使cpu的利用率得到提高。
从上面我们能够看出来,cgroup提供的cpu控制组是比较纠结的,一个通过配置占据cpu时间片的比例,来将cpu占用比例的上限写死了,
另一个cpu.shares参数虽然是动态的,但是如果cgroup的数量增加了,这个相对比例值也会发生变化。因此,在cpu子系统的配置还是很有讲究的。
1.3. CPUACCT
这个子系统没有什么实际限制作用,只是起到了对cgroup中任务占用cpu资源的统计,systemd将该子系统与cpu关联在一起挂载,
可以通过查看cpuacct.usage来获取cgroup中任务所占用的总的cpu使用情况
cpuacct.usage_percpu可以细粒度地看到每一个核心的使用情况。
mppdb没有实际使用到cpuacct中的功能,在这里不做具体介绍。
1.4. CPUSET
该参数用于配置cgroup所使用cpu资源的限额,所谓限额,就是指使用的固定cpu核心数。
可以通过配置cpuset.cpus参数来指定任务所使用的cpu核心数。
默认的cgroup中cpu核心数是全部使用的,例如:
0-119, 表明了系统共有120个cpu核心,全部都使用。
需要注意的是,子cgroup中的cpu核心必须是父cgroup中cpu核心的子集,如果需要修改cpuset.cpus参数,需要从根节点向父节点修改,
否则提示无法修改。
2、GaussDB(DWS)中cgroup的应用
2.1控制作业优先级
我们可以通过资源池来与cgroup关联,可以通过资源池来指定任务的运行优先级,可以指定为rush, normal等不同的类别,这是通过cgroup中的cpu子系统来实现的。
GaussDB(DWS)在安装的时候,会为系统默认创建cgroup, 命名规则为 Gaussdb: 用户名, 这个cgroup中会包含许多层级,例如Class,Backend等子cgroup.
2.2保障Gaussdb(DWS)线程优先级
GaussDB(DWS)的后台线程(backend threads) 纳入cgroup保护,主要是vacuum线程等。
- 点赞
- 收藏
- 关注作者
评论(0)