mboost-dp1
Java virtual threads the good and the bad
- Forside
- ⟨
- Forum
- ⟨
- Tagwall
Java har for nylig fået virtuelle threads.
Threads er en måde at lave concurrency på som ikke påvirker koden ret meget.
Men der er også et problem. OS skal administrere trådene og med rigtigt mange tråde så begynder OS at bruge mere tid på at administrere trådene end tråden bruger på at udføre ophaver. Med udelukkende CPU tasks så er flere tråde end CPU kan eksekvere samtidigt spild. I en typisk web server sammenhæng hvor mange tråde venter på IO, så er mere end noget i størrelsesordenen 500 x antal VCPU spild.
En måde at løse det på er diverse async/reactive/event-driven tilgange. Og på mange måder er de den rigtige løsning. Men de kræver også at koden laves anderledes.
Java har også reactive frameworks (inkl. actor framework Akka), men man har også ønsket at gøre noget med traditionel multi-threading. Så Java 19 introducerede virtual threads i preview og Java 21 gjorde dem production ready.
Virtual threads er reelt en gammel ide som eksisterede i BEA JRockIt JVM tilbage først i 00'erne.
Ideen går ud på at mappe N virtuelle tråde til M OS tråde hvor N er meget større end M.
Det virker fint. Man kan faktisk starte alle de virtuelle tråde man vil uden at dræbe performance. Jeg har testet op til 32K tråde.
Og det hjælper på performance. Den simpel web server som kommer med JDK kan håndtere 100K req/sec eller 6M req/min med virtuelle tråde.
https://github.com/ebarlas/java-httpserver-vthread...
Cool.
Ikke helt så cool er at der er potentielle problemer. Man har fundet ud af visse brug af synkronisering får OS tråden til ikke at blive frigivet når den virtuelle tråde blokerer.
https://inside.java/2024/02/21/quality-heads-up/
Threads er en måde at lave concurrency på som ikke påvirker koden ret meget.
Men der er også et problem. OS skal administrere trådene og med rigtigt mange tråde så begynder OS at bruge mere tid på at administrere trådene end tråden bruger på at udføre ophaver. Med udelukkende CPU tasks så er flere tråde end CPU kan eksekvere samtidigt spild. I en typisk web server sammenhæng hvor mange tråde venter på IO, så er mere end noget i størrelsesordenen 500 x antal VCPU spild.
En måde at løse det på er diverse async/reactive/event-driven tilgange. Og på mange måder er de den rigtige løsning. Men de kræver også at koden laves anderledes.
Java har også reactive frameworks (inkl. actor framework Akka), men man har også ønsket at gøre noget med traditionel multi-threading. Så Java 19 introducerede virtual threads i preview og Java 21 gjorde dem production ready.
Virtual threads er reelt en gammel ide som eksisterede i BEA JRockIt JVM tilbage først i 00'erne.
Ideen går ud på at mappe N virtuelle tråde til M OS tråde hvor N er meget større end M.
Det virker fint. Man kan faktisk starte alle de virtuelle tråde man vil uden at dræbe performance. Jeg har testet op til 32K tråde.
Og det hjælper på performance. Den simpel web server som kommer med JDK kan håndtere 100K req/sec eller 6M req/min med virtuelle tråde.
https://github.com/ebarlas/java-httpserver-vthread...
Cool.
Ikke helt så cool er at der er potentielle problemer. Man har fundet ud af visse brug af synkronisering får OS tråden til ikke at blive frigivet når den virtuelle tråde blokerer.
https://inside.java/2024/02/21/quality-heads-up/
Opret dig som bruger i dag
Det er gratis, og du binder dig ikke til noget.
Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.