在rubik中,每一个特性以服务形式运行在后台。rubik根据用户配置(config.json)按需启动对应服务。下文是对各个服务的介绍。
rubik支持业务优先级配置,针对在离线业务混合部署的场景,确保在线业务相对离线业务的资源抢占。目前仅支持CPU资源和内存资源。使用该特性,用户需要手动为业务指定业务类型,即在业务pod的yaml文件中增加注解volcano.sh/preemptable
。业务优先级配置示例如下:
annotations:
volcano.sh/preemptable: true
在rubik中,所有特性均通过识别该注解作为业务在离线标志。 true代表业务为离线业务。 false代表业务为在线业务。
针对在离线业务混合部署的场景,确保在线业务相对离线业务的CPU资源抢占。
cpu.qos_level
。建议使用内核版本openEuler-22.03+。针对在离线业务混合部署的场景,确保OOM时优先kill离线业务。
memory.qos_level
。建议使用内核版本openEuler-22.03+。echo 1 > /proc/sys/vm/memcg_qos_enable
rubik支持业务的Pod内存带宽(memory bandwidth)和LLC(Last Level Cache)限制,通过限制离线业务的内存带宽/LLC使用,减少其对在线业务的干扰。
该特性依赖于物理机支持intel RDT(x86)和mapm(arm)功能。其将集群中的业务划分为5个控制组(分别为rubik_max
、rubik_high
、rubik_middle
、rubik_low
、rubik_dynamic
),每一个控制组会根据配置限制业务对访存待宽和最后一级缓存的使用。rubik启动后,将水位线写入对应控制组的schemata。其中,rubik_high
、rubik_middle
、rubik_low
控制组对应的水位线是全局的,可在dynCache
中配置;max控制组为默认最大值, dynamic控制组初始水位线和low控制组一致。
rubik支持两种方式为业务Pod配置内存带宽和LLC控制组:
defaultLimitMode
字段,rubik会自动为离线业务Pod(即绝对抢占特性中的注解volcano.sh/preemptable
)配置控制组。
static
时,pod将被加入到rubik_max
控制组。dynamic
时,pod将被加入到rubik_dynamic
控制组。volcano.sh/cache-limit
设置其控制组(我们不建议), 如下列配置的pod将被加入rubik_low控制组:annotations:
volcano.sh/cache-limit: "low"
rubik dynamic控制组:
当Pod控制组为rubik_dynamic
时,rubik通过采集当前节点在线业务pod的cache miss
和llc miss
指标,动态调整rubik_dynamic
控制组的水位线,实现对dynamic控制组内pod的动态控制。
rdt=l3cat,mba
mpam=acpi
。/sys/fs/resctrl
,且运行过程中不可卸载。SYS_ADMIN
才能正确设置/sys/fs/resctrl
下的文件。pid namespace
,以便获取业务容器进程在主机上的pid。dynCache
仅针对离线业务,对在线业务不生效。[adjustInterval+perfDuration, adjustInterval+perfDuration*pod数量]
内波动,用户可根据灵敏度需求调整配置项。通过cgroup提供的blkio能力限制pod对io资源的使用。
用户需手动为业务Pod配置volcano.sh/blkio-limit
注解,其格式如下:
volcano.sh/blkio-limit: '{"device_read_bps":[{"device":"/dev/sda1","value":"10485760"}, {"device":"/dev/sda","value":"20971520"}],
"device_write_bps":[{"device":"/dev/sda1","value":"20971520"}],
"device_read_iops":[{"device":"/dev/sda1","value":"200"}],
"device_write_iops":[{"device":"/dev/sda1","value":"300"}]}'
配置内容:
配置键 | 描述 |
---|---|
device_read_bps | 用于设定设备执行“读”操作字节的上限。该配置为list,可以对多个device进行配置,device指定需要限制的块设备,value限定上限值,单位为byte |
device_read_iops | 用于设定设备执行“读”操作次数的上限。该配置为list,可以对多个device进行配置,device指定需要限制的块设备 |
device_write_bps | 用于设定设备执行 “写” 操作次数的上限。该配置为list,可以对多个device进行配置,device指定需要限制的块设备,value限定上限值,单位为byte |
device_write_iops | 用于设定设备执行“写”操作字节的上限。该配置为list,可以对多个device进行配置,device指定需要限制的块设备 |
说明:
- 配置的key:value和cgroup的key:value的配置规则一致:
- 写入时会转换成环境page size的倍数
- 只有minor为0的device配置才会生效
- 如果取消限速,可将值设为0
为有效解决由业务CPU限流导致QoS下降的问题,rubik容器提供了弹性限流功能,允许容器使用额外的CPU资源,从而保证业务的平稳运行。弹性限流方案包括内核态和用户态配置两种。二者不可同时使用。
用户态通过Linux内核提供的CFS bandwidth control
能力实现,在保障整机负载水位安全稳定及不影响其他业务运行的前提下,通过双水位机制允许业务容器自适应调整CPU限制,缓解CPU资源瓶颈,提高业务的运行性能。
内核态通过Linux内核提供的CPU burst
能力,允许容器短时间内突破其cpu使用限制。内核态配置需要用户手动设置和修改每个pod的burst值的大小,rubik不作自适应调整。
用户手动为需要自适应调整CPU限额的业务Pod指定“volcano.sh/quota-turbo="true"”注解,(仅针对限额Pod生效,即yaml中指定CPULimit)。 弹性限流用户态策略根据当前整机CPU负载和容器运行情况定时调整白名单容器的CPU quota,并在启停rubik时自动检验并恢复全部容器的quota值 (本节描述的CPU quota指容器当前的cpu.cfs_quota_us参数)。调整策略包括:
用户手动为需要业务Pod指定“volcano.sh/quota-burst-time”注解,rubik将注解值写入pod的所有容器的burst内核接口,写入后rubik不会根据cpu使用率等自适应修改。示例如下:
metadata:
annotations:
volcano.sh/quota-burst-time : "2000"
内核态通过内核接口cpu.cfs_burst_us实现。支持内核态配置需要确认cgroup的cpu子系统目录下存在cpu.cfs_burst_us文件,其值约束如下:
- 当cpu.cfs_quota_us的值不为-1时,需满足cfs_burst_us + cfs_quota_us <= 2^44-1 且 cfs_burst_us <= cfs_quota_us。
- 当cpu.cfs_quota_us的值为-1时,CPU burst功能不生效,cfs_burst_us默认为0,不支持配置其他任何值。
为了有效解决由离线业务IO占用过高,导致在线业务QoS下降的问题,rubik容器提供了基于cgroup v1 iocost的IO权重控制功能。 资料参见: iocost内核相关功能介绍
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。