Linux 系统新玩法:用 NVIDIA GPU 显存作交换空间,提升可寻址内存
突发GitHub平台功能与项目介绍GitHub平台提供了丰富的功能和多样的解决方案涵盖AI代码创作、开发者工作流、应用程序安全等多个方面。平台功能在AI代码创作方面有GitHub Copilot可借助AI编写更优质代码GitHub Copilot应用能从问题到合并实现直接代理MCP注册表新增集成外部工具。开发者工作流包括Actions可自动化任何工作流Codespaces提供即时开发环境Issues用于规划和跟踪工作代码审查可管理代码更改。应用程序安全方面GitHub高级安全可发现并修复漏洞代码安全能在构建过程中保障代码安全密钥保护可防患于未然阻止信息泄露。探索板块可了解为何选择GitHub查看文档、博客、更新日志和市场等。解决方案按公司规模划分有企业版、中小型团队版、初创企业版和非营利组织版。按用例划分包括应用现代化、DevSecOps、DevOps、CI/CD等还可查看所有用例。按行业划分涉及医疗保健、金融服务、制造业、政府机构等也能查看所有行业。资源按主题探索有AI、软件开发、DevOps、安全等主题还可查看所有主题。按类型探索包括客户案例、活动与网络研讨会、电子书与报告、商业洞察、GitHub技能等。支持与服务方面有文档、客户支持、社区论坛、信任中心和合作伙伴等。开源项目社区方面有GitHub Sponsors可资助开源开发者。项目包括安全实验室、维护者社区、加速器、GitHub Stars和存档项目。仓库有主题、热门趋势和集合等。企业版企业解决方案有由AI驱动的开发者平台。可用附加组件包括GitHub高级安全的企业级安全功能、Copilot for Business的企业级AI功能和高级支持的企业级24/7支持。nbd - vram项目介绍nbd - vram项目可在Linux系统中将NVIDIA GPU的显存VRAM用作交换空间专为内存焊接且无法升级的笔记本电脑设计。测试环境与效果该项目已在RTX 3070笔记本电脑GA104M16GB物理内存8GB显存驱动版本580.159.03内核版本6.17Pop!_OS系统中测试分配7GB用于交换空间最终包括zram和SSD交换空间在内约46GB可寻址内存增加了两倍。溢出顺序为先填满RAM然后显存吸收溢出数据速度快通过PCIe接着zram压缩剩余数据使用CPU只有在其他空间都耗尽时才使用SSD。工作原理一个小型守护进程通过CUDA驱动API分配显存然后使用NBD网络块设备协议通过Unix套接字将其作为块设备提供服务。内核内置的 nbd 驱动连接到该设备并将其暴露为 /dev/nbdX之后它就是一个普通的交换设备。数据路径为内核交换子系统 - /dev/nbdX - nbd内核驱动 - Unix套接字 - nbd - vram守护进程 - cuMemcpyHtoD/DtoH - GPU显存。此方法无需编写或维护内核模块也无需使用NVIDIA内核符号即使内核和驱动更新也无需重新构建任何内容。为何不使用NVIDIA P2P API“显而易见”的方法是使用 nvidia_p2p_get_pages_persistent它可以将显存页面固定在BAR1中以便CPU可以通过 ioremap_wc 直接访问。但所有尝试此方法的现有项目都遇到了同样的问题NVIDIA驱动在消费级GeForce GPU上返回 EINVAL。无论是持久还是非持久变体以及两种标志值情况都是如此。此功能仅在Quadro/数据中心SKU的RM级别可用与驱动版本无关。另一种方法是不通过P2P API直接使用 ioremap_wc 映射BAR1物理地址但这也不起作用。GPU的内部页表仅映射了约16 MiB的BAR1仅显示帧缓冲区。从其他部分读取数据返回零。mkswap 似乎成功了但 swapon 失败因为交换头实际上并不存在。NBD方法避免了所有这些问题。cuMemcpyHtoD 和 cuMemcpyDtoH 可以在任何支持CUDA的GPU上使用无需任何特殊权限。要求该项目要求支持CUDA的NVIDIA GPU任何消费级RTX/GTX显卡包含 libcuda.so.1 的NVIDIA驱动无需CUDA工具包Linux内核3.0及以上版本nbd模块大多数发行版已内置nbd - client 包gcc、make。安装安装步骤为git clone https://github.com/c0dejedi/nbd - vramcd nbd - vramsudo ./install.shsudo systemctl start vram - swap - nbd。验证命令为swapon --show。安装时会启用该服务因此每次启动时都会自动启动。配置编辑 /etc/systemd/system/vram - swap - nbd.service可设置使用的显存大小和交换优先级。守护进程会先尝试请求的大小如果GPU内存不足则会以512 MiB为步长逐步减少。更改配置后需运行 sudo systemctl daemon - reload sudo systemctl restart vram - swap - nbd。电源管理安装程序在首次安装时会询问是否启用电源感知管理。如果启用当拔掉电源或电池电量低于阈值时服务会自动停止电源恢复时会重新启动。手动执行 systemctl stop 始终有效不会被覆盖。安装后若要更改设置可编辑 /etc/nbd - vram.conf。更改将在下一次轮询60秒内生效或者在下次插拔电源事件时立即生效。冒烟测试无需安装的冒烟测试命令为sudo bash test - nbd.sh。此命令会分配显存连接NBD设备进行1 MiB的写入和回读检查激活交换空间然后打印拆除说明。如果测试实例正在运行install.sh 会自动处理拆除操作。冒烟测试通过后若要对整个分区进行压力测试命令为sudo bash test - fill.sh。此命令会用零填充整个显存分区验证样本回读然后在退出时自动恢复交换空间。性能通过 test - fill.sh 在RTX 3070笔记本电脑上进行测量7 GiB顺序写入4M块顺序吞吐量约为1.3 GB/s延迟低于NVMe因为数据路径是通过PCIe连接到GPU而非存储设备。对于已经使用zram的笔记本电脑可将显存交换空间的优先级设置得更高以便在数据溢出时先使用显存再使用SSD。卸载卸载命令为sudo bash uninstall.sh。许可证与关于该项目许可证为MIT - Sean Lobjoit (c0dejedi)。其功能是在Linux系统中将NVIDIA GPU的显存用作交换空间专为内存焊接且无法升级的笔记本电脑设计。