在 Linux 上把 NVIDIA GPU 的 VRAM(顯示記憶體)當作 swap(交換空間)使用 (★ 109 分)
nbd-vram 是一個 Linux 工具,可把 NVIDIA GPU(圖形處理器)的 VRAM(顯示記憶體)當作 swap(交換空間)使用,特別針對記憶體焊死、無法升級的筆電。作者以 RTX 3070 Laptop 測試,在 16 GB 系統記憶體與 8 GB VRAM 的機器上分配 7 GB 給 swap,搭配 zram(在記憶體中壓縮資料的 Linux swap 機制)與 SSD swap 後,可用的位址空間約達 46 GB;溢位順序設計為 RAM 先滿、接著由 VRAM 承接、再交給 zram 壓縮,最後才動用 SSD,以減少 SSD 寫入並利用閒置 VRAM。
技術上,nbd-vram 以小型常駐程式透過 CUDA(NVIDIA 的平行運算平台與 API)驅動程式 API 配置 VRAM,再用 NBD(Network Block Device,網路區塊裝置)協定經由 Unix socket(Unix 通訊端)提供區塊裝置,Linux 核心內建的 nbd 驅動程式會將其呈現為 /dev/nbdX,之後即可像一般 swap 裝置使用。這個做法不需要撰寫或維護核心模組,也不依賴 NVIDIA 核心符號,因此較不受核心或驅動程式更新影響。作者也說明,直接使用 NVIDIA P2P API(Peer-to-Peer API,讓裝置間直接交換資料的介面)在消費級 GeForce GPU 上會被驅動程式拒絕,而直接映射 BAR1(Base Address Register,PCIe 裝置暴露記憶體區域的機制)也只會看到約 16 MiB 的顯示 framebuffer,因此改用 CUDA 的記憶體複製路徑繞過限制。
專案需求包含支援 CUDA 的 NVIDIA GPU、含 libcuda.so.1 的 NVIDIA 驅動程式、Linux 3.0 以上核心、nbd-client、gcc 與 make。安裝後可透過 systemd(Linux 服務管理工具)自動啟動,也能在服務檔中設定要使用多少 VRAM 與 swap 優先度;若 GPU 記憶體不足,常駐程式會以 512 MiB 為單位往下調整,盡量取得可用容量。它也提供電源管理選項,可在筆電拔除 AC 電源或電量低於門檻時自動停止,重新接電後再啟動。作者量測 RTX 3070 Laptop 上 7 GiB 連續寫入約 1.3 GB/s,主張延遲低於 NVMe SSD(高速 SSD 介面)路徑,但也建議把 VRAM swap 的優先度設高,讓它先於 SSD 承接溢位。
Hacker News 討論多半認為這是相當小眾但有實用情境的點子:例如開發機或遊戲機在未跑 AI 模型、未玩遊戲時,常有大量 VRAM 閒置,拿來減少 SSD swap 寫入有其價值。不少人也指出,swap 不只是「記憶體不夠時的緊急備援」,也可讓 Linux 在檔案快取頁與匿名記憶體頁之間有更公平的回收機制,因此即使記憶體充足,保留少量 swap 仍可能有幫助。
質疑則集中在效能與資源競爭。有人指出 RTX 3070 Laptop 的 PCIe 與 GDDR6 理論頻寬遠高於 1.3 GB/s,若只看連續吞吐量,NVMe SSD 可能更快,且 swap 更需要隨機讀寫與實際工作負載基準測試。也有人擔心 VRAM 被 swap 佔用後,Wayland 桌面、遊戲、AI 推論或其他 GPU 工作負載若突然需要顯示記憶體,是否能安全釋放並產生足夠 backpressure(資源壓力回饋機制);在低 VRAM 情境下,桌面環境或驅動程式不穩可能會導致當機。整體而言,社群看法是這不是通用解法,但對無法升級記憶體、又有閒置 NVIDIA VRAM 的 Linux 筆電或工作站,確實是一個值得實驗的折衷方案。
👥 33 則討論、評論 💬
https://news.ycombinator.com/item?id=48377404