Linux에서 NVIDIA GPU의 VRAM을 스왑 공간(swap space)으로 사용하기
요약
Linux 환경에서 NVIDIA GPU의 VRAM을 NBD(Network Block Device) 프로토콜을 통해 스왑 공간으로 활용할 수 있게 해주는 도구인 nbd-vram을 소개합니다. 메모리 업그레이드가 불가능한 노트북 사용자가 VRAM을 활용해 가용 메모리를 크게 확장할 수 있도록 설계되었습니다.
핵심 포인트
- VRAM을 스왑 장치로 활용하여 주소 지정 가능한 메모리 확장 가능
- NBD 프로토콜을 사용하여 커널 모듈 수정 없이 구현
- 소비자용 GeForce GPU의 P2P API 제한 문제를 우회하여 작동
- RAM -> VRAM -> zram -> SSD 순의 효율적인 데이터 오버플로 계층 제공
nbd-vram
Linux에서 NVIDIA GPU의 VRAM을 스왑 공간 (swap space)으로 사용하세요.
메모리가 납땜되어 업그레이드가 불가능한 노트북을 위해 제작되었습니다. 8GB의 VRAM을 가진 RTX 카드가 있는데 SSD로 스왑이 발생하고 있다면, 이 도구는 해당 VRAM을 활용하게 해줍니다.
테스트 환경: RTX 3070 Laptop (GA104M, 물리 메모리 16 GB, VRAM 8 GB), 드라이버 580.159.03, 커널 (kernel) 6.17, Pop!_OS. 스왑용으로 7 GB 할당. zram 및 SSD 스왑을 포함한 최종 결과는 약 46 GB로, 주소 지정 가능한 메모리를 3배로 늘렸습니다. 오버플로 (Overflow) 순서는 다음과 같습니다: RAM이 가득 차면, VRAM이 넘치는 데이터를 흡수하고 (빠름, PCIe), 그 다음 zram이 나머지를 압축하며 (CPU), 다른 모든 것이 소진된 경우에만 SSD를 사용합니다.

작동 원리
작은 데몬 (daemon)이 CUDA 드라이버 API를 통해 VRAM을 할당한 다음, Unix 소켓을 통한 NBD (Network Block Device) 프로토콜을 사용하여 이를 블록 장치 (block device)로 제공합니다. 커널 (kernel)의 내장 nbd 드라이버가 이에 연결되어 /dev/nbdX를 노출합니다. 거기서부터는 일반적인 스왑 장치와 동일하게 작동합니다.
데이터 경로: 커널 스왑 서브시스템 (kernel swap subsystem) - /dev/nbdX - nbd 커널 드라이버 (nbd kernel driver) - Unix 소켓 - nbd-vram 데몬 (nbd-vram daemon) - cuMemcpyHtoD/DtoH - GPU VRAM.
작성하거나 유지 관리해야 할 커널 모듈 (kernel module)이 없습니다. NVIDIA 커널 심볼 (kernel symbols)도 필요하지 않습니다. 아무것도 다시 빌드할 필요 없이 커널 및 드라이버 업데이트 후에도 유지됩니다.
왜 NVIDIA P2P API를 사용하지 않나요?
"당연해 보이는" 접근 방식은 nvidia_p2p_get_pages_persistent를 사용하는 것입니다. 이는 VRAM 페이지를 BAR1에 고정(pin)하여 CPU가 ioremap_wc를 통해 직접 액세스할 수 있게 합니다. 이 경로를 시도했던 모든 기존 프로젝트는 동일한 벽에 부딪혔습니다: NVIDIA 드라이버가 소비자용 GeForce GPU에서 EINVAL을 반환합니다. 지속성(persistent) 및 비지속성(non-persistent) 변형 모두 플래그 값이 잘못 나옵니다. 이는 드라이버 버전과 관계없이 Quadro/데이터센터 (datacenter) SKU에서만 RM 레벨에서 허용됩니다.
다른 접근 방식인 P2P API를 거치지 않고 BAR1 물리 주소를 직접 ioremap_wc 하는 방식 또한 작동하지 않습니다. GPU의 내부 페이지 테이블 (page tables)에는 약 16 MiB의 BAR1만 매핑되어 있습니다 (디스플레이 프레임버퍼만 해당). 나머지 영역을 읽으면 0을 반환합니다. mkswap은 성공하는 것처럼 보이지만, 스왑 헤더 (swap header)가 실제로 존재하지 않기 때문에 swapon이 실패합니다.
NBD 방식은 이 모든 문제를 우회합니다. cuMemcpyHtoD와 cuMemcpyDtoH는 특별한 권한 없이도 모든 CUDA GPU에서 작동합니다.
요구 사항 (Requirements)
- CUDA를 지원하는 NVIDIA GPU (모든 소비자용 RTX/GTX 카드)
libcuda.so.1이 포함된 NVIDIA 드라이버 (CUDA 툴킷은 필요 없음)- Linux 커널 3.0 이상 (대부분의 배포판에 내장된 nbd 모듈)
nbd-client패키지gcc,make
설치 (Install)
git clone https://github.com/c0dejedi/nbd-vram
cd nbd-vram
sudo ./install.sh
...
확인:
swapon --show
# NAME TYPE SIZE USED PRIO
# /dev/nbd0 partition 7G 0B 1500
설치 시 서비스가 활성화되므로, 매 부팅 시마다 자동으로 실행됩니다.
설정 (Configuration)
/etc/systemd/system/vram-swap-nbd.service 파일을 수정하세요:
Environment=VRAM_SETUP_SIZE_MB=7168 # 사용할 VRAM 용량
Environment=VRAM_SWAP_PRIORITY=1500 # 스왑 우선순위 (높을수록 먼저 사용됨)
데몬(daemon)은 요청된 크기를 먼저 시도하며, GPU 메모리가 부족할 경우 512 MiB 단위로 크기를 줄여가며 시도합니다. 따라서 디스플레이 컴포지터(display compositor)가 이미 로드되어 있더라도 가능한 한 많은 메모리를 확보하려고 시도할 것입니다. VRAM_SETUP_SIZE_MB는 상한선(ceiling)이며, 반드시 지켜야 하는 엄격한 요구 사항은 아닙니다.
수정 후에는 sudo systemctl daemon-reload && sudo systemctl restart vram-swap-nbd를 실행하세요.
전원 관리 (Power management)
설치 프로그램은 첫 설치 시 전원 인식 관리(power-aware management)를 활성화할지 묻습니다. 활성화하면 AC 전원을 뽑거나(또는 배터리가 임계값 아래로 떨어지면) 서비스가 자동으로 중지되며, 전원이 복구되면 다시 시작됩니다. 수동으로 실행한 systemctl stop은 항상 존중되며 자동으로 덮어쓰여지지 않습니다.
설치 후 설정을 변경하려면 /etc/nbd-vram.conf를 수정하세요. 변경 사항은 다음 폴링(poll, 60초 이내) 시 또는 다음 AC 연결/해제 이벤트 시 즉시 적용됩니다.
스모크 테스트 (설치 없이 실행) (Smoke test (without installing))
sudo bash test-nbd.sh
VRAM을 할당하고, NBD 장치를 연결하며, 1 MiB 쓰기/읽기 확인(write/readback check)을 수행하고, 스왑(swap)을 활성화한 다음 종료(teardown) 안내를 출력합니다. 테스트 인스턴스가 실행 중인 경우 install.sh가 종료 과정을 자동으로 처리합니다.
스모크 테스트(smoke test)를 통과한 후 전체 파티션에 부하를 주려면:
sudo bash test-fill.sh
전체 VRAM 파티션을 0으로 채워 쓰고, 샘플 읽기(read back)를 검증한 다음, 종료 시 스왑을 자동으로 복구합니다.
성능 (Performance)
RTX 3070 Laptop에서 test-fill.sh를 통해 측정한 결과 (7 GiB 순차 쓰기, 4M 블록):
- 순차 처리량 (Sequential throughput): ~1.3 GB/s
- 지연 시간 (Latency)은 경로가 저장 장치가 아닌 PCIe를 통해 GPU로 이어지기 때문에 NVMe보다 낮습니다.
이미 zram을 사용 중인 노트북의 경우, VRAM 스왑의 우선순위(priority)를 높게 설정하여 SSD에 도달하기 전에 VRAM이 오버플로(overflow)를 흡수하도록 하세요.
삭제 (Uninstall)
sudo bash uninstall.sh
라이선스 (License)
MIT - Sean Lobjoit (c0dejedi)
AI 자동 생성 콘텐츠
본 콘텐츠는 HN Hardware의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기