在 Linux 上将 Nvidia GPU 的 VRAM 用作交换空间
动机和使用场景
- 面向内存有限、不可升级,但 Nvidia VRAM 相对较大且经常空闲的机器(例如混合 GPU 模式下的笔记本、带有大容量游戏/AI 显卡的台式机)。
- 让未使用的 VRAM 充当 swap,而不是写入 SSD,从而有可能节省闪存磨损,并利用原本被浪费的内存。
- 当工作负载(游戏 vs. “生产力”/大量内存使用)不会同时发生时,这种方案尤其有吸引力,因为 GPU 空闲时 VRAM 可以被重新利用。
性能和实现方面的担忧
- 据报告,吞吐量(笔记本 RTX 3070 上约 1.3 GB/s)远低于理论上的 PCIe/VRAM 带宽。
- 该帖子将其归因于:
- 使用 NBD 的用户态实现,而 NBD 众所周知相对较慢。
- 通过 bounce buffer 进行额外拷贝,以及每个 4K 页面都要经历许多内核/用户态上下文切换。
- 队列深度有限,以及 NBD 下请求合并效果差。
- ZRAM 压缩开销(尽管有人认为这只是次要因素)。
- 与 NVMe 交换相比,后者被描述为一种高度优化、零拷贝、基于 DMA 的路径,在实践中可能更快。
- 建议:转向 ublk 或自定义内核块设备驱动,以减少开销并提高并发性。
硬件和架构限制
- 不能简单地把 VRAM 直接加到系统 RAM 中,因为大多数桌面 GPU 与 CPU 之间并非缓存一致性(cache-coherent),并且必须以非缓存或写合并方式映射,这使它们作为“真正的” RAM 非常慢。
- 数据中心 GPU 和未来的 CXL 风格设备可以提供一致性,但延迟仍然远高于 DRAM。
- 也存在历史和替代方案(MTD/phram、vramfs、基于 OpenCL/Vulkan 的 ramdisk、Windows 的 GpuRamDrive)。
交换语义和 SSD 磨损
- 有些人认为 VRAM swap 是避免 SSD 磨损的一种方式;另一些人则认为现实中的 swap 使用通常并不会显著缩短 SSD 寿命。
- 关于 swap 的更广泛争论:
- 有些人配置大容量 swap(通常用于挂起到磁盘),并依赖它来防止突然 OOM。
- 另一些人则偏好极少或不使用 swap,把大量交换视为系统“死掉”了。
- 一种观点是:swap 的主要作用是在匿名内存和文件支持内存之间进行公平回收,而不是作为紧急内存。
可用性、风险和电源
- 担心将 VRAM 用作 swap 可能会:
- 阻止 GPU 电源门控,降低笔记本电池续航。
- 与图形或计算工作负载竞争,并在 VRAM 耗尽时导致崩溃(尤其是动态 Wayland 合成器)。
- 希望能够根据 GPU 压力动态启用/禁用 VRAM swap,但尚未完全解决;这被标记为待办事项。
- 经典的微内核式担忧(swap 守护进程需要换出自己)通过让其页面不可换出/固定驻留来解决。