近距离了解木兰开源社区项目——Labeled-RISC-V

项目背景

当下,越来越多类型各异的应用部署在云计算平台上,云计算平台通过共享硬件资源、复用网络线路,降低了应用服务的部署门槛、维护和优化成本,提高了资源分配的灵活性。云计算平台提高核心竞争力的一种主要方式是提高资源利用率以降低成本,但资源利用率往往和用户体验存在矛盾:在一些场景下,若CPU利用率从30%提升到70%,用户请求响应时间尾延迟将增长10倍。而用户体验对于应用服务商来说至关重要,如在搜索服务中,如果用户搜索的响应时间增加0.5秒,则广告收入下降20%。因此,为了保证基本的服务质量,云计算平台的资源利用率仍然保持在较低水平,如CPU利用率基本不足20%。

资源利用率与用户体验的矛盾,主要来源于计算机系统中,资源共享带来的无序竞争所导致的系统行为不确定性及性能波动。计算机系统中的硬件资源,如CPU、高速缓存、内存、网络和磁盘IO,都会被不同的应用所争抢,导致部分应用出现饥饿以及局部性被破环的现象,从而降低应用的性能,影响用户体验。

为了解决硬件资源共享带来的无序竞争问题,硬件厂商针对各个部件提供了调控手段,如Intel处理器的资源指导技术(Resource Director Technology)提供了软件接口,允许软件管理底层硬件的资源分配策略,具体包括高速缓存监控、高速缓存容量分配、内存带宽监控等。

本项目提出一种新型的体系结构,标签化体系结构,通过提供新型软硬件接口的方式,借助软硬件协同控制的机制,以实现硬件资源的合理分配。与其他方案不同,标签化体系结构将计算机系统内部视为一个通信网络,硬件间的请求视为通信数据包,则资源共享的调控问题与分组交换网络有一定的相似之处。受分组交换网络中软件定义网络(Software Defined Network, SDN)思想的启发,标签化体系结构在硬件的通信消息中引入标签,将硬件资源的具体调控部件定义为数据平面,将中心化的参数表项和调控策略定义为控制平面,通过统一的编程接口,来实现以处理器核心或进程为对象的资源调控。下图是将计算机部件拓扑视为网络、通信协议视为数据包的一个示例。

近距离了解木兰开源社区项目——Labeled-RISC-V

标签的思想早在二十世纪六七十年代便由莱斯大学(Rice University)提出,但当时的设计将数据作为标签的描述对象,需要将标签存储在内存中,占据大量空间且有额外的校验运算开销,实现难度较大,现在主要应用在安全领域。标签化体系结构结合实际情况,将标签的描述对象限定在请求发生源(CPU、进程),通过通信协议进行传输,专注于资源调控,从而降低标签的存储和CPU运算开销。

项目功能

Labeled RISC-V是标签化体系结构的一个具体实现案例,其功能包括标签设置、L1访存带宽调控、共享cache容量划分和核心物理内存划分。

标签设置

标签分为核心标签和进程标签两类。核心标签存储在控制平面中,每个核心有各自的核心标签。进程标签通过 Linux 的 Cgroups 机制进行配置。为一个 Cgroups 设定标签后,添加到该组的进程都对应此标签。在上下文切换时,内核将进程标签从进程控制块写入专门的体系结构寄存器中。

每当核心发送访存请求时,核心标签和进程标签会拼接成完整标签,并附着在访存请求上。借助这一标签,硬件资源的控制部件可以感知到请求的来源。

L1访存带宽调控

为了调控核心的访存带宽,本项目在核心与系统总线之间添加了令牌桶模块。令牌桶有三个参数,分别是令牌容量,恢复周期和恢复量,它们均存储在控制平面中。每个令牌对应一次访存请求,访存粒度的单位是一个cache block。通过上述三个参数,即可控制每个核心的平均带宽和瞬时带宽。

共享cache容量划分

为了实现共享cache容量分配,本项目为每个标签维护相应的可用路掩码(waymask)。可用路掩码在替换时与替换结果掩码进行按位与操作,以限制相应标签可以替换掉的路,从而实现cache容量分配的效果。亦有查询接口可以查看每个标签占用的具体cache容量。

若只通过cache容量分配来调节性能,则容易造成cache容量分配较少的应用由于cache缺失率上升而频繁访问内存的现象,从而增大关键应用的访存延迟,因此,往往需要将共享cache和L1访存带宽联合进行调控。

下图对比了Redis服务独占硬件资源运行与共享硬件资源运行时的各百分位尾延迟,可以看到,若只将cache尽可能多地分配给Redis服务(12:4以及15:1-A),反而造成性能下降,甚至性能弱于无序共享(16:16)时的表现,而15:1-D在cache划分的基础上添加严格的L1带宽调控,则可以使得Redis服务的性能回升到独占时(Baseline)的表现,但此时其它应用依然在运行,从而提升系统整体的资源利用率。

近距离了解木兰开源社区项目——Labeled-RISC-V

物理内存划分

本项目为每个核心记录了可用物理内存区域的BASE和MASK,实现了简单的分段机制。每个核心在流水线里访问相同的地址空间,请求离开核心后则会被映射到不同且隔离的内存区域。互斥的任意核心集合均可独立地运行各自的 Linux 系统,从而实现片内核心的细粒度划分和隔离。

项目特点

标签化体系结构以标签机制和控制平面为核心,可在不同的硬件系统中实现。最初,项目尝试过在开源OpenSparc T1处理器上实现,但未成功;然后项目尝试在Xilinx 维护的Microblaze处理器和AXI4总线上成功实现标签及相应的控制平面,但由于Microblaze等IP核并非开源模块,一些创新性质的工作仍然无法开展。之后,项目选择了基于开放指令集架构RISC-V的开源Rocketchip平台,在TileLink总线上添加标签,实现相应的控制平面,并进一步将控制平面的统一编程接口与RISC-V的调试接口进行整合,从而可以通过Openocd和JTAG接口进行统一的编程操作,无需使用自定义驱动程序,使得项目更具可维护性。目前,项目已适配到 ZCU102, Sidewinder, Zedboard 等FPGA开发板,并且通过Python脚本封装了控制平面的读写命令,借由Openocd和JTAG连接设备,可方便高效地进行资源的调控。




木兰开源社区(https://mulanos.cn/)是2018年国家重点研发计划“云计算和大数据开源社区生态系统”项目重点成果,由中国电子技术标准化研究院牵头,联合北京大学、国防科大、联想、腾讯云,以及开源中国、北航、中科院软件所、西南大学、华为、阿里云、浪潮、新华三、中电标协、中科院东莞育成中心、湖南酷得共16家单位共同承担。木兰开源社区立足中国,面向国际,联合汇聚国内开源生态圈相关方,共同打造国内开源生态,推动本土开源项目孵化,在推动培育开源贡献文化的同时,与国内外各开源社区融合发展。


分享到:


相關文章: