Repository navigation
Conversation
GET /rendezvous/{key}?v={value}: the first request for a key waits, the second
completes both, and each is answered with the other's value. Every other profile
answers a request from that request alone, which is the case one shared-nothing
event loop per core is built for. Here the two sides usually sit on different
workers, so something has to cross between them on every exchange.
It runs over plain HTTP with wrk and a Lua script that pairs requests as they go
out, so a server can't arrange for a pair to land on one worker, and any entry with
async handlers can subscribe. It's scored on its own board and counts toward no
other composite.
chi, actix, aspnet-minimal, vertx, helidon-production and node implement it, one
each of goroutines, one worker per core, a thread pool, one event loop per core,
virtual threads and one process per core.
Refs #1686
Contributor
|
👋 Heads up! This PR modifies the following frameworks:
|
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Refs #1686.
The test
The first request for a key waits. The second completes both, and each is answered with the other's value. So no response can be produced from one request alone.
Every other profile answers a request from that request alone, which is exactly what one shared-nothing event loop per core is built for. Here the two sides usually sit on different workers, so something has to cross between them on every exchange: a queue, a wakeup, a lock, a copy or a message to another process. That is the cost the issue says the board never shows.
Why this shape, given the bar set in the issue, that it must run on every technology and compare apples to apples:
wrkwith a Lua script.What's in this PR
A new Interaction category (
ix), at the same level as H/2 and H/3, with its own board, badges and docs. Rendezvous is scored there and counts toward no other composite.The
rendezvousprofile, 4,096 connections, 3×5s, withrequests/rendezvous.lua.scripts/validate-rendezvous.py, which is the whole anti-cheat, becausewrkdoesn't read the bodies.Six entries, one for each way of running a server:
actixDashMapand a tokio oneshotvertxConcurrentHashMap, answered back on the waiter's event loopaspnet-minimalConcurrentDictionaryand aTaskCompletionSourcechisync.Mapand a channelhelidon-productionConcurrentHashMapand a blocking futurenodeFirst numbers
Local only, so directional. It's a 14900K with the server on 16 P-core threads and
wrkon the 16 E-cores, best of 3×5s. The plain GET uses the same generator, connections and pinning, so the difference is the crossing and not the tool.actixaspnet-minimalhelidon-productionvertxchinodenodekeeps 31%, because every request goes through the primary over IPC.actixwasn't saturating the server on its plain GET (about 13.4 of 16 cores), so its 96% flatters it.actix, the closest thing here to the shared-nothing designs it describes, kept more thanchi. But no thin C, C++ or Zig engine implements this yet, and that's the case the issue is about. 16 CPUs may also understate it, because a shared map contends harder on the bench host's 64.Verified
All six entries pass
validate.sh, including the 8 new checks.The validator fails servers that break the contract. I ran it against throwaway servers:
wrkreported no socket errors on any rendezvous run. A pair stuck without a partner would show up as timeouts.benchmark.sh --saveworks end to end onactixandnode. The site builds with and without results, badge parity passes, and the board and docs render in headless Chrome.Not run: the bench host.
Before merging
/benchmarkcomment runs this PR's scripts, so this works as is:/benchmark-test -t rendezvousafter merge, or add--saveabove.validate.shandprofiles.sh, so it validates all 205 entries, and 13 of them currently fail for reasons of their own (see the runs on benchmark: give the database tests their own category and CPU split #1715).README.md,check_badge_parity.js,gen_leaderboard_data.py,badges.md,composite-score.md,test-profiles/_index.mdandindex.html. There are none with benchmark: warm up on every profile, 2x15s on the main throughput ones #1714.🤖 Generated with Claude Code