WSL 2 성능 업데이트: Virtiofs를 위한 디바이스별 SWIOTLB 풀(Pools)
WSL 2는 디바이스별 DMA 풀 도입을 통해 교차 OS 파일 액세스 성능을 대폭 향상시키고 있습니다. 2026년 5월 PR #40654를 통해 병합된 이 변경 사항은 virtiofs 경로의 주요 경합 지점을 제거하며, 특히 Linux 환경 내에서 Windows 드라이브에 위치한 프로젝트를 빌드하는 사용자들에게 큰 이점을 제공합니다.
DMA 레이어 최적화
WSL 2의 교차 OS 파일 I/O는 하드웨어가 직접 주소 지정할 수 있는 4 GB 경계 미만의 예약된 메모리 영역인 바운스 버퍼(bounce buffers)에 의존하는 DMA (Direct Memory Access) 레이어를 활용합니다. Linux 커널에서는 이를 SWIOTLB 풀이라고 합니다.
이전에는 WSL 2 세션의 모든 virtio 디바이스가 단일 글로벌 SWIOTLB 풀을 공유했습니다. 이는 /mnt/c를 위한 virtiofs 마운트, /mnt/d를 위한 마운트, 그리고 virtio 네트워크 어댑터가 모두 동일한 버퍼를 두고 경쟁했음을 의미하며, 대규모 I/O 작업 중에 병목 현상을 유발했습니다.
이 문제를 해결하기 위해 PR #40654는 각 virtio 디바이스에 전용 DMA 풀을 할당합니다. 커널은 이제 부팅 시 4 GB 미만의 연속적인 물리적 범위를 할당하고 sysfs(/sys/bus/vmbus/drivers/hv_pci/swiotlb_base 및 swiotlb_size)를 통해 해당 주소를 공개합니다. 그런 다음 WSL 서비스는 디바이스 생성 시 디바이스별 swiotlb= 옵션을 주입하여 공유 큐 경합을 제거합니다.
WSL 파일 시스템 액세스 방식의 진화
이 업데이트의 영향을 이해하려면 교차 OS 액세스를 위해 사용되는 전송 프로토콜의 진화를 살펴볼 필요가 있습니다.
- WSL 1 (2016): Windows NT 커널의 커스텀 파일 시스템 드라이버인 DrvFs를 사용했습니다. VM 경계가 없었기 때문에
/mnt/c에서의 파일 작업은 NTFS에 거의 직접적으로 도달하여 파일 집약적 워크로드에서 좋은 성능을 제공했습니다. - WSL 2 (2019): Hyper-V VM 내에 완전한 Linux 커널을 도입했습니다. 이는 더 나은 syscall 호환성을 제공했지만 VM 경계를 도입했습니다. 초기 교차 OS 액세스는 Hyper-V 소켓을 통한 Plan 9 (9P) 파일 서버를 통해 처리되었습니다. 그러나 9P는 메시지 크기 파라미터(
msize=65536)에 의해 작업이 제한되므로 프로토콜 오버헤드가 발생합니다. - Virtiofs (2021): 실험적 옵션으로 도입되었습니다. Virtiofs는 공유 메모리 파일 액세스를 위해 VirtIO 전송 방식을 사용하며, 이는 9P에 비해 직렬화 오버헤드를 크게 줄여줍니다.
요구 사항 및 구현
이러한 성능 이득을 활용하려면 사용자는 다음 기술적 요구 사항을 충족해야 합니다.
- 커널 버전: Microsoft.WSL.Kernel 6.18.26.3-1 이상.
- WSL 2 DeviceHost: 버전 1.2.29-0 이상.
- 설정:
.wslconfig파일의[wsl2]섹션에virtiofs=true를 설정하십시오. - 시스템 리소스: SWIOTLB 풀이 최소 64 MB의 여유 공간을 필요로 하므로, WSL 2 세션 RAM을 1 GB 이상으로 유지하십시오.
사용자는 wsl.exe --update --pre-release 명령어를 사용하여 커널을 업데이트할 수 있습니다.
커뮤니티 관점 및 트레이드오프
이 업데이트가 중요한 병목 현상을 해결하지만, 커뮤니티 논의에서는 WSL 2와 네이티브 Linux 사이의 성능 격차에 대한 오랜 불만 사항이 강조되고 있습니다.
"WSL은 개발자들이 Windows를 떠나는 흐름을 막는 데 큰 역할을 했지만, WSL 네이티브 파일 시스템 성능은 개발자들이 처음 Linux로 부팅했을 때 파일 시스템이 엉망이 아니라는 것을 확인하며 마법 같은 경험을 하게 만듭니다."
일부 개발자들은 이러한 성능 차이가 역사적으로 그들을 네이티브 Linux나 macOS로 이끌었다고 언급했습니다. 다른 이들은 이러한 병목 현상을 완전히 피하는 가장 효율적인 방법은 /mnt/c 경계를 넘어 작업하는 대신, 프로젝트 파일을 별도의 EXT4 볼륨에 보관하고 이를 Windows에서 마운트하는 것이라고 제안합니다.
이러한 최적화에도 불구하고, virtiofs는 여전히 옵션 기능이며, 교차 OS 액세스를 위한 기본 전송 방식은 Hyper-V 소켓을 통한 Plan 9 방식입니다.