返回

文章详情

在Linux上将您的Nvidia GPU的VRAM用作交换空间

Hacker News2026年6月2日 22:55

在Linux上将您的NVIDIA GPU的VRAM用作交换空间。专为具有焊接内存且无升级路径的笔记本电脑构建。如果您有一张RTX显卡,配备8GB的VRAM且正在将其交换到SSD,这种方法将让VRAM发挥作用。测试机型:RTX 3070笔记本(GA104M,16 GB物理内存,8 GB VRAM),驱动程序580.159.03,内核6.17,Pop!_OS。为交换分配了7 GB。最终结果(包括zram和SSD交换)约为46 GB,使可寻址内存增加了三倍。溢出顺序为:RAM填满,然后VRAM吸收溢出(快速,通过PCIe),接下来zram压缩其余部分(CPU),最后在所有其他资源用尽时才使用SSD。工作原理是一个小的守护进程通过CUDA驱动程序API分配VRAM,然后通过Unix套接字使用NBD(网络块设备)协议将其作为块设备提供。内核内置的nbd驱动程序连接到它并暴露/dev/nbdX。从这里开始,它就是一个正常的交换设备。数据路径:内核交换子系统 - /dev/nbdX - nbd内核驱动程序 - Unix套接字 - nbd-vram守护进程 - cuMemcpyHtoD/DtoH - GPU VRAM。无需编写或维护内核模块。没有NVIDIA内核符号。在内核和驱动程序更新后能够生存,无需重建任何内容。为什么不使用NVIDIA P2P API?“显而易见”的方法是nvidia_p2p_get_pages_persistent,它在BAR1中固定VRAM页面,以便CPU可以通过ioremap_wc直接访问它们。每个尝试这个方法的现有项目都会碰到同样的壁垒:NVIDIA驱动程序在消费级GeForce GPU上返回EINVAL。无论是持久性还是非持久性变体,两种标志值都有。它在RM级别对仅Quardo/数据中心SKU进行了限制,与驱动程序版本无关。另一个方法 - 直接ioremap_wc BAR1物理地址而不经过P2P API - 也不起作用。GPU的内部页表仅映射了约16 MiB的BAR1(只是显示帧缓冲)。从其余部分读取返回零。mkswap似乎成功,但swapon失败,因为交换头并不存在。NBD方法规避了所有这些。cuMemcpyHtoD和cuMemcpyDtoH在任何CUDA GPU上都能工作,而无需任何特殊权限。要求包括NVIDIA GPU(具有CUDA支持,任何消费级RTX/GTX卡)、具有libcuda.so.1的NVIDIA驱动程序(无需CUDA工具包)、Linux内核3.0+(nbd模块,内置于大多数发行版中)、nbd-client包、gcc和make。安装: git clone https://github.com/c0dejedi/nbd-vram cd nbd-vram sudo ./install.sh sudo systemctl start vram-swap-nbd 验证:swapon --show # 名称 类型 大小 已用 优先级 # /dev/nbd0 分区 7G 0B 1500 安装时服务已启用,因此它会在每次启动时自动运行。配置 编辑 /etc/systemd/system/vram-swap-nbd.service : Environment = VRAM_SETUP_SIZE_MB =7168 # 使用多少VRAM 环境 = VRAM_SWAP_PRIORITY =1500 # 交换优先级(越高,越先使用)守护进程首先尝试请求的大小,如果GPU内存不足,则以512 MiB为步长回退 - 即使显示合成器已经加载,它也会尽可能多地获取。VRAM_SETUP_SIZE_MB是上限,而不是硬性要求。更改后,运行sudo systemctl daemon-reload && sudo systemctl restart vram-swap-nbd。电源管理安装程序会询问是否在首次安装时启用电源感知管理。如果启用,当您从交流电源断开时(或电池电量低于阈值时),该服务会自动停止,并在恢复供电时重新启动。手动systemctl stop始终受到重视,不会被覆盖。要在安装后更改设置,请编辑/etc/nbd-vram.conf。更改将在下一个轮询(60秒内)或在下一个交流电源插拔事件时立即生效。烟雾测试(不安装)sudo bash test-nbd.sh 分配VRAM,连接NBD设备,进行1 MiB的读写检查,激活交换,然后打印拆卸说明。如果测试实例正在运行,install.sh会自动处理拆卸。通过烟雾测试后要压力测试整个分区:sudo bash test-fill.sh 用零写入整个VRAM分区,验证样本读回,然后在退出时自动恢复交换。性能通过test-fill.sh在RTX 3070笔记本上测量(7 GiB顺序写入,4M块):顺序吞吐量:~1.3 GB/s 延迟低于NVMe,因为路径通过PCIe到GPU,而不是存储。对于已经使用zram的笔记本电脑,将VRAM交换设定为更高的优先级,以便在到达SSD之前吸收溢出。卸载sudo bash uninstall.sh 许可证 MIT - Sean Lobjoit (c0dejedi)

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡