[External] : Re: Project Loom VirtualThreads hang

Ron Pressler ron.pressler at oracle.com
Wed Jan 4 09:22:21 UTC 2023


The main difference between virtual threads and platform threads is that you can have many more virtual threads. Their throughput impact is a result of their number, which allows a server to scale to higher throughputs, and fewer servers to serve the same workload. An application employing 200 virtual threads will not perform significantly better than one employing 200 platform threads (although it might have some convenience advantages, such as not sharing threads and not risking ThreadLocal leaks), and the number of servers required cannot drop from one to zero. Obviously, servers that never reach the workload that virtual threads exist to support will not benefit from the scalability they never use.

— Ron

On 4 Jan 2023, at 01:22, Rob Bygrave <robin.bygrave at gmail.com<mailto:robin.bygrave at gmail.com>> wrote:

FWIW, as I see it in the case of Nima http 1.1 server case with little to no fanout (which in my experience to date is the majority case) there can be relatively few (less than 200) relatively long lived virtual threads + virtual threads used for fanout requests. A lot fewer VTs that gets touted often here.

Nima Http 1.1 case:
1 platform thread listens for new connections - lives for server lifetime.
1 virtual thread per connection - lives for the lifetime of http connection and handles all the requests/responses for that connection. This can be relatively long lived based on keepalive & client lifetime.

If request/response processing requires NO fanout (no requests to other services) but request handling is instead just persisting to and from databases then that's it and Nima will have 1 VT per connection (and imo for many folks this will commonly be low hundreds depending on your server size - we are not all building services for twitter scale etc).

The next common case is limited fanout meaning that a single request/response only incurs 1 or 2 fanout requests to other services (not order of magnitude or anything like this). In this scenario for example, a http 1.1 based service running with 200 concurrent connections is operating with up to 600 virtual threads at any given time.

IMO I think it's going to be common for many "common folk services" to be running with less than 600 virtual threads at any given time. My now outdated testing using Jetty was designed to confirm that using sub 200 VT in total was still preferable to traditional 200 platform threads - to see if there was some inflexion point where we need to choose between VT and PT.

Note that Nima might change to more a VT per request approach but that will not change the number of virtual threads running at any given time.


Cheers, Rob.

On Wed, 4 Jan 2023 at 11:23, Ron Pressler <ron.pressler at oracle.com<mailto:ron.pressler at oracle.com>> wrote:


On 3 Jan 2023, at 19:24, thurston N <thurston.nomagicsoftware at gmail.com<mailto:thurston.nomagicsoftware at gmail.com>> wrote:

Hello Ron,

Quoting:

"Virtual threads replace short individual *tasks* in your application, not platform threads."


 Why short?


Take a TCP server's accept loop.  I would have thought that's a natural target for execution in a virtual thread.


And it's more or less intended to run forever.

A small number of virtual threads may run for a long time, but the vast majority would be short lived. They would naturally form a hierarchy: you’d have one or a couple of threads accepting connections that live forever, several thousand request-handling threads that live as long as a single request, and then tens of thousands or more each servicing a single outgoing service request in a fanout, and those would be even shorter-lived.


"They are best thought of as a business logic entity representing a task rather than an “execution resource.”"


That's a pretty good definition of an "actor" (as in actors-model).  But there's no (even implicit) restriction on the duration of

an actor's lifetime.

Is it your intent to proscribe virtual threads as a possible implementation for actor-model type designs?

Threads are sequential task that is done concurrently with others. What protocols are used to communicate among threads (and the actor model is a communication protocol) is up to the programmer. An actor model is a bit too high-level for the JDK, but libraries may certainly offer actors based on virtual threads, just as others may build other high level constructs.



I'm thinking of simulations, e.g. modelling a migrating herd, bees at a honeycomb, a very busy traffic intersection, et al.

It seems natural (even elegant) to represent each of those entities (deer, bee, car) as a virtual thread, and executing them as a

platform thread isn't an option (because of their sheer number, the essence of the problem that virtual threads is the solution for)

And I'm sure there are innumerable other circumstances that could benefit from LWP (as Erlang terms them)

IMO, it's awfully reductive to restrict practical uses of virtual threads to writing sequential single request/response scenarios



My intent is not to restrict so much as to focus. Simulations are absolutely a great use-case for lightweight threads, but there are implementation choices that may need to balance some desirable properties with others and could result in virtual threads being a better fit for some use-cases than others. Because there are significantly more Java servers than Java simulations, and because servers are normally more complex (in terms of failure modes and architectural graph) and their developers are more mainstream and could benefit from more help, *if* there’s some prioritisation to be made, the server use-case is the one we prioritise over others by addressing it *first*. More people are interested in that use-case, that’s where virtual threads can contribute the most value, and that’s why it’s our *initial* focus.

— Ron

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/loom-dev/attachments/20230104/c8a57307/attachment-0001.htm>


More information about the loom-dev mailing list