{
    "archive_path": "archive/1791626739.861924",
    "base_url": "tonym.us/wsl2-vs-wsl3-benchmarks.html",
    "basename": "wsl2-vs-wsl3-benchmarks.html",
    "bookmarked_date": "2026-10-10 10:05",
    "canonical": {
        "archive_org_path": "https://web.archive.org/web/tonym.us/wsl2-vs-wsl3-benchmarks.html",
        "dom_path": "output.html",
        "favicon_path": "favicon.ico",
        "git_path": "git/",
        "google_favicon_path": "https://www.google.com/s2/favicons?domain=tonym.us",
        "headers_path": "headers.json",
        "htmltotext_path": "htmltotext.txt",
        "index_path": "index.html",
        "media_path": "media/",
        "mercury_path": "mercury/content.html",
        "pdf_path": "output.pdf",
        "readability_path": "readability/content.html",
        "screenshot_path": "screenshot.png",
        "singlefile_path": "singlefile.html",
        "warc_path": "warc/",
        "wget_path": "tonym.us/wsl2-vs-wsl3-benchmarks.html"
    },
    "domain": "tonym.us",
    "extension": "html",
    "hash": "19SKJG8WWYMBYE28WZWV",
    "history": {
        "archive_org": [],
        "dom": [],
        "favicon": [
            {
                "cmd": [
                    "curl",
                    "--silent",
                    "--location",
                    "--compressed",
                    "--max-time",
                    "120",
                    "--output",
                    "favicon.ico",
                    "--user-agent",
                    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 ArchiveBox/0.7.4 (+https://github.com/ArchiveBox/ArchiveBox/) curl/curl 8.14.1 (x86_64-pc-linux-gnu)",
                    "https://www.google.com/s2/favicons?domain=tonym.us"
                ],
                "cmd_version": "curl 8.14.1 (x86_64-pc-linux-gnu)",
                "end_ts": "2026-10-10T10:06:01.048875+00:00",
                "index_texts": null,
                "output": "favicon.ico",
                "pwd": "/data/archive/1791626739.861924",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-10T10:06:00.503499+00:00",
                "status": "succeeded"
            }
        ],
        "git": [],
        "headers": [
            {
                "cmd": [
                    "curl",
                    "--silent",
                    "--location",
                    "--compressed",
                    "--head",
                    "--max-time",
                    "120",
                    "--user-agent",
                    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 ArchiveBox/0.7.4 (+https://github.com/ArchiveBox/ArchiveBox/) curl/curl 8.14.1 (x86_64-pc-linux-gnu)",
                    "https://tonym.us/wsl2-vs-wsl3-benchmarks.html"
                ],
                "cmd_version": "curl 8.14.1 (x86_64-pc-linux-gnu)",
                "end_ts": "2026-10-10T10:06:01.437267+00:00",
                "index_texts": null,
                "output": "headers.json",
                "pwd": "/data/archive/1791626739.861924",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-10T10:06:01.057422+00:00",
                "status": "succeeded"
            }
        ],
        "htmltotext": [],
        "media": [],
        "mercury": [
            {
                "cmd": [
                    "/app/node_modules/@postlight/parser/cli.js",
                    "https://tonym.us/wsl2-vs-wsl3-benchmarks.html"
                ],
                "cmd_version": "1.0.0",
                "end_ts": "2026-10-10T10:06:07.487547+00:00",
                "index_texts": null,
                "output": "mercury",
                "pwd": "/data/archive/1791626739.861924",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-10T10:06:04.152459+00:00",
                "status": "succeeded"
            }
        ],
        "pdf": [],
        "readability": [
            {
                "cmd": [
                    "/app/node_modules/readability-extractor/readability-extractor",
                    "/tmp/tmpux51_nks",
                    "https://tonym.us/wsl2-vs-wsl3-benchmarks.html"
                ],
                "cmd_version": "0.0.11",
                "end_ts": "2026-10-10T10:06:04.142190+00:00",
                "index_texts": [
                    "With the release of the WSL 3.x stack, Microsoft bumped the default virtualization runtime and advanced the shipped guest kernel from the 6.6 LTS branch up to 6.18.\nWSL upgrades often claim generalized performance gains, but marketing bullet points rarely translate directly to developer workloads. To see what actually changed under the hood, I ran side-by-side benchmark suites comparing WSL 2.6.3.0 (Linux kernel 6.6.87.2) against WSL 3.0.2.0 (Linux kernel 6.18.40.1).\nHere is what the empirical numbers look like across kernel primitives, memory bandwidth, and an end-to-end Go compiler workload.\n\nThe Test Environment\nTo keep the test clean and reproducible, the guest environment was provisioned using an Alpine Linux 3.23.0 root filesystem (minirootfs) running Go 1.27.1:\n\n\nGuest OS: Alpine Linux 3.23.0 (x86_64)\n\n\nGuest Kernel (WSL3): 6.18.40.1-microsoft-standard-WSL2\n\n\nGo Version: Go 1.27.1\n\n\nHost Machine: HP ProDesk 400 G4 Desktop Mini (DM)\n\n\nProcessor: Intel Core i5-8500T (6C/6T Coffee Lake @ 2.10 GHz base)\n\n\nHost RAM: 16 GB DDR4\n\n\nHost OS: Windows 11 Pro (Build 26200.9550, VBS active)\n\n\nWSL Resource Allocations (.wslconfig):\n\nprocessors=2 (pinned to 2 vCPUs)\nmemory=4GB\nnetworkingMode=nat\nfirewall=true\n\n\n\n\nLow-Level Kernel Microbenchmarks\nUsing standard perf bench suites, we can isolate raw scheduler latency, IPC throughput, and memory bandwidth independent of user-space tooling.\n\n  \n      \n          Benchmark Suite\n          Metric\n          WSL 2.6.3 (6.6.87)\n          WSL 3.0.2 (6.18.40)\n          Delta\n      \n  \n  \n      \n          syscall/basic\n          getppid() throughput\n          1,474,691 ops/s\n          1,533,399 ops/s\n          +3.98%\n      \n      \n          \n          Entry/exit latency\n          0.6781 \u00b5s/op\n          0.6521 \u00b5s/op\n          -3.83%\n      \n      \n          sched/pipe\n          100k process ping-pong\n          48,445 ops/s\n          54,589 ops/s\n          +12.68%\n      \n      \n          \n          Context switch latency\n          20.64 \u00b5s/op\n          18.32 \u00b5s/op\n          -11.25%\n      \n      \n          sched/messaging\n          Hackbench (20 groups, 800 tasks)\n          14.507 s\n          13.047 s\n          -10.06%\n      \n      \n          mem/memcpy\n          glibc default bandwidth (1GB)\n          7.84 GB/s\n          12.64 GB/s\n          +61.35%\n      \n  \n\nWhat the Kernel Deliberations Tell Us\n\nMemory Bandwidth Surge (+61.35%):\nThe single largest jump is sequential memory throughput, climbing from 7.84 GB/s to 12.64 GB/s. A primary contributor in the 3.x kernel command line is page_reporting.page_reporting_order=5. Raising the page reporting granularity reduces hypervisor trap frequency and page-table walking overhead when the guest interacts with Hyper-V\u2019s dynamic memory reclamation interface.\nScheduler & IPC Latency (-11%):\nBoth sched/pipe and sched/messaging show noticeable drops in latency. The upstream kernel 6.18 scheduler refinements, paired with tighter Hyper-V VMBus synthetic interrupt handling, reduce the CPU-to-CPU wake penalties when bouncing messages between runnable tasks across the two pinned vCPUs.\nBasic Syscall Transition (-3.8%):\nRaw system call entry and exit (getppid) saw a modest bump. Trivial ring transitions on 8th-Gen Intel hardware remain governed by fixed CPU architectural boundaries, leaving less room for hypervisor software tuning alone to alter entry costs.\n\n\nReal-World Workload: GoReleaser Compilation\nTo test how these micro-level improvements map to developer tooling, I compiled the GoReleaser codebase (go build -a -o /dev/null) with an empty compiler cache (go clean -cache) and a primed module cache:\n\n  \n      \n          Metric\n          WSL 2.6.3 (6.6.87)\n          WSL 3.0.2 (6.18.40)\n          Delta\n      \n  \n  \n      \n          Real (Wall-clock)\n          3m 11.27s (191.27s)\n          3m 03.80s (183.80s)\n          -7.47s (-3.91%)\n      \n      \n          User (CPU Time)\n          4m 58.99s (298.99s)\n          4m 49.38s (289.38s)\n          -9.61s (-3.21%)\n      \n      \n          Sys (Kernel Time)\n          0m 57.39s (57.39s)\n          0m 48.22s (48.22s)\n          -9.17s (-15.98%)\n      \n  \n\nBreaking Down the Runtime Split\nWhile top-line wall-clock compilation speed moved by roughly 4%, the underlying distribution of execution time highlights where the stack actually improved:\n\nKernel Overhead (sys) Collapsed by ~16%:\nThe compiler repeatedly executes openat, newfstatat, mmap, and futex calls while scanning the package graph and coordinating compilation workers. The lower kernel trap overhead and improved slab caching in 6.18 directly shaved over 9 seconds off time spent inside the kernel.\nThe Wall-Clock Ceiling:\nThe reason total real time only moved by ~7.5 seconds is straightforward: compilation is predominantly a user-space compute workload. Lexing, AST construction, type checking, and SSA optimization account for over 80% of the total clock cycles. Because the VM is capped at two physical cores running at a 2.10 GHz base clock, raw CPU execution bounds dominate the overall duration.\n\n\nTakeaways\nUpgrading from WSL 2.x to WSL 3.x is a worthwhile jump, but where you see the benefit depends heavily on your workload profile:\n\nHigh-Churn IPC and Memory-Intensive Systems Win: Local workloads running in-memory databases (Redis, SQLite), container-dense workflows, or microservices passing payloads over Unix domain sockets benefit immediately from the +61% memory bandwidth boost and 10\u201311% lower context-switching latency.\nCompute-Bound Compilers Hit Hardware Ceilings: If your build toolchain spends most of its time executing user-space code on constrained vCPUs, WSL 3.x will significantly cut your kernel time (sys), but your overall build duration will still be dictated by core frequency and thread count."
                ],
                "output": "readability",
                "pwd": "/data/archive/1791626739.861924",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-10T10:06:02.328008+00:00",
                "status": "succeeded"
            }
        ],
        "screenshot": [],
        "singlefile": [],
        "title": [
            {
                "cmd": [
                    "curl",
                    "--silent",
                    "--location",
                    "--compressed",
                    "--max-time",
                    "120",
                    "--user-agent",
                    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 ArchiveBox/0.7.4 (+https://github.com/ArchiveBox/ArchiveBox/) curl/curl 8.14.1 (x86_64-pc-linux-gnu)",
                    "https://tonym.us/wsl2-vs-wsl3-benchmarks.html"
                ],
                "cmd_version": "curl 8.14.1 (x86_64-pc-linux-gnu)",
                "end_ts": "2026-10-10T10:06:02.320238+00:00",
                "index_texts": null,
                "output": "WSL2 vs WSL3 Benchmarks: Performance, Memory, and Syscall Scaling // Tony Metzidis",
                "pwd": "/data/archive/1791626739.861924",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-10T10:06:02.307611+00:00",
                "status": "succeeded"
            }
        ],
        "wget": [
            {
                "cmd": [
                    "wget",
                    "--no-verbose",
                    "--adjust-extension",
                    "--convert-links",
                    "--force-directories",
                    "--span-hosts",
                    "--no-parent",
                    "-e",
                    "robots=off",
                    "--reject=js,mjs,woff,woff2,ttf,otf,eot,mp4,m4v,mov,webm,ogv,mkv,avi,flv",
                    "--timeout=120",
                    "--restrict-file-names=windows",
                    "--page-requisites",
                    "--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 ArchiveBox/0.7.4 (+https://github.com/ArchiveBox/ArchiveBox/) wget/GNU Wget 1.21.3",
                    "--compression=auto",
                    "--timestamping",
                    "https://tonym.us/wsl2-vs-wsl3-benchmarks.html"
                ],
                "cmd_version": "GNU Wget 1.21.3",
                "end_ts": "2026-10-10T10:06:02.298921+00:00",
                "index_texts": null,
                "output": "tonym.us/wsl2-vs-wsl3-benchmarks.html",
                "pwd": "/data/archive/1791626739.861924",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-10T10:06:01.446730+00:00",
                "status": "succeeded"
            }
        ]
    },
    "icons": null,
    "is_archived": true,
    "is_static": false,
    "latest": {
        "archive_org": null,
        "dom": null,
        "favicon": "favicon.ico",
        "git": null,
        "media": null,
        "pdf": null,
        "screenshot": null,
        "singlefile": null,
        "title": "WSL2 vs WSL3 Benchmarks: Performance, Memory, and Syscall Scaling // Tony Metzidis",
        "warc": null,
        "wget": "tonym.us/wsl2-vs-wsl3-benchmarks.html"
    },
    "link_dir": "/data/archive/1791626739.861924",
    "newest_archive_date": "2026-10-10T10:06:04.152459+00:00",
    "num_failures": 0,
    "num_outputs": 6,
    "oldest_archive_date": "2026-10-10T10:06:00.503499+00:00",
    "path": "/wsl2-vs-wsl3-benchmarks.html",
    "schema": "Link",
    "scheme": "https",
    "snapshot_id": "b953bf0f-035e-4cd3-a5cd-c1bbcd1c2c2f",
    "sources": [
        "/data/sources/1791626739-import.txt"
    ],
    "tags": null,
    "tags_str": "",
    "timestamp": "1791626739.861924",
    "title": "WSL2 vs WSL3 Benchmarks: Performance, Memory, and Syscall Scaling // Tony Metzidis",
    "updated": "2026-10-10T10:06:00.503035+00:00",
    "updated_date": "2026-10-10 10:06",
    "url": "https://tonym.us/wsl2-vs-wsl3-benchmarks.html"
}