Pondering a "threadless" VCL execution model

Nils Goroll nils.goroll at uplex.de
Wed Aug 19 11:49:37 UTC 2026


Hi,

as many of you reading this will probably know, a colleague and me have been 
working on async I/O for Vinyl Cache for ~2 years and we are going to publish 
what we have this year.

The following concerns the client side only.

The model we are following so far is basically one I/O thread per core, which 
can be thought of the acceptor and waiter combined, plus doing most of the I/O. 
When VCL needs to run, the I/O thread would dispatch the req parsing and VCL FSM 
to run on a worker. This would ultimately call the transport's vtr_deliver_f, 
which would return VTR_D_DISEMBARK to leave the actual delivery with the I/O thread.

The reason to switch to a worker thread is that VCL could do anything, in 
particular block on I/O, and we certainly would not want the I/O thread to halt 
neglect other work just because some vmod calls sleep(10).

Now this is all good and well, except that the thread switching has a cost, and 
there are many cases where VCL never blocks. And, obviously, for these cases not 
dispatching VCL and running it in the I/O thread would be more efficient.

Also, at the moment, we might still block waiting for a backend thread, but 
handling this differently does not look like a relevant problem.

I have been pondering ideas on and off how we could achieve to keep the 
dedicated worker thread for VCL if/when we need it, and get rid of it where we can.

The obvious way would be for vmod functions to announce "I will block" when they 
do, and core code would implement some kind of "coroutine" context swapping 
using swapcontext. This looks to me like the right solution, but it comes with 
complexity and potential pitfalls, like if Thread Local Storage is used.

The other idea is just to have VMODs announce globally that they "need a thread" 
(or maybe the inverse, rather). This way, as soon as a VMOD using blocking I/O 
was imported, processing would switch from "single worker" to "dedicated 
thread". I am skeptical about this idea, because it might render the whole 
optimization useless in practice.

Now my question is if anyone has any better ideas on this?

Nils

--

Nils Goroll (he/him)

** * * UPLEX - Nils Goroll Systemoptimierung

Scheffelstraße 32
22301 Hamburg

tel +49 40 28805731
mob +49 170 2723133
fax +49 40 42949753

xmpp://slink@jabber.int.uplex.de/

http://uplex.de/

-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_0x1DCD8F57A3868BD7.asc
Type: application/pgp-keys
Size: 4845 bytes
Desc: OpenPGP public key
URL: <https://vinyl-cache.org/lists/pipermail/vinyl-dev/attachments/20260819/fd9e8a1c/attachment.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <https://vinyl-cache.org/lists/pipermail/vinyl-dev/attachments/20260819/fd9e8a1c/attachment-0001.bin>


More information about the vinyl-dev mailing list