將 VRAM 轉換為 Swap:針對記憶體受限 Linux 筆記型電腦的創意解決方案

對於現代筆記型電腦的使用者來說,「焊接式記憶體」已成為一個常見的挫折。當你達到實體 RAM 的上限,且系統開始向 SSD 進行 swap 時,效能通常會明顯下降。雖然 zram 提供了一個極佳的壓縮緩衝區,但在 CPU 旁邊通常還有大量未被利用的潛力:NVIDIA GPU 的視訊記憶體 (VRAM)。

nbd-vram 是一個聰明的工具,旨在透過將閒置的 VRAM 作為 Linux 上的 swap 裝置來發揮其作用。這對於無法升級硬體的機器特別有價值,讓使用者能透過在實體 RAM 與磁碟 swap 之間加入一層 VRAM,有效地將可定址記憶體增加至三倍。

工作原理:NBD 橋接器

將 VRAM 實作為 swap 的難度出乎意料地高,因為 NVIDIA 限制了消費級 GeForce 卡對 VRAM 的直接 CPU 存取。所謂的「顯而易見」的路徑——使用 NVIDIA P2P API 在 BAR1 中固定頁面 (pin pages)—通常會在消費級硬體上回傳 EINVAL,因為此功能僅開放給 Quadro 與資料中心等級的 SKU。

為了繞過這些硬體與驅動程式的限制,nbd-vram 使用了 Network Block Device (NBD) 協定。該工具並非強迫核心 (kernel) 將 VRAM 視為原生記憶體,而是採用了一個小型守護程序 (daemon) 來執行以下操作:

  1. 透過 CUDA driver API 分配 VRAM。
  2. 使用透過 Unix socket 的 NBD 將該分配空間作為區塊裝置 (block device) 提供。
  3. 將核心內建的 nbd 驅動程式連接到該 socket,從而將裝置暴露於 /dev/nbdX

這建立了一個如下所示的資料路徑: Kernel Swap Subsystem $\rightarrow$ /dev/nbdX $\rightarrow$ NBD Kernel Driver $\rightarrow$ Unix Socket $\rightarrow$ nbd-vram Daemon $\rightarrow$ cuMemcpyHtoD/DtoH $\rightarrow$ GPU VRAM

由於它依賴標準的 CUDA 記憶體複製與 NBD 協定,因此不需要自定義的核心模組,且在核心或驅動程式更新時無需重新編譯即可繼續運作。

效能與記憶體層級結構

在典型的設定中(於 RTX 3070 Laptop 上測試),作者報告其循序吞吐量 (sequential throughput) 約為 1.3 GB/s。雖然這比 PCIe 匯流排的理論最大值慢,但它被定位為記憶體層級結構中的一個策略性層級。

為了極大化效率,作者建議了一種特定的溢出順序:

  1. Physical RAM: 最快的一層。
  2. VRAM Swap: 吸收初步的溢出(快速的 PCIe 存取)。
  3. zram: 使用 CPU 壓縮剩餘的資料。
  4. SSD Swap: 當所有其他選項都用盡時的最後手段。

透過將 VRAM swap 的優先級設定得比 SSD 高,系統會在接觸磁碟之前先利用 GPU 的記憶體。

技術權衡與社群觀點

該專案在 Linux 與硬體社群中引發了關於其實用性的健康辯論。

延遲與吞吐量的辯論

某些使用者指出,1.3 GB/s 相對於 PCIe 4.0 x16 或 NVMe 驅動器的原始能力來說相對較低。正如一位評論者所言:

"This RTX 3070 chip is on PCIe 4.0 x16 which should give 64GB/s... Swapping to an NVMe drive would be twice as fast, but with higher latency."

然而,這裡的主要優勢不在於原始的循序吞吐量,而是在於與傳統磁碟 I/O 相比降低了延遲,並利用了原本會閒置的記憶體。

穩定性與資源爭奪

另一個關鍵考量是「背壓」(backpressure)。由於 VRAM 是與顯示合成器 (display compositor) 與 GPU 加速應用程式共用的,因此為 swap 分配大量區塊可能會導致 GPU 缺乏渲染所需的記憶體。這對於 Wayland 使用者來說尤為重要,因為其分配機制比 X11 更具動態性,若 VRAM 過低,可能會導致桌面環境崩潰。

替代方案與相關專案

社群強調了其他幾種嘗試達成類似目標的嘗試,包括:

  • nbdkit-vram-plugin: 一種使用 OpenCL API 來支援 AMD GPU 的類似方法。
  • vramfs: 一種基於 OpenCL 的 FUSE 檔案系統實作。
  • GpuRamDrive: 一個基於 Windows 的概念驗證,用於從 VRAM 建立虛擬磁碟。

結論

nbd-vram 是一個針對特定問題(「焊接式 RAM 陷阱」)的利基但精巧的解決方案。雖然它可能無法取代專用的 RAM 升級,但它將昂貴且閒置的資源轉化為系統記憶體的實用擴展。對於擁有高 VRAM GPU 且系統 RAM 有限的開發者或進階使用者來說,它提供了一種創意的方式,從其硬體中榨取每一位元組的效用。

Sources