TL;DR

  • WSL 3.0.2.0은 Linux 커널 6.18.40.1을 사용하며, 비교 대상인 WSL 2.6.3.0보다 작업 부하에 따라 성능이 향상되지만 실제 Go 컴파일의 벽시계 시간 단축은 3.91%임.
  • 메모리 복사 대역폭은 7.84GB/s에서 12.64GB/s로 61.35% 증가함.
  • 프로세스 간 통신과 스케줄링 관련 지표는 약 10~13% 개선되고 문맥 전환 지연은 11.25% 감소함.
  • GoReleaser 빌드의 커널 시간은 15.98% 감소했지만, 전체 빌드 시간은 7.47초(3.91%) 단축됨.
  • 메모리 집약적·IPC 집약적 작업은 더 큰 이점을 얻으며, 계산 중심 컴파일 작업은 제한된 가상 CPU의 코어 수와 주파수에 좌우됨.

테스트 환경

  • 비교 대상은 WSL 2.6.3.0(Linux 커널 6.6.87.2)과 WSL 3.0.2.0(Linux 커널 6.18.40.1)임.
  • 게스트 환경은 Go 1.27.1을 실행하는 Alpine Linux 3.23.0 x86_64 루트 파일 시스템(minirootfs)임.
  • WSL 3 게스트 커널은 6.18.40.1-microsoft-standard-WSL2임.
  • 호스트는 HP ProDesk 400 G4 Desktop Mini이며, 프로세서는 Intel Core i5-8500T(6코어·6스레드, Coffee Lake, 기본 클럭 2.10GHz), 메모리는 DDR4 16GB임.
  • 호스트 운영체제는 Windows 11 Pro 빌드 26200.9550이며, VBS가 활성화됨.
  • .wslconfig 설정은 프로세서 2개(가상 CPU 2개로 고정), 메모리 4GB, networkingMode=nat, firewall=true임.

저수준 커널 마이크로벤치마크

  • 표준 perf bench 테스트로 사용자 공간 도구와 독립적인 스케줄러 지연, IPC 처리량, 메모리 대역폭을 측정함.
  • syscall/basic의 getppid() 처리량은 WSL 2의 1,474,691 ops/s에서 WSL 3의 1,533,399 ops/s로 3.98% 증가함. 시스템 호출 진입·종료 지연은 0.6781μs/op에서 0.6521μs/op로 3.83% 감소함.
  • sched/pipe의 프로세스 10만 회 핑퐁 처리량은 48,445 ops/s에서 54,589 ops/s로 12.68% 증가함. 문맥 전환 지연은 20.64μs/op에서 18.32μs/op로 11.25% 감소함.
  • sched/messaging의 Hackbench(그룹 20개, 작업 800개) 실행 시간은 14.507초에서 13.047초로 10.06% 감소함.
  • mem/memcpy의 glibc 기본 설정 메모리 대역폭(1GB)은 7.84GB/s에서 12.64GB/s로 61.35% 증가함.

커널 측정 결과의 의미

  • 메모리 대역폭 61.35% 증가: 가장 큰 변화는 순차 메모리 처리량으로, 7.84GB/s에서 12.64GB/s로 상승함. WSL 3.x 커널 명령줄의 주요 기여 요인으로 page_reporting.page_reporting_order=5가 제시됨. 페이지 보고 단위를 키우면 게스트가 Hyper-V 동적 메모리 회수 인터페이스와 상호작용할 때 하이퍼바이저 트랩 빈도와 페이지 테이블 순회 오버헤드가 줄어듦.
  • 스케줄러·IPC 지연 약 11% 감소: sched/pipe와 sched/messaging에서 지연이 눈에 띄게 줄어듦. 상위 커널 6.18의 스케줄러 개선과 Hyper-V VMBus의 합성 인터럽트 처리 개선이 결합해, 고정된 가상 CPU 2개에서 실행 가능한 작업 사이에 메시지를 전달할 때 발생하는 CPU 간 깨우기 지연을 줄임.
  • 기본 시스템 호출 전환 3.8% 개선: getppid 시스템 호출의 진입·종료 성능 향상은 소폭임. 8세대 Intel 하드웨어의 단순한 링 전환은 고정된 CPU 아키텍처 경계의 영향을 받으므로, 하이퍼바이저 소프트웨어 조정만으로 진입 비용을 바꿀 여지가 제한적임.

실제 작업 부하: GoReleaser 컴파일

  • 컴파일 캐시를 비운 뒤(go clean -cache), 모듈 캐시는 준비된 상태에서 GoReleaser 코드베이스를 go build -a -o /dev/null로 빌드함.
  • 벽시계 시간은 WSL 2에서 3분 11.27초(191.27초), WSL 3에서 3분 03.80초(183.80초)로 7.47초(3.91%) 감소함.
  • 사용자 CPU 시간은 4분 58.99초(298.99초)에서 4분 49.38초(289.38초)로 9.61초(3.21%) 감소함.
  • 커널 시간은 57.39초에서 48.22초로 9.17초(15.98%) 감소함.

실행 시간 구성 분석

  • 커널 오버헤드 약 16% 감소: 컴파일러는 패키지 그래프를 살피고 컴파일 작업자를 조정하는 과정에서 openat, newfstatat, mmap, futex 호출을 반복함. 커널 트랩 오버헤드 감소와 6.18의 슬랩 캐시 개선으로 커널 실행 시간이 9초 넘게 줄어듦.
  • 벽시계 시간의 상한: 전체 실행 시간 단축이 약 7.5초에 그친 이유는 컴파일이 주로 사용자 공간의 계산 작업이기 때문임. 어휘 분석, 추상 구문 트리(AST) 구성, 타입 검사, SSA 최적화가 전체 클럭 사이클의 80% 이상을 차지함. 가상 머신이 기본 클럭 2.10GHz의 물리 코어 2개로 제한돼 있어, 원시 CPU 실행 성능이 전체 소요 시간을 좌우함.

핵심 시사점

  • WSL 2.x에서 WSL 3.x로의 업그레이드는 유의미하지만, 이점의 크기는 작업 부하 특성에 따라 크게 달라짐.
  • 메모리 내 데이터베이스(Redis, SQLite), 컨테이너 밀도가 높은 작업 흐름, Unix 도메인 소켓으로 페이로드를 주고받는 마이크로서비스처럼 IPC가 잦거나 메모리를 많이 사용하는 로컬 작업은 메모리 대역폭 61% 증가와 문맥 전환 지연 10~11% 감소의 이점을 얻음.
  • 빌드 도구 체인이 제한된 가상 CPU에서 사용자 공간 코드를 주로 실행하는 계산 중심 컴파일 작업은 WSL 3.x에서 커널 시간(sys)이 크게 줄어들 수 있지만, 전체 빌드 시간은 코어 주파수와 스레드 수에 좌우됨.

함께 볼 자료

  • WSL3의 보안 비용: WSL 2.x와 비교한 커널 완화 조치 벤치마크
  • ‘보안 비용’: WSL 2에서 성능 30% 회복하기
  • GCE 메모리 비용 제어: 소형 인스턴스에서 OS Login 및 OS Config 비활성화
  • Debian Slim을 활용한 격리·샌드박스 WSL 환경
  • 경량 효율성: Alpine Linux RootFS를 WSL2로 포팅