论文部分内容阅读
随着Kubernetes等容器编排技术的成熟,容器因为其高硬件资源利用率、易部署、易移植等特性而被云服务商广泛应用。非易失内存(Non-volatile memory,NVM)作为一种新的热门硬件资源,也需要接入资源控制机制,从而被容器使用。但是关于容器该如何使用非易失内存,目前尚没有比较完美的解决方案。当前唯一与此相关的技术是英特尔提供的PMEM-CSI库,该库为Kubernetes提供了非易失内存命名空间级别的隔离。它会将非易失内存分成多个文件系统卷,这些卷一旦被创建则无法调整大小,而这不符合非易失内存灵活多变的使用方式。除了基于命名空间进行资源隔离和控制以外,内核还可以基于控制组群对硬件资源进行限制以及关联的管理系统进行资源隔离。当前的控制族群中包含了对容器可占用内存空间大小的限制机制,但是因为非易失内存的数据持久化特性与操作过程中的数据一致性,无法直接复用内存的控制组,所以我们需要为非易失内存提供新的控制组。另一方面,尽管当前文件系统提供了空间管理与数据隔离功能,但是对于大部分依赖文件系统进行空间管理的分配器与数据结构而言,文件系统维护的文件元数据并不是必须的,而且元数据操作造成了大量的延迟。所以,为了更高的管理性能,我们需要设计新的非易失内存管理系统。针对以上问题,本文设计并实现了一个面向容器的非易失内存管理系统,实现了容器的非易失内存空间资源的动态控制。该系统包含了三个模块,非易失内存控制组、内核管理模块以及用户态库。非易失内存控制组基于当前Linux内核的控制组群实现,它主要负责对各容器可使用的非易失内存空间大小的阈值设定,已使用空间的统计,以及可否继续分配的校验。内核模块基于新的抽象——Zone,实现了更为简洁的命名空间管理功能,提供了性能更高的空间分配与回收接口,以及完善的数据隔离以及空间资源校验机制。除此以外,内核模块还针对Zone,提供了映射和执行数据页的支持。同时,本文设计并实现了一个用户态的库,完成容器启动时与非易失内存管理系统相关的初始化,同时对内核模块的接口进行了封装。通过测试结果发现,内核模块对外的接口延迟表现良好,分配与回收接口具备良好的扩展性。接入非易失内存控制组后,接口延迟只增加了约50纳秒,同控制组的分配与回收接口的并发性因为共享资源池对象的原因存在下降。接着,本文用分配、回收接口与文件系统的fallocate接口进行对比,非易失内存管理系统分配的最高吞吐量是Ext4的40倍,回收空间的吞吐量是其150倍。最后,本文基于非易失内存分配器的分析证明了用非易失管理系统代替文件系统的可行性。