[HN Gopher] C++20 Coroutines and Io_uring
___________________________________________________________________
C++20 Coroutines and Io_uring
Author : signa11
Score : 17 points
Date : 2022-11-13 15:17 UTC (7 hours ago)
(HTM) web link (pabloariasal.github.io)
(TXT) w3m dump (pabloariasal.github.io)
| gavinray wrote:
| Hey just a heads up -- you're setting the queue depth of the ring
| to the number of files discovered, that's typically not the way
| you'd want to size the ring.
|
| When you start to get up into higher queue depths, like
| 512-1,024, you benefit a lot from using flags like
| IORING_SETUP_SQPOLL.
|
| If you're going to do a thread pool too, you may as well use
| IORING_WQ_ATTACH and put a ring on each thread that shares a
| single kernel poller, see the SO explanation I gave recently
| here:
|
| https://stackoverflow.com/questions/73798651/how-to-create-a...
| max_k wrote:
| I love C++ coroutines! (The spec has a few warts and gives me
| enough reasons to hate them, like not being able by definition to
| properly inline nested coroutine calls, but I love them anyway.)
|
| I've written several libraries for integrating C++ coroutines
| with stuff like io_uring, libcurl, c_ares, libpq and more. For
| example, this is how using my io_uring/coroutine library can be
| used:
| https://github.com/CM4all/libcommon/blob/master/test/co/RunC...
| auto result = co_await CoReadTextFile(queue, AT_FDCWD, path);
| co_await CoWrite(queue, STDOUT_FILENO, result.data(),
| result.size(), 0);
|
| This opens a file, stats it, reads its contents, and writes it to
| stdout - all 4 I/O operations are asynchronous with io_uring.
| Source code for CoReadTextFile() which is also a coroutine:
| https://github.com/CM4all/libcommon/blob/master/src/io/uring...
|
| Sample code for libpq:
| https://github.com/CM4all/libcommon/blob/master/test/co/RunC...
| and c_ares
| https://github.com/CM4all/libcommon/blob/master/test/co/RunC...
| and libcurl
| https://github.com/CM4all/libcommon/blob/master/test/curl/Ru...
|
| I wrote all of this for proprietary applications at dayjob, but
| the core library is open source, as is much of my dayjob code.
| The I/O event loop this integrates with is also used by several
| open source projects I maintain, e.g. the Music Player Daemon
| (https://github.com/MusicPlayerDaemon/MPD/tree/master/src/eve...)
| which can also take advantage of io_uring, though not (yet) with
| coroutines, only "classic" non-blocking I/O.
|
| My code is optimized for low-overhead; the very core doesn't even
| use std::function because I fear its implicit heap allocations.
| Long ago, I used boost::asio (which also integrates well with
| coroutines) but didn't like it because it was too bloated for me.
|
| I've rarely seen other nerds talk about C++ coroutines, and never
| about integrating them with io_uring, made me thinking I'm the
| only one. But maybe all the others just don't write/blog about it
| - I never did either... That's why this blog was a refreshing
| read for me, thanks.
| pencilguin wrote:
| Others have integrated io_uring with asio, and asio with co-
| routines. The performance is about the same. The complexity is
| a matter of taste: asio offers lots built in that you would
| need to code yourself for the next project.
|
| I generally lean toward lower total complexity at cost if more
| custom coding, but it is a big tent.
| mrfox321 wrote:
| All new c++ code I work with at bigco are c++ coroutines.
|
| The underlying executors come from folly.
___________________________________________________________________
(page generated 2022-11-13 23:02 UTC)