将 VRAM 转换为 Swap:针对内存受限 Linux 笔记本电脑的创意解决方案

对于现代笔记本电脑用户来说,“板载内存”已成为一个普遍的烦恼。当你的物理 RAM 达到上限且系统开始向 SSD 进行 swap 时,性能往往会显著下降。虽然 zram 提供了一个极佳的压缩缓冲区,但在 CPU 旁边通常还坐落着大量未被利用的潜力:NVIDIA GPU 的显存 (VRAM)。

nbd-vram 是一个巧妙的实用程序,旨在通过将 VRAM 暴露为 Linux 上的一个 swap 设备来发挥这些闲置 VRAM 的作用。对于无法升级硬件的机器来说,这特别有价值,它允许用户通过在物理 RAM 和基于磁盘的 swap 之间分层使用 VRAM,从而有效地将可寻址内存增加到三倍。

工作原理:NBD 桥梁

将 VRAM 实现为 swap 非常困难,因为 NVIDIA 限制了消费级 GeForce 卡对 VRAM 的直接 CPU 访问。所谓的“显而易见”的路径——使用 NVIDIA P2P API 在 BAR1 中固定页面——在消费级硬件上通常会返回 EINVAL,因为该功能被限制在 Quadro 和数据中心级 SKU 中。

为了绕过这些硬件和驱动程序限制,nbd-vram 使用了 Network Block Device (NBD) 协议。该工具并没有尝试强迫内核将 VRAM 视为原生内存,而是采用了一个小型守护进程,执行以下操作:

  1. 通过 CUDA driver API 分配 VRAM。
  2. 使用基于 Unix socket 的 NBD 协议将该分配空间作为块设备提供。
  3. 将内核内置的 nbd 驱动程序连接到该 socket,从而在 /dev/nbdX 处暴露一个设备。

这创建了一个如下所示的数据路径: Kernel Swap Subsystem $\rightarrow$ /dev/nbdX $\rightarrow$ NBD Kernel Driver $\rightarrow$ Unix Socket $\rightarrow$ nbd-vram Daemon $\rightarrow$ cuMemcpyHtoD/DtoH $\rightarrow$ GPU VRAM

由于它依赖于标准的 CUDA 内存拷贝和 NBD 协议,因此它不需要自定义内核模块,并且在内核或驱动程序更新时无需重新构建即可继续工作。

性能与内存层级结构

在典型设置中(在 RTX 3070 Laptop 上测试),作者报告其顺序吞吐量约为 1.3 GB/s。虽然这比 PCIe 总线的理论最大值要慢,但它被定位为内存层级结构中的一个战略层。

为了最大限度地提高效率,作者建议了一种特定的溢出顺序:

  1. Physical RAM: 最快的一层。
  2. VRAM Swap: 吸收初始溢出(快速 PCIe 访问)。
  3. zram: 使用 CPU 压缩剩余数据。
  4. SSD Swap: 当所有其他选项都耗尽时的最后手段。

通过将 VRAM swap 的优先级设置得比 SSD 更高,系统会在触及磁盘之前利用 GPU 的内存。

技术权衡与社区观点

该项目在 Linux 和硬件社区中引发了关于其实用性的健康辩论。

延迟 vs. 吞吐量之争

一些用户指出,1.3 GB/s 相对于 PCIe 4.0 x16 或 NVMe 驱动器的原始能力来说相对较低。正如一位评论者所言:

"This RTX 3070 chip is on PCIe 4.0 x16 which should give 64GB/s... Swapping to an NVMe drive would be twice as fast, but with higher latency."

然而,这里的主要优势并不在于原始的顺序吞吐量,而是在于与传统磁盘 I/O 相比降低了延迟,并利用了原本会闲置的内存。

稳定性与资源竞争

另一个关键考虑因素是“背压 (backpressure)”。由于 VRAM 与显示合成器和 GPU 加速应用共享,为 swap 分配大量空间可能会潜在地导致 GPU 渲染所需的内存不足。这对于 Wayland 用户来说尤为相关,因为其分配比 X11 更具动态性,如果 VRAM 运行过低,可能会导致桌面环境崩溃。

替代方案与相关项目

社区强调了其他几种实现类似目标的尝试,包括:

  • nbdkit-vram-plugin: 使用 OpenCL API 来支持 AMD GPU 的类似方法。
  • vramfs: 一个基于 OpenCL 的 FUSE 文件系统实现。
  • GpuRamDrive: 一个基于 Windows 的概念验证,用于从 VRAM 创建虚拟驱动器。

结论

nbd-vram 是一个针对特定问题——“板载 RAM 陷阱”——的巧妙但小众的解决方案。虽然它可能无法取代专门的内存升级,物理内存不足时 变现为功能性的系统内存扩展。对于拥有高 VRAM GPU 且系统 RAM 限制较多的开发者或高级用户,它提供了一种创造性的方式,从其硬件中压榨出每一比特的实用性。

Sources