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=358ms p50=209ms p99=330ms webflux offloaded (subscribeOn(Schedulers.parallel())) : total=60 success=60 wall=324ms p50=171ms p99=283ms 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.