CXL互连技术这两年比较火热,是自从NAND SSD发明以来计算机硬件技术最大的变革。但是CXL的技术落地恐怕要比SSD艰难的多。前者只是一个部件的代替,后者需要大量架构的适配。本文罗列了一些我自己的思考点,也有一些业界的状态汇总。
所谓的静态扩展是在计算服务器启动器就配置好连接,服务器启动后就看到板载内存、扩展内存,而且都不再发生变化。
我认为静态的内存扩展价值不大。 相比主板板载内存,池化后而外置的内存成本高、性能差。如果不能通过池化发挥灵活性方面的优势,简单的静态扩展在大多数场合没有优势。只有池化才有意义。
所谓的池化模式就是在服务器运行过程中,应用程序或者管理软件可以动态的对内存进行热插拔。
池化分为共享池化、独占池化两种模式。
- 先说独占池化,系统在运行时从内存池设备申请内存,用完后归还给内存池。一旦申请这部分内存就归某个节点独占使用,不允许其他节点访问。这是一种分时复用的模式。
- 共享池化是允许多个节点同时访问同一块区域的内存。就像把iSCSI 的一个LUN同时挂载到多个节点上给OracleRAC 来使用。可以想象,这样模式一定是需要应用特殊支持的。
共享应用的一个典型场景是代替网络通信。就像两个进程通过共享内存通信,有了内存池两个不同主机上的进程也可以通过共享内存通信。在某些场景下可以大大减少网络传输的数据量。
包括下面的功能
2.1 内存的动态插拔(hot plug/remove), 操作系统能能支持动态容量的内存管理。通常hot plug还容易些, hot remove要考虑的问题更多。
2.2 OS 层面的内存分配,主要就是mmap的实现,要允许指定创建的memory region的物理位置,是位于系统的内置内存还是CXL池的 内存
2.3 tiering机制,OS还可以提供这样的memory region, 这里的物理页可以位于内置内存也可以位于CXL内存。而且OS可以根据访问的热度情况动态的迁移实际位置。
tiering机制的实现依赖 1) 数据访问频度统计 2)promote-demote 策略算法 3) 内存页迁移机制
2.4 hypervisor和容器平台支持,在云计算时代,资源除了被OS管理同时还多了一层云平台管理。这是一个非常好的资源抽象的位置。在容器平台和hypervisor (比如K8s和qemu)里面可以很灵活的决定内存的分配策略,可以是自动管理,也可以是根据用户请求管理。
2.5 Memory Allocator, 这里说的allocator是指libc提供的内存分配器,或者jemalloc, tcmalloc这样的分配器(相对于上面OS用于分配内存的mmap/buddy系统, 以及下面Fabric Manager内存分配),这样的分配器指提供malloc接口,是应用直接调用的API。
内存池集群的硬件大体上可以认为包括内存节点设备和内存网络设备两类。
软件上需要重点关注的是Fabric Manager,
FabricManager向下管理内存池设备,包括
FabricManager向上提供给应用平台或者应用程序API接口,包括