openEuler操作系统核心技术与行业应用实践
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.6 可编程内核:安全灵活的用户态代码内核卸载框架

Linux内核是一种通用内核,为了满足大多数场景的使用需求,集成了一些通用的机制或策略。但在I/O密集型、计算密集型、网络密集型等不同类型的业务场景中,对操作系统内核的资源调度诉求不尽相同,如果用户通过配置参数层面进行系统调优,其调优的效果往往不佳,因此需要定制化修改内核源码,在源码级进行系统优化。由于从内核定制到最终商用的周期比较长,同时不同场景的定制化需求难以共存,因此如果全部场景都定制内核也会导致内核分支众多,极大地增加用户的维护成本。

开源的eBPF(extended Berkeley Packet Filter)技术提供了一种灵活、安全的Linux内核注入方式,用户态程序经过编译后,通过bpf系统调用动态并加载到内核特定挂载点,由特定事件触发执行,这种机制无须修改和重编内核,同时实现了系统功能的快速修改与扩展。eBPF允许用户态程序通过实时监控采集系统数据与业务数据,并通过一定的策略调用内核提供的可编程能力,实现性能分析、网络监控、系统安全等功能。但当前开源实现缺少易用、可扩展的通用策略库供用户使用,同时内核各子系统提供的可编程能力也相对有限。

openEuler在开源eBPF的基础上,通过扩展内核各子系统(包括调度、网络、内存、存储等)的可编程能力,构筑了完整的可编程内核底座,其架构如图2-9所示。它采用机制和策略分离的实现方法,提供了通用策略库,方便用户调用和快速扩展,以满足用户多样化场景的需求,匹配产业快速迭代更新,实现灵活部署、快速上线。

图2-9 可编程内核架构图

通用策略库由动态扩展库、性能调优库、系统可观测性策略库组成。动态扩展库支持各子系统内核策略扩展(如I/O策略定制),也支持内核功能扩展;性能调优库包含协同感知与反馈调优模块,用户程序通过调用感知模块获取调优信息进行决策调优,反馈调优模块持续获取调优前后的系统性能数据并根据调优策略反馈优化。系统可观测性策略库提供精细化系统监控、低开销动态维测策略,供用户快速调用和扩展。

调度领域具备极简调度、QoS感知、功耗感知的调度能力,通过它们调度模块可以感知业务场景信息,如在终端场景中,感知用户使用场景(游戏场景、视频场景或者普通场景),通过将这些场景信息及相关的用户操作信息转换成是否需要进行调频等信息,并将其传递到内核调度中做出决策;内核调度模块扩展提供了一些hook接口和对应策略需要的辅助函数,并对基础调度策略进行了抽象。例如,基于标签化的抢占,通过接口将抢占机制与标签通信,这样后续用户就可以针对标签进行扩展,如在线与离线标签、任务组标签等。

网络领域提供了高性能转发、数据面可编程、控制面可编程的能力,供用户使用,以实现复杂网络场景下的拥塞控制、流量控制、链路短接、数控分离、流量卸载等,减少数据拷贝及跨态切换,缩短处理路径,降低时延与底噪。

内存领域提供两类编程能力:基于DAMON(Data Access MONitor)的动态编程与内存关键路径可编程能力。基于数据访问监控的应用内存动态编程,通过DAMON,根据schemes策略+内核madvise接口来实现精准的内存调整控制(如LRU调整、内存交换、大小页使用、积极的内存回收等),以保障业务供给,实现高性能和高性价比。内存关键路径可编程涉及内存策略可编程和用户态page fault可编程,前者主要实现灵活的内存策略,后者将用户态处理逻辑下沉到内核,通过旁路用户态减少业务跨特权态的代价,以提升效率。

存储领域提供应用程序对存储子系统的策略定制、服务下沉、快速路径的能力,由用户程序根据具体场景对VFS读写调用控制、I/O预读、I/O调度、I/O队列深度控制等策略进行定制,以达到最优性能。

基于可编程内核构建的系统服务可应用于系统智能调优,系统资源状态及时精确感知与反馈式性能调优,实现高可用、低开销的系统可观测性,从而实现面向多样化场景的操作系统开箱性能最优。