ZEROCPY 是一种皆在减少内存拷贝的技术,其可以是进程内部减少拷贝,也可以是进程间的拷贝,例如在上图中,两个用户进程之间各自映射不同的物理页,当两个进程之间拷贝数据本质是在两个物理页之间拷贝数据. 当两个进程同时映射到一个物理页,那么两个进程之间无需拷贝便可以相互访问数据,因此可以看到 ZEROCOPY 在性能提升上是首选优化点. 在 CXL 池化加持下,ZEROCOPY 已经跨越主机与主机之间的隔阂.
在数据中心,传统的主机之间访问数据需要通过网络或者 RDMA 进行数据拷贝,拷贝完毕之后才能访问数据,对于大数据的场景下,花费在数据拷贝的时间会占到大头. 如果能将主机之间的数据拷贝省去,那么程序性能将得到质的提升.
在 CXL Pool 方案中,CXL 集群可以构建一个共享(Shring)的内存池子. 主机之间可以将同一块 CXL 内存映射到其物理地址空间,然后在物理内存级别的共享,也就是一台物理主机修改了这部分内存,那么其他主机将同时看到修改的内容. 那么接下来通过一个实践案例展示 CXL ZEROCOPY 的优势之处,实践案例在 BiscuitOS 上的部署逻辑如下:
# 切换到 BiscuitOS 项目目录
cd BiscuitOS
# 选择开发环境,如果已经选择过可以跳过,这里与 linux 6.10 X86 为例
make linux-6.10-x86_64_defconfig
# 通过 Kbuild 选择需要部署的应用程序
make menuconfig
[*] DIY BiscuitOS/Broiler Hardware --->
[*] CXL: Compute Express Link
CXL Hardware Topology (CXL2.0: x1 VCS + x1 Type3 PMEM) --->
[*] CXL MEMORY POOL --->
[*] Package --->
[*] HETEROGENEOUS MEMORY MANAGEMENT
[*] CXL ZERO-COPY: NET OR RDMA --->
# 配置完毕保存,然后进行部署
make
# 切换到实践案例所在目录
cd output/linux-6.10-x86_64/package/BiscuitOS-CXL-ZEROCP-RDMA-default
# 准备依赖工具
make prepare
# 编译实践案例
make download
make build
当第一台 BiscuitOS 启动之后,先查看其 IP 地址,此时 IP 地址为 “172.88.1.6”, 接下来启动第二台 BiscuitOS,先测试两台机器之间通过网络先拷贝数据,参考如下命令:
# 新开一个终端,切换到第二台环境
cd /BiscuitOS/output/linux-6.10-x86_64
# 运行第二台 BiscuitOS
./RunBiscuitOS-CXL.sh
# 修改第二台 BiscuitOS IP 为 172.88.1.8, 并进行 ping 测试
ifconfig eth0 172.88.1.8
ping 172.88.1.6
可以看到两台 BiscuitOS 之间的网络是通的,接下来一台作为服务器运行 SERVER 程序,另外一台作为客户端运行 CLIENT 程序,那么两台 BiscuitOS 之间将通过网络传递数据, 测试程序基于 TCP 进行数据传输, 可以自行查看源代码:
当 SERVER 运行之后,其监听请求,在另外一台启动 CLIENT 程序,其与 SERVER 端连接成功,接下来开始传输数据,一共耗时 32s 传输 268960000 字节,也就是两个主机想通信需要先花费 32s 拷贝数据,然后才能进行访问.
此时在两台物理主机上同时挂载同一块 CXL 内存,并运行 APP 程序对 CXL 内存进行读写操作,可以看到 SERVER 对 CXL 内存写数据,CLIENT 立马看到写入的数据,其无需耗费大量的时间去拷贝数据,而是直接消费数据,这样大大提供了业务的性能. 以上便是 CXL 内存池化实现的主机之间的 ZEROCOPY.