背景
QoS(Quality of Service,服务质量)是一个广义术语,通常用于描述系统对资源分配和性能管理的控制能力,以确保关键任务或高优先级任务获得所需的资源(如带宽、计算能力、内存等)。
QoS的实现主要从几个方面来概括:
- 资源隔离与分配。比如不同容器可使用的内存容量是memcg控制的,这是操作系统层面的软件控制。文章之后涉及到的对于带宽的控制是基于硬件级 QoS 支持。
- 调度优先级。比如将将关键任务绑定到专用 CPU 核,避免其他任务干扰。或 SCHED_FIFO/S CHED_RR 实时调度策略,让高优先级任务优先获得 CPU 时间片。
QoS的目标是在有资源竞争的情况下,保证关键业务。这种资源竞争也可能是为了降本增效人为导致的。
内存带宽方面的一些背景看这篇实战帖子详解服务器内存带宽计算和使用情况测量
需求
在集群混部背景下,将在线业务和离线业务做静态的资源隔离是保证在线业务高计算优先级的一种方式。
对实际情况的观察发现,动态内存带宽隔离依然存在可观收益,因为随着带宽增加内存访问延迟也呈现线性甚至指数趋势的增加。某些特定的在线业务会存在某一时段带宽需求骤增,为了保证在线业务优先被响应,需要减少离线业务在此刻造成的带宽争用。同时在线业务带宽占用很少的时段,可以让这些空闲资源被离线业务使用。
同理,LLC资源的使用也存在时段。不过在限制LLC带宽时要小心增加的cache miss带来更多的内存访问,从而又加剧内存带宽争用。
内容
动态带宽隔离由3个循环的步骤组成:监控在线业务和整机的带宽情况->依据前期实验和观测,设置安全的动态策略,由该策略计算出目前的带宽分配方案->实施带宽隔离。
在后面的方案设计中,针对每一个环节的底层依赖和实施难点做介绍。
方案设计
不过这里也会放一些细节上的东西(类似背景的内容)。
1.Resctrl文件系统
Resctrl文件系统是Linux内核在4.10开始提供的对MBM技术的支持(不同机器的底层不一样,详见下一节硬件资源隔离部分)。作为一个伪文件系统在使用方式上与cgroup是类似,通过提供一系列的文件为用户态提供查询和修改接口。 最近看见B站也会统计NUMA流量来自指导资源调度资源合池化后的异构差异问题解析–CPU分层现象和解决思路。
1.1 挂载
虽然其他文档或者博客会介绍说开机后挂载这个文件,不过一般成功率不高,都是开机的时候自动挂载上去的。
$ mount -t resctrl resctrl /sys/fs/resctrl
mount: / sys/fs/resctrl: mount point does not exist.
查看内核启动参数cat /proc/cmdline
,arm机器启动arm有mpam=acpi和arm64.mpam。intel机型需要内核引导文件(grub)加上rdt=cmt,mbmtotal,mbmlocal,l3cat,l3cdp,l2cat,l2cdp,mba. 在AMD Milan机型不需要在引导文件加上述引导项。还要注意可能由于机器比较老开机挂载不上。
1.2 文件内容
在不同机器上打开这个文件夹看到的内容不太一样,不过这里总结出了一些共同之处:
/sys/fs/resctrl/schemata
这个是和硬件资源隔离有关的文件。内容第一行指的是对内存带宽的隔离限度有的机器按照MB配置,即最大带宽2GB。有的机器按照百分比配置,10%指允许”最大流量”的10%的带宽流量。一般来说一台机器的”最大流量”都是确定的,或者也可以测试出来,比如以往的测试中限制10%的情况是13-14GB,类推限制为80%时允许的带宽上线是最大112GB/s。这里的1,2,3,4指numa节点(有的机器也指socket)。第二行用于限制LLC可用的cache way. CBM(Cache Bit Mask)是Intel/AMD处理器中用于控制LLC分配方式的位掩码。每个二进制位对应一个缓存单元(如Intel的CAT技术中,每bit代表一个Cache Way)。例如:在16路L3缓存中,0xFFFF表示占用全部16路,0x000F表示仅占用前4路。在下面的输出内容中,L3表示LLC的掩码,fff表示cache被划分为12份,每一个bit表示1/12。MB:0=2048;1=2048;2=2048;3=2048 L3:0=ffff;1=ffff;2=ffff;3=ffff
/sys/fs/resctrl/task
所有属于这个资源控制组的任务(进程和线程皆可),里面就是按行记录的 pid、tid。/sys/fs/resctrl/mon_data/XXX
每个group的内容。该task所在的域上mon_data中会有数值;在其他域上mon_data中的数值为0。
进入每个域的文件夹XXX后,一般会有3个文件,这是对内存带宽或者LLC带宽的监控数据:
llc_occupancy :show the current snapshot of LLC occupancy of the corresponding MON group or CTRL_MON group.)
mbm_local_bytes : 仅记录该控制组或任务访问本地NUMA节点内存的带宽,不包括通过QPI/UPI等互联技术访问其他NUMA节点的远程内存流量。
mbm_total_bytes :记录该控制组(cgroup)或任务使用的全部内存带宽(Local NUMA和Remote NUMA)其他目录和文件介绍。但是要注意不同机器挂载后不完全一样,这和他们底层的硬件实现有关。
info ├── L3 │ ├── bit_usage │ ├── cbm_mask # cache bit mask 描述的是某资源CBM位掩码。该掩码是通过cpuid获取CBM的最大长度,然后根据该长度生成所有位为1的掩码。 │ ├── min_cbm_bits # cbm的最小连续长度。当配置一个CBM的时候,有些cpu要求CBM必须满足连续多少位是1。 │ ├── num_closids # closid的个数 │ └── shareable_bits ├── L3_MON │ ├── max_threshold_occupancy # 当某rmid的llc占用量计数器低于该值时考虑释放,与rmid重用有关 │ ├── mon_features # 支持的监控事件列表 │ └── num_rmids # rmid的数量 ├── last_cmd_status # 最后一条指令执行的结果 └── MB ├── bandwidth_gran # 带宽的设置的粒度 ├── delay_linear ├── min_bandwidth # 最小的内存带宽百分比 ├── num_closids # closid数量 └── thread_throttle_mode # core上的多个thread存在不同带宽时的处理,max-以最大限制同时压制 per-thread:各自应用不同的带宽比例
2.硬件资源隔离
对硬件资源的隔离和优先级控制,不同的CPU使用的是不同的技术。但是主要可以分为这几个功能:Memory Bandwidth Allocation(MBA),Memory Bandwidth Monitoring(MBM),Cache Allocation Technology(CAT),Cache Monitoring Technology(CMT). 下面总结一下这些功能在不同CPU的实现的差异,了解这些差异可以减少在程序开发时的重构。
2.1 Intel RDT
RDT通过一个硬件概念的id(closid)来标记某个实体,对带宽的控制每个socket之间是独立的,一个socket最多可以分为4个不同的优先级或者流量限制域(称为MCLOS)。在程序运行期间,将程序所在resctrl组的closid与MCLOS绑定,写入寄存器MSR。同一个MCLOS组中的程序在这段时间内产生的RDT监控数据就可以用于反馈给MBA,以进行下一步流量限制。不过只有16个closid可以被分配。Intel RDT MBA本质是对MSR寄存器的读写操作。
2.2 AMD PQOS
Platform Quality of Service. AMD并不是socket级别的视图,是channel级别视图。而且不用closid与MCLOS绑定这些的流程,每一个resctrl都能被独立的限制,在进程级别对cache和内存带宽的使用做限制。(并且创建数量也不止16个。)
2.3 ARM MPAM
Memory System Resource Partitioning and Monitoring. 在resctrl方面和AMD PQOS更相似,但是在底层实现上更粗粒度像Intel RDT. 针对MB,拥有更低的控制粒度和min_mb设置,例如某arm64机器的控制粒度为2%,最小为2%, 而x86最小为10%,控制粒度为10%。但是由于控制精度的问题,不建议按照如此小的配置粒度进行配置。更多信息
3.策略设计
- 基于业务实际情况,总结规律是保证策略有效的途径之一。
- 对于带宽的隔离,主要目标是减少访问延迟,因此基于延迟的策略比直接用带宽设计的策略更有效。
4.收益
对某些业务相应时间有10%以上的降低。