logo
Kurashizu Blogwhere ideas flow
  • Home
  • News
  • Blog
  • About
  • Home
  • News
  • Blog
  • About

© 2026 Kurashizu. All rights reserved.

Admin·New Post·Service Status
Powered by Cloudflare·30.10.26
← Back to news

WSL3 Performance is about 5-60% faster than WSL2 depending on the workload

Original article
tonym.us|192 points|156 comments|by tonymet|Oct 7, 2026

WSL3 Performance: A 5-60% Boost Over WSL2 Depending on Workload

By Tony Metzidis | AI, Cloud, & Engineering Leadership Published: October 7, 2026 ⋅\cdot⋅ 4 min read ⋅\cdot⋅ #Wsl #Wsl2 #Wsl3 #Benchmarks

With the introduction of the WSL 3.x stack, Microsoft has updated the default virtualization runtime and upgraded the guest kernel from the 6.6 LTS branch to 6.18.

While official marketing often highlights generalized speed increases, these bullet points rarely provide a clear picture of how developer-specific workloads are affected. To uncover the actual technical shifts, I conducted a side-by-side comparison between WSL 2.6.3.0 (Kernel 6.6.87.2) and WSL 3.0.2.0 (Kernel 6.18.40.1).

The following data examines kernel primitives, memory throughput, and a practical Go compilation scenario.


🛠️ The Test Environment

To ensure the results were reproducible and isolated, I utilized an Alpine Linux 3.23.0 root filesystem (minirootfs) running Go 1.27.1.

Hardware & Software Specifications

  • Host OS: Windows 11 Pro (Build 26200.9550, VBS enabled)
  • Host Machine: HP ProDesk 400 G4 Desktop Mini
  • CPU: Intel Core i5-8500T (6C/6T Coffee Lake @ 2.10 GHz)
  • RAM: 16 GB DDR4
  • Guest OS: Alpine Linux 3.23.0 (x86_64)
  • Guest Kernels: 6.6.87.2 (WSL2) vs 6.18.40.1 (WSL3)

Resource Configuration

The following settings were applied via the .wslconfig file:

[wsl2]
processors=2        # Pinned to 2 vCPUs
memory=4GB
networkingMode=nat
firewall=true

📉 Low-Level Kernel Microbenchmarks

Using perf bench, I isolated raw IPC throughput, scheduler latency, and memory bandwidth to remove user-space noise.

Benchmark SuiteMetricWSL 2.6.3 (6.6.87)WSL 3.0.2 (6.18.40)Delta
syscall/basicgetppid() throughput1,474,6911,474,6911,474,691 ops/s1,533,3991,533,3991,533,399 ops/s+3.98%
Entry/exit latency0.6781 μs/op0.6781\ \mu s/\text{op}0.6781 μs/op0.6521 μs/op0.6521\ \mu s/\text{op}0.6521 μs/op-3.83%
sched/pipe100k process ping-pong48,44548,44548,445 ops/s54,58954,58954,589 ops/s+12.68%
Context switch latency20.64 μs/op20.64\ \mu s/\text{op}20.64 μs/op18.32 μs/op18.32\ \mu s/\text{op}18.32 μs/op-11.25%
sched/messagingHackbench (20g, 800t)14.507 s14.507\text{ s}14.507 s13.047 s13.047\text{ s}13.047 s-10.06%
mem/memcpyglibc bandwidth (1GB)7.84 GB/s7.84\text{ GB/s}7.84 GB/s12.64 GB/s12.64\text{ GB/s}12.64 GB/s+61.35%

Analysis of Kernel Improvements

The Memory Breakthrough: The most staggering gain is the +61.35% increase in sequential memory throughput. This is largely attributed to the kernel command line parameter: page_reporting.page_reporting_order=5. By increasing the granularity of page reporting, the system reduces the frequency of hypervisor traps and the overhead of page-table walking during Hyper-V dynamic memory reclamation.

  • Scheduler IPC Latency (≈−11%\approx -11\%≈−11%): Improvements in the upstream 6.18 scheduler, combined with optimized Hyper-V VMBus synthetic interrupt handling, have reduced the "wake penalty" when tasks bounce between the two pinned vCPUs.
  • Syscall Transitions (≈−3.8%\approx -3.8\%≈−3.8%): The modest gain in getppid suggests that ring transitions on 8th-Gen Intel chips are limited by hardware architecture, leaving little room for software-only optimization.

🚀 Real-World Workload: GoReleaser Compilation

To see if these micro-gains translate to actual development, I compiled the GoReleaser codebase using go build -a -o /dev/null. I ensured a clean state by running go clean -cache while keeping the module cache primed.

MetricWSL 2.6.3 (6.6.87)WSL 3.0.2 (6.18.40)Delta
Real (Wall-clock)3m 11.27s (191.27s)3m 03.80s (183.80s)-7.47s (-3.91%)
User (CPU Time)4m 58.99s (298.99s)4m 49.38s (289.38s)-9.61s (-3.21%)
Sys (Kernel Time)0m 57.39s (57.39s)0m 48.22s (48.22s)-9.17s (-15.98%)

Understanding the Runtime Split

While the total wall-clock time only improved by ≈4%\approx 4\%≈4%, the internal breakdown reveals a different story:

  1. Kernel Overhead Collapse: The sys time dropped by nearly 16%. Because the compiler relies heavily on mmap, futex, and openat calls to manage the package graph, the improved slab caching and lower trap overhead in kernel 6.18 provided a significant win.
  2. The Hardware Ceiling: The reason the total time didn't drop further is that compilation is primarily a user-space compute task (Lexing, AST, SSA optimization). Since the VM is capped at two 2.10 GHz cores, the CPU clock speed becomes the primary bottleneck, not the kernel.

🏁 Final Takeaways

Upgrading to WSL 3.x is highly recommended, but the perceived benefit depends on your specific usage:

  • ✅ High-Churn & Memory-Heavy Systems: If you run in-memory databases (e.g., Redis), dense container environments, or microservices using Unix domain sockets, you will see immediate, massive benefits.
  • ⚠️ Compute-Bound Toolchains: If your primary bottleneck is raw CPU execution (like heavy compilation), WSL 3.x will reduce the time spent in the kernel, but your total build time will still be limited by your physical hardware.

Upgrade Checklist

  • Update WSL to version 3.0.2.0 or higher.
  • Verify kernel version is 6.18.x.
  • Check .wslconfig for optimal vCPU pinning.

Related Reading:

  • The "Security Tax": Reclaiming 30% Performance in WSL 2
  • Isolated Sandboxed WSL Environments with Debian Slim
  • Taming GCE Memory Tax on Small Instances

Performance Graph Placeholder