将 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 视为原生内存,而是采用了一个小型守护进程,执行以下操作:
- 通过 CUDA driver API 分配 VRAM。
- 使用基于 Unix socket 的 NBD 协议将该分配空间作为块设备提供。
- 将内核内置的
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 总线的理论最大值要慢,但它被定位为内存层级结构中的一个战略层。
为了最大限度地提高效率,作者建议了一种特定的溢出顺序:
- Physical RAM: 最快的一层。
- VRAM Swap: 吸收初始溢出(快速 PCIe 访问)。
- zram: 使用 CPU 压缩剩余数据。
- 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 限制较多的开发者或高级用户,它提供了一种创造性的方式,从其硬件中压榨出每一比特的实用性。