Processor per packet, 500 typical players
2.6 times less processorservers that write once a tick (every 50 ms), as real ones do
Progress, tests and benchmarks
Meridian is a working proxy: it routes players, balances load and moves them between servers without a loading screen, and it held 1,000 typical bot players on one PC with 0 players lost. An optimisation that cuts the processor use by about 2.5 times has been merged (pull request #160).
Meridian is a proxy for Horizon, a Rust version of Minecraft Java Edition. Players connect to the proxy, and it sends each of them to one of several servers behind it, and can move a player to another server without a loading screen.
Meridian is developed in the open, as a project separate from Horizon. The Horizon team, the maintainers of Horizon, gave directions on how to go about it, and they decide what goes into Horizon itself. Their requests are on a public issue of Horizon: small pull requests, one at a time. These directions are not an endorsement of Meridian.
See Horizon issue #7484.
What was asked and what is done: Roadmap.
Before (main) (commit 57930e6) · After (writes of one read grouped) (commit c38a01e (merged, #160))
With game servers that send a tick's packets together, as real servers do, the proxy now spends about 2.5 times less processor per packet: 1,000 typical players need about 2.6 cores instead of 6.2.
of the 8 cores the proxy may use
2.4 times fewer cores
Measured500 typical players
2.6 times less processor
Measured500 typical players
5.7 times lower
Measuredto each player
12 to 17 packets in each write instead of 1
Measuredthe price of the change
+1.3 % (5 % allowed)
MeasuredNothing is lost for it: the same packets reach the players, no player was dropped, and the memory per player stays within about 1 % of before.
Where there is nothing to group, nothing changes. This was measured on one PC with bots and checked with a real server; it is merged (pull request #160).
servers that write once a tick (every 50 ms), as real ones do
the 8 threads the proxy was given: 8 cores (the tick on the bars).
with a real game server: 14.6 to 16.6
at 500 players: 514 before, 499 after. The first version cost +19 %; it was fixed.
p99: 99 round trips in 100 are faster than this. The 50 ms server tick is part of these figures.
the bots run on the same PC and were the limit
nothing to group here, so nothing should change: it shows that the gain comes from the grouping alone
A control row is a case where nothing should change. It shows that the gain comes from the change alone.
We test with bots that act like players, on one PC. Each number says how sure we are of it:
little traffic: 20 small packets and 2 chunks a second each (the first benchmark's profile)
stand and walk about half of the time; built from one real client (275 small packets and 3.5 chunks a second each)
walking more than half of the time (the stress profile)
Real game servers, real game clients, a real network between them. Few players, but no bots and no shortcut.
real network run (VPS + PC), 8 November
Real server on the VPS, one on the PC, 3 real clients, final proxy. Not tested here: the game server's own speed (TPS), many players.
What is done and validated, what is in progress, and what is planned.
A task is marked done only when it is finished and validated (merged and checked), with a public proof and its date.
With the Horizon team · The roadmap of Meridian
A request is validated when its pull request is merged into Horizon.
A player moves from one Horizon server to another without a loading screen. The stack of seven pull requests was reviewed and merged by the Horizon team between 4 and 5 November.
Proofs: Horizon pull request #8693, Horizon pull request #8700, Horizon pull request #8709, Horizon pull request #8716, Horizon pull request #8730, Horizon pull request #8735, Horizon pull request #8742 · validated 2026-11-05
A Horizon server tells a proxy how many players it holds and whether it takes more, before players are sent to it.
Proof: Horizon pull request #10527 · validated 2026-11-06
A Horizon server turns down a player sent to it when it is full or stopping, and the player stays where they were.
Proof: Horizon pull request #11428 · validated 2026-11-07
Before it stops, a Horizon server gives a proxy a few seconds to move its players to another server.
Proof: Horizon pull request #11713 · validated 2026-11-08
A fix in Horizon for players riding an animal or a vehicle, merged by the Horizon team.
Proof: Horizon pull request #12260 · validated 2026-11-08
What the Horizon team asked for on the issue, done and checked by us; their answer is still to come.
The end-to-end test of moving a player between two Horizon servers, run on Horizon's main branch as asked: 31 of 31 checks, in 3 runs out of 3.
Proof: the results, posted on the issue · validated 2026-11-06
Real Horizon servers, real game clients and a real network, on 6 and 7 November; the results are posted on the issue.
Proofs: the run of 6 November, the run of 7 November, the runs, in detail · validated 2026-11-07
Meridian asks an extension whether a player may log in, where they go and which commands they may use, and it reads the operators of the servers.
Proofs: pull request #137, pull request #144, pull request #145, pull request #120 · validated 2026-11-07
The news of Meridian go to one issue of its own repository, as asked, and no longer to Horizon's.
Proof: issue #117 · validated 2026-11-06
Our one open pull request in Horizon: one at a time, as asked.
Horizon's recipe book takes the entries that the server sends, so it works on a Paper server. Ready for review since 8 November; its automatic checks pass.
Proof: Horizon pull request #12496
Work on Meridian's side that needs nothing from Horizon. Each one is on the roadmap below.
Details in the roadmap below.
Details in the roadmap below.
Details in the roadmap below.
Details in the roadmap below.
Details in the roadmap below.
A crash of Horizon when leaving a server or a world: we read the log that came with it, and we wait for the answer of the person who reported it.
Proof: Horizon issue #11678
The proxy now sends a server's packets to a player in one write instead of one write each: about 2.5 times less processor, measured before and after, then tested on a real network.
Proofs: pull request #160, the measures, before and after · validated 2026-11-08
The metrics page and the health check answer at once, the summary of an evacuation counts every player, and the documents say what Horizon's stop wait changes.
Proofs: pull request #151, pull request #152, pull request #154 · validated 2026-11-08
An extension can declare commands of its own, such as /party: the proxy takes them, the extension answers the player, and the game server never sees them.
Proofs: pull request #153, pull request #156, pull request #158, pull request #159 · validated 2026-11-08
Real Horizon servers, three real game clients and a real network: moves between servers with the inventory kept, a server that stops with players on it, and a server that crashes, its players falling back to the other one.
Proofs: the test on a real network, 8 November, pull request #161 · validated 2026-11-08
A public page that shows what was measured and what was not, in English and in French.
Proof: the progress page · validated 2026-11-08
Bots that act like players, on real Horizon servers behind the proxy: 50 players first, then 250, 500, and 1,000 on one PC.
An extension will be able to ask the proxy for things: read the players, send a message, move or kick a player, drain or reload a server, and, last, run a line of the proxy's console. Eight pull requests, one at a time.
1 of 8 steps validated
The proxy will tell extensions what happens, such as a player who joins or leaves, in three pull requests.
A real game client types an extension's command through the proxy; the test checks that the server never saw it, also while the extension is stopped and when it comes back.
Keep one compressor for each connection instead of setting up a new one for every large packet, to cut the processor use again.
The proxy will pass the state of each server to extensions, so that they can choose better where a player goes.
Test the proxy over a poor network (delay, loss) with a simulator, and start or stop servers by themselves as players come and go.
Only if the goal goes past 2,500 players: several proxies that share the players and the servers.
This list is part of the results. If something is not shown on this page, it has not been measured.
Measured on one PC, with synthetic bots and real servers (see each row). The optimisation is merged (pull request #160).