把闲置显存变成 Linux 交换空间:NBD-VRAM 的巧妙折中
# 导语
当笔记本内存被焊死、无法升级,而独立显卡却有几 GB 甚至十几 GB 显存闲着时,系统一旦爆内存通常只能把压力转向 SSD 交换分区。`nbd-vram` 提供了一个很有黑客精神的方案:把 NVIDIA GPU 的 VRAM 包装成 Linux 可识别的块设备,再作为 swap 使用,让显存成为 RAM、zram 与 SSD 之间的一层缓冲。
# 核心内容
这个项目面向的是一个相当具体但真实的痛点:许多游戏本、创作本或移动工作站配有 RTX/GTX 独显,却只有 16GB 或 32GB 不可扩展内存。作者在 RTX 3070 Laptop、16GB 物理内存、8GB 显存、Linux 6.17 与 NVIDIA 580.159.03 驱动环境下测试,将约 7GB VRAM 分配给 swap。结合原有 RAM、zram 和 SSD swap 后,系统可寻址的“应急内存池”被扩展到约 46GB。其推荐的溢出顺序是:先用物理内存,再让 VRAM 承接溢出,之后交给 zram 压缩,最后才落到 SSD。
实现方式并不是写内核模块,而是一个小型用户态守护进程。它通过 CUDA Driver API 在 GPU 上分配显存,然后用 Linux NBD(Network Block Device)协议经 Unix socket 向内核暴露一个 `/dev/nbdX` 块设备。Linux 内核内置的 nbd 驱动连接到该服务后,系统就能把它当作普通块设备执行 `mkswap` 与 `swapon`。数据路径大致是:内核 swap 子系统 → `/dev/nbdX` → nbd 内核驱动 → Unix socket → nbd-vram daemon → `cuMemcpyHtoD/DtoH` → GPU VRAM。
作者也解释了为什么不走更“直接”的路线。NVIDIA 的 P2P API 理论上能把 VRAM 页面固定在 BAR1 中,让 CPU 直接访问,但消费级 GeForce 卡会在驱动资源管理层返回 `EINVAL`,相关能力通常保留给 Quadro 或数据中心卡。直接 `ioremap_wc` BAR1 物理地址同样行不通,因为实际映射往往只有约 16MiB 显示帧缓冲,其余区域读出来是零。NBD + CUDA 拷贝虽然绕了一圈,却能在普通 CUDA GPU 上稳定工作。
项目依赖很轻:有 CUDA 支持的 NVIDIA GPU、带 `libcuda.so.1` 的驱动、Linux 3.0+ 的 nbd 模块、`nbd-client`、gcc 与 make 即可。安装后可通过 systemd 启动,并用环境变量配置显存上限和 swap 优先级;守护进程还会在显存不足时按 512MiB 逐步回退,尽量拿到可用空间。作者测得 7GiB 顺序写入吞吐约 1.3GB/s,路径经 PCIe 到 GPU,延迟通常低于落盘到 NVMe。
# 深度解读
`nbd-vram` 的价值不在于把 VRAM 神奇地变成真正内存。显存仍然需要通过 PCIe 与 CUDA 拷贝访问,不能替代低延迟、可随机访问的系统 RAM;一旦 GPU 正在跑游戏、模型推理或桌面合成,显存争用也可能带来副作用。它更像是一层“比 SSD 更快、比 RAM 更远”的临时缓冲,适合那些偶尔被浏览器、IDE、容器、编译任务或轻量数据处理顶爆内存的机器。
这个项目还体现了 Linux 生态的经典工程哲学:当内核或硬件厂商接口受限时,可以用成熟通用机制重新组合出可用方案。NBD 原本常用于远程块设备,这里被用作用户态与内核 swap 子系统之间的桥梁;CUDA API 原本服务计算任务,这里变成了显存读写后端。它避开专有驱动符号和内核模块维护成本,也降低了随内核升级而崩坏的概率。
但它的定位必须谨慎。swap 本身就是性能退让机制,VRAM swap 也不是鼓励用户长期超卖内存。对于生产工作负载,内存容量规划、OOM 策略、zram/zswap 配置仍然更基础;对于移动设备,电源管理也很关键。项目提供了断电或电池阈值下自动停用的 power-aware 管理,说明作者也意识到:这不是免费午餐,而是一种面向特定硬件闲置资源的折中。
# 启示与展望
对 Linux 用户来说,`nbd-vram` 提供了一个值得收藏的工具:如果你的笔记本内存不可升级、独显显存经常闲置、又不想频繁把 SSD 当交换空间磨损,它可能显著改善极端内存压力下的体验。对开发者而言,它更大的启发是:很多硬件资源并非只能按厂商预设用途使用,合适的抽象层能打开新的系统设计空间。
未来如果类似思路能与 zswap、cgroup 内存策略、桌面电源管理和 GPU 负载感知更深入集成,VRAM 或许可以成为 Linux 内存层级中的一种可选“中间层”。它不会适合所有人,却精准击中了现代封装化笔记本的一个尴尬现实:内存不能加,显存却空着。把这部分资源用起来,本身就是一种漂亮的工程补丁。