[ovs-dev] [PATCH v2 10/28] mpsc-queue: Module for lock-free message passing
Maxime Coquelin
maxime.coquelin at redhat.com
Thu Apr 22 09:13:35 UTC 2021
Hi Gaetan,
On 4/12/21 5:19 PM, Gaetan Rivet wrote:
> Add a lockless multi-producer/single-consumer (MPSC), linked-list based,
> intrusive, unbounded queue that does not require deferred memory
> management.
>
> The queue is an implementation of the structure described by Dmitri
> Vyukov[1]. It adds a slightly more explicit API explaining the proper use
> of the queue.
> Alternatives were considered such as a Treiber Stack [2] or a
> Michael-Scott queue [3], but this one is faster, simpler and scalable.
>
> [1]: http://www.1024cores.net/home/lock-free-algorithms/queues/intrusive-mpsc-node-based-queue
>
> [2]: R. K. Treiber. Systems programming: Coping with parallelism.
> Technical Report RJ 5118, IBM Almaden Research Center, April 1986.
>
> [3]: M. M. Michael, Simple, Fast, and Practical Non-Blocking and Blocking
> Concurrent Queue Algorithms.
> https://www.cs.rochester.edu/research/synchronization/pseudocode/queues.html
>
> The queue is designed to improve the specific MPSC setup. A benchmark
> accompanies the unit tests to measure the difference in this configuration.
> A single reader thread polls the queue while N writers enqueue elements
> as fast as possible. The mpsc-queue is compared against the regular ovs-list
> as well as the guarded list. The latter usually offers a slight improvement
> by batching the element removal, however the mpsc-queue is faster.
>
> The average is of each producer threads time:
>
> $ ./tests/ovstest test-mpsc-queue benchmark 3000000 1
> Benchmarking n=3000000 on 1 + 1 threads.
> type\thread: Reader 1 Avg
> mpsc-queue: 161 161 161 ms
> list: 803 803 803 ms
> guarded list: 665 665 665 ms
>
> $ ./tests/ovstest test-mpsc-queue benchmark 3000000 2
> Benchmarking n=3000000 on 1 + 2 threads.
> type\thread: Reader 1 2 Avg
> mpsc-queue: 102 101 97 99 ms
> list: 246 212 246 229 ms
> guarded list: 264 263 214 238 ms
>
> $ ./tests/ovstest test-mpsc-queue benchmark 3000000 3
> Benchmarking n=3000000 on 1 + 3 threads.
> type\thread: Reader 1 2 3 Avg
> mpsc-queue: 92 91 92 91 91 ms
> list: 520 517 515 520 517 ms
> guarded list: 405 395 401 404 400 ms
>
> $ ./tests/ovstest test-mpsc-queue benchmark 3000000 4
> Benchmarking n=3000000 on 1 + 4 threads.
> type\thread: Reader 1 2 3 4 Avg
> mpsc-queue: 77 73 73 77 75 74 ms
> list: 371 359 361 287 370 344 ms
> guarded list: 389 388 359 363 357 366 ms
>
> Signed-off-by: Gaetan Rivet <grive at u256.net>
> Reviewed-by: Eli Britstein <elibr at nvidia.com>
> ---
> lib/automake.mk | 2 +
> lib/mpsc-queue.c | 251 ++++++++++++++
> lib/mpsc-queue.h | 189 +++++++++++
> tests/automake.mk | 1 +
> tests/library.at | 5 +
> tests/test-mpsc-queue.c | 727 ++++++++++++++++++++++++++++++++++++++++
> 6 files changed, 1175 insertions(+)
> create mode 100644 lib/mpsc-queue.c
> create mode 100644 lib/mpsc-queue.h
> create mode 100644 tests/test-mpsc-queue.c
Nice and well documented implementation!
Reviewed-by: Maxime Coquelin <maxime.coquelin at redhat.com>
Thanks,
Maxime
More information about the dev
mailing list