Latest results shows:
which report Spring 3/4 w Layden to deliver impressively bad results compared to Layden w Loom.
After collecting JFR profiling data in the lab
spring-layden-loom.zip
and using async-profiler jfrconv with --classify option it is clear that:
Leyden (slow):
┌──────────────────┬──────────────┬───────┐
│ Tier │ Leaf samples │ % │
├──────────────────┼──────────────┼───────┤
│ _[0] interpreted │ 854 │ 36.0% │
├──────────────────┼──────────────┼───────┤
│ _[1] C1 │ 846 │ 35.7% │
├──────────────────┼──────────────┼───────┤
│ _[i] inlined │ 278 │ 11.7% │
├──────────────────┼──────────────┼───────┤
│ _[j] C2 │ 267 │ 11.3% │
├──────────────────┼──────────────┼───────┤
│ _[k] kernel │ 127 │ 5.4% │
└──────────────────┴──────────────┴───────┘
Virtual-Leyden (fast):
┌──────────────────┬──────────────┬───────┐
│ Tier │ Leaf samples │ % │
├──────────────────┼──────────────┼───────┤
│ _[0] interpreted │ 15 │ 0.9% │
├──────────────────┼──────────────┼───────┤
│ _[1] C1 │ 498 │ 29.4% │
├──────────────────┼──────────────┼───────┤
│ _[i] inlined │ 608 │ 35.9% │
├──────────────────┼──────────────┼───────┤
│ _[j] C2 │ 343 │ 20.2% │
├──────────────────┼──────────────┼───────┤
│ _[k] kernel │ 230 │ 13.6% │
└──────────────────┴──────────────┴───────┘
Both are running fully consuming the 4 cores (accordly to pidstat and mpstat).
36% of CPU time in leyden is spent executing interpreted code vs under 1% for virtual-leyden.
The Leyden AOT cache for the non-virtual Spring 4 variant is loading code but leaving it stuck in the interpreter — the JIT isn't recompiling it to C1/C2.
As a separate confirmation, mpstat extract of the load test last few seconds:
Leyden mpstat:
04:48:42 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
04:48:43 PM 2 89.00 0.00 9.00 0.00 0.00 2.00 0.00 0.00 0.00 0.00
04:48:43 PM 4 87.88 0.00 9.09 0.00 0.00 3.03 0.00 0.00 0.00 0.00
04:48:43 PM 6 87.88 0.00 9.09 0.00 0.00 3.03 0.00 0.00 0.00 0.00
04:48:43 PM 8 87.00 0.00 10.00 0.00 1.00 2.00 0.00 0.00 0.00 0.00
Virtual-Leyden mpstat:
05:08:17 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
05:08:18 PM 2 77.23 0.00 16.83 0.00 0.99 4.95 0.00 0.00 0.00 0.00
05:08:18 PM 4 78.00 0.00 16.00 0.00 1.00 5.00 0.00 0.00 0.00 0.00
05:08:18 PM 6 77.45 0.00 15.69 0.00 0.98 4.90 0.00 0.00 0.00 0.98
05:08:18 PM 8 80.00 0.00 14.00 0.00 1.00 4.00 0.00 0.00 0.00 1.00
which shows that layden (no Virtual Thread) is spending more urs space cpu time (likely because of slower code, being interpreted).
Latest results shows:
which report Spring 3/4 w Layden to deliver impressively bad results compared to Layden w Loom.
After collecting JFR profiling data in the lab
spring-layden-loom.zip
and using
async-profilerjfrconvwith--classifyoption it is clear that:Leyden (slow):
Virtual-Leyden (fast):
Both are running fully consuming the 4 cores (accordly to pidstat and mpstat).
36% of CPU time in leyden is spent executing interpreted code vs under 1% for virtual-leyden.
The Leyden AOT cache for the non-virtual Spring 4 variant is loading code but leaving it stuck in the interpreter — the JIT isn't recompiling it to C1/C2.
As a separate confirmation,
mpstatextract of the load test last few seconds:Leyden mpstat:
Virtual-Leyden mpstat:
which shows that
layden(no Virtual Thread) is spending more urs space cpu time (likely because of slower code, being interpreted).