WSL2 vs WSL3 Benchmarks: Prestaties, Geheugen en Syscall-schaling

WSL-upgrades claimen vaak algemene prestatiewinst, maar marketingpunten vertalen zich zelden direct naar de workloads van ontwikkelaars. Om te zien wat er onder de motorkap is veranderd, heb ik side-by-side benchmark-suites uitgevoerd om WSL 2.6.3.0 (Linux-kernel 6.6.87.2) te vergelijken met WSL 3.0.2.0 (Linux-kernel 6.18.40.1).

Hieronder volgen de empirische resultaten voor kernel-primitieven, geheugenbandbreedte en een end-to-end Go-compiler workload.

De Testomgeving

Om de test schoon en reproduceerbaar te houden, is de guest-omgeving ingericht met een Alpine Linux 3.23.0 root-bestandsysteem (minirootfs) waarop Go 1.27.1 draait:

  • Guest OS: Alpine Linux 3.23.0 (x86_64)
  • Guest Kernel (WSL3): 6.18.40.1-microsoft-standard-WSL2
  • Go-versie: Go 1.27.1
  • Host Machine: HP ProDesk 400 G4 Desktop Mini (DM)
  • Processor: Intel Core i5-8500T (6C/6T Coffee Lake @ 2.10 GHz basis)
  • Host RAM: 16 GB DDR4
  • Host OS: Windows 11 Pro (Build 26200.9550, VBS actief)
  • WSL Resource Allocations (.wslconfig):
  • processors=2 (vastgezet op 2 vCPUs)
  • memory=4GB
  • networkingMode=nat
  • firewall=true

Low-Level Kernel Microbenchmarks

Met behulp van standaard perf bench-suites kunnen we de ruwe scheduler-latentie, IPC-doorvoer en geheugenbandbreedte isoleren, onafhankelijk van user-space tooling.

Benchmark SuiteMeetwaardeWSL 2.6.3 (6.6.87)WSL 3.0.2 (6.18.40)Delta
syscall/basicgetppid() doorvoer1.474.691 ops/s1.533.399 ops/s+3,98%
Entry/exit latentie0,6781 µs/op0,6521 µs/op-3,83%
sched/pipe100k proces ping-pong48.445 ops/s54.589 ops/s+12,68%
Context switch latentie20,64 µs/op18,32 µs/op-11,25%
sched/messagingHackbench (20 groepen, 800 taken)14,507 s13,047 s-10,06%
mem/memcpyglibc standaard bandbreedte (1GB)7,84 GB/s12,64 GB/s+61,35%

Wat de kernel-overwegingen ons vertellen

Stijging in geheugenbandbreedte (+61,35%): De grootste sprong is de sequentiële geheugen-doorvoersnelheid, die steeg van 7,84 GB/s naar 12,64 GB/s. Een belangrijke factor in de 3.x kernel-commandline is pagereporting.pagereporting_order=5. Het verhogen van de granulariteit van de paginamelding vermindert de frequentie van hypervisor-traps en de overhead van page-table walking wanneer de guest interactie heeft met de dynamische geheugenreclamatie-interface van Hyper-V.

Scheduler & IPC-latentie (-11%): Zowel sched/pipe als sched/messaging laten een merkbare daling in latentie zien. De verfijningen in de upstream kernel 6.18 scheduler, samen met een strakkere Hyper-V VMBus synthetische interrupt-afhandeling, verminderen de CPU-to-CPU wake-boetes bij het versturen van berichten tussen uitvoerbare taken over de twee vastgezette vCPU's.

Basis syscall-overgang (-3,8%): De ruwe systeemoproep-entry en exit (getppid) zagen een bescheiden verbetering. Trivial ring-transities op 8e-generatie Intel-hardware blijven gebonden aan vaste CPU-architecturale grenzen, waardoor er minder ruimte is voor hypervisor-softwaretuning alleen om de entry-kosten te beïnvloeden.

Praktijkvoorbeeld: GoReleaser-compilatie

Om te testen hoe deze micro-verbeteringen zich vertalen naar tooling voor ontwikkelaars, heb ik de GoReleaser-codebase gecompileerd (go build -a -o /dev/null) met een lege compiler-cache (go clean -cache) en een voorbereide module-cache:

MeetwaardeWSL 2.6.3 (6.6.87)WSL 3.0.2 (6.18.40)Delta
Echt (Wall-clock)3m 11,27s (191,27s)3m 03,80s (183,80s)-7,47s (-3,91%)
Gebruiker (CPU-tijd)4m 58,99s (298,99s)4m 49,38s (289,38s)-9,61s (-3,21%)
Systeem (Kernel-tijd)0m 57,39s (57,39s)0m 48,22s (48,22s)-9,17s (-15,98%)

Analyse van de runtime-verdeling

Hoewel de totale wall-clock compilatiesnelheid met ongeveer 4% bewoog, laat de onderliggende verdeling van de executietijd zien waar de stack daadwerkelijk is verbeterd:

Kernel-overhead (sys) gedaald met ~16%: De compiler voert herhaaldelijk openat, newfstatat, mmap en futex-aanroepen uit tijdens het scannen van de pakketgraaf en het coördineren van compilatie-workers. De lagere kernel-trap overhead en verbeterde slab-caching in 6.18 hebben direct meer dan 9 seconden bespaard op de tijd die in de kernel wordt doorgebracht.

Het 'wall-clock' plafond: De reden dat de totale reële tijd slechts met ongeveer 7,5 seconden bewoog, is eenvoudig: compilatie is voornamelijk een user-space compute-workload. Lexing, AST-constructie, type-checking en SSA-optimalisatie beslaan meer dan 80% van de totale klokcycli. Omdat de VM is beperkt tot twee fysieke cores met een basisklok van 2,10 GHz, domineren de ruwe CPU-executiegrenzen de totale duur.

Belangrijkste conclusies

Het upgraden van WSL 2.x naar WSL 3.x is een waardevolle stap, maar waar u het voordeel merkt, hangt sterk af van uw workload-profiel:

  • Systemen met hoge IPC-churn en intensief geheugengebruik winnen: Lokale workloads die in-memory databases (Redis, SQLite) draaien, container-intensieve workflows of microservices die payloads over Unix-domeinsockets versturen, profiteren direct van de +61% geheugenbandbreedte-boost en de 10–11% lagere context-switching latentie.
  • Compute-bound compilers raken hardware-plafonds: Als uw build-toolchain het grootste deel van de tijd besteedt aan het uitvoeren van user-space code op beperkte vCPU's, zal WSL 3.x uw kernel-tijd (sys) aanzienlijk inkorten, maar zal uw totale build-duur nog steeds worden bepaald door de core-frequentie en het aantal threads.

Zie ook

  • The Security Tax in WSL3: Benchmarking Kernel Mitigations Against WSL 2.x
  • The "Security Tax": Reclaiming 30% Performance in WSL 2
  • Taming GCE Memory Tax: Disabling OS Login and OS Config on Small Instances
  • Isolated & Sandboxed WSL Environments with Debian Slim
  • Lightweight Efficiency: Porting Alpine Linux RootFS to WSL2