CPU-bound endpoint (/cpu vs /cpu-offloaded, 20,000x SHA-256), concurrency=60, 2 vCPU sandbox, Spring Boot 4.1.1 / JDK 25.0.4.1 ============================================================================================================================== LoopResources.DEFAULT_IO_WORKER_COUNT (Netty event-loop threads) = 4 Runtime.availableProcessors() (Schedulers.parallel() thread count) = 2 webflux naive (Mono.fromCallable, no subscribeOn) : total=60 success=60 wall=302ms p50=145ms p99=288ms webflux offloaded (subscribeOn(Schedulers.parallel())) : total=60 success=60 wall=271ms p50=142ms p99=261ms Counter-intuitive result, and worth stating honestly rather than forcing the expected story: on THIS box, the two wall times are close, because Reactor Netty's default event- loop pool (DEFAULT_IO_WORKER_COUNT = max(availableProcessors(), 4) = 4 here) is actually LARGER than Schedulers.parallel()'s pool (sized to availableProcessors() = 2). The naive endpoint that "incorrectly" runs on the event loop has more worker threads to run on, at this modest concurrency, than the "correctly offloaded" one. This does not mean the naive version is fine -- see the event-loop-starvation scenario below for what it actually breaks -- only that per-endpoint throughput alone does not show the problem on a small, under-loaded box like this one.