Daemon benchmarks
Performance results for the Calagopus daemon, measured against Pterodactyl Wings and Pelican Wings on identical hardware. The daemon is the node agent that runs game servers: it serves the file manager, streams archives, and reports system state. These numbers measure the daemon's own work, not how the game servers it manages perform; the daemon affects those servers only through the CPU and memory it takes from the same node.
For the web panel and its API, see panel benchmarks.
Archive and file work comes first, since those are the operations users wait on. Dots match the bar colours. How this was measured
Archive performance
↓ Lower is better - median wall clock for one run.
View this chart's data as a table
| System | Calagopus Wings (ms) | Pelican Wings (ms) | Pterodactyl Wings (ms) |
|---|---|---|---|
| 9900X | 217.1 | 941.3 | 355.6 |
| EPYC 7443P | 5446.4 | 6538.0 | 6195.2 |
| 2× E5-2680v2 | 8091.1 | 7633.1 | 8001.3 |
| i5-12500 | 322.2 | 1239.8 | 1037.0 |
| Altra Q80-30 | 4644.8 | 5812.4 | 6705.7 |
Where the archive difference comes from
Mostly the deflate implementation: Calagopus uses zlib-ng and splits the work across a small thread pool (api.file_compression_threads), where both Wings builds run pgzip on one thread.
File operations
Every task scenario, timed one at a time. Median wall clock, with transfer rate, CPU cost per run and peak memory underneath.
Compression
| Scenario | Calagopus Wings | Pelican Wings | Pterodactyl Wings |
|---|---|---|---|
compress 100 MiB tree (tar.gz) | 30 ms3372 MiB/s68 cpu-ms80 MiB | 92 ms1087 MiB/s97 cpu-ms25 MiB | 82 ms1214 MiB/s166 cpu-ms53 MiB |
compress 1 GiB tree (tar.gz) | 217 ms4717 MiB/s568 cpu-ms59 MiB | 941 ms1088 MiB/s1011 cpu-ms51 MiB | 356 ms2880 MiB/s878 cpu-ms50 MiB |
compress 50k small files tree (tar.gz) | 199 ms61 MiB/s243 cpu-ms48 MiB | 382 ms32 MiB/s429 cpu-ms83 MiB | 245 ms50 MiB/s347 cpu-ms42 MiB |
compress 100 MiB tree (zip) | 55 ms1818 MiB/s102 cpu-ms81 MiB | not supported | not supported |
Decompression
| Scenario | Calagopus Wings | Pelican Wings | Pterodactyl Wings |
|---|---|---|---|
decompress 100 MiB archive (tar.gz) | 42 ms2357 MiB/s88 cpu-ms59 MiB | 109 ms917 MiB/s128 cpu-ms23 MiB | 111 ms898 MiB/s135 cpu-ms24 MiB |
decompress 1 GiB archive (tar.gz) | 409 ms2501 MiB/s882 cpu-ms47 MiB | 1,350 ms759 MiB/s1265 cpu-ms24 MiB | 1,244 ms823 MiB/s1369 cpu-ms24 MiB |
decompress 50k small files archive (tar.gz) | 530 ms23 MiB/s1087 cpu-ms31 MiB | 1,174 ms10 MiB/s1398 cpu-ms24 MiB | 1,228 ms10 MiB/s1570 cpu-ms24 MiB |
decompress 100 MiB archive (zip) | 29 ms3387 MiB/s96 cpu-ms38 MiB | 104 ms962 MiB/s124 cpu-ms24 MiB | 106 ms943 MiB/s131 cpu-ms26 MiB |
decompress 1 GiB archive (zip) | 249 ms4121 MiB/s887 cpu-ms60 MiB | 1,365 ms750 MiB/s1273 cpu-ms38 MiB | 1,352 ms758 MiB/s1349 cpu-ms39 MiB |
Deletion
| Scenario | Calagopus Wings | Pelican Wings | Pterodactyl Wings |
|---|---|---|---|
delete 100 MiB tree | 13 ms22 cpu-ms46 MiB | 26 ms28 cpu-ms23 MiB | 22 ms21 cpu-ms36 MiB |
delete 1 GiB tree | 113 ms207 cpu-ms30 MiB | 260 ms274 cpu-ms23 MiB | 202 ms207 cpu-ms25 MiB |
delete 50k small files tree | 165 ms329 cpu-ms26 MiB | 460 ms480 cpu-ms23 MiB | 343 ms354 cpu-ms24 MiB |
Transfer
| Scenario | Calagopus Wings | Pelican Wings | Pterodactyl Wings |
|---|---|---|---|
upload file (256 MiB) | 223 ms1146 MiB/s79 cpu-ms30 MiB | 252 ms1015 MiB/s92 cpu-ms23 MiB | 233 ms1099 MiB/s82 cpu-ms23 MiB |
Large directory listings
| Scenario | Calagopus Wings | Pelican Wings | Pterodactyl Wings |
|---|---|---|---|
list directory (5000 entries) | 8.5 ms18 cpu-ms57 MiB | 36 ms44 cpu-ms27 MiB | 44 ms55 cpu-ms30 MiB |
list directory (50000 entries) | 69 ms160 cpu-ms75 MiB | 349 ms462 cpu-ms95 MiB | 430 ms609 cpu-ms100 MiB |
Memory
↓ Lower is better - footprint with no traffic, sampled before the run.
View this chart's data as a table
| System | Calagopus Wings (MiB) | Pelican Wings (MiB) | Pterodactyl Wings (MiB) |
|---|---|---|---|
| 9900X | 10.2 | 23.2 | 22.8 |
| EPYC 7443P | 10.2 | 11.7 | 10.6 |
| 2× E5-2680v2 | 10.3 | 11.0 | 10.6 |
| i5-12500 | 10.2 | 21.5 | 22.3 |
| Altra Q80-30 | 11.1 | 13.7 | 11.1 |
↓ Lower is better - peak footprint while serving this scenario.
View this chart's data as a table
| System | Calagopus Wings (MiB) | Pelican Wings (MiB) | Pterodactyl Wings (MiB) |
|---|---|---|---|
| 9900X | 21.4 | 80.5 | 85.1 |
| EPYC 7443P | 20.5 | 76.7 | 106.1 |
| 2× E5-2680v2 | 21.1 | 78.7 | 81.0 |
| i5-12500 | 22.2 | 81.3 | 82.3 |
| Altra Q80-30 | 20.5 | 83.1 | 84.3 |
Request scenarios
Why this matters on shared hosting
The daemon competes with your game servers for the same CPU. A game server that misses its CPU time drops ticks instead of slowing down gradually, so how cheaply the daemon handles each operation matters more than its peak throughput.
Throughput
↑ Higher is better - more requests served per second.
View this chart's data as a table
| System | Calagopus Wings (req/s) | Pelican Wings (req/s) | Pterodactyl Wings (req/s) |
|---|---|---|---|
| 9900X | 364261.9 | 4315.7 | 4366.2 |
| EPYC 7443P | 128312.2 | 2032.8 | 2106.8 |
| 2× E5-2680v2 | 80772.6 | 1401.2 | 1392.5 |
| i5-12500 | 211010.0 | 2456.9 | 2333.3 |
| Altra Q80-30 | 113544.0 | 1840.4 | 1825.2 |
Average latency
↓ Lower is better - faster average response.
View this chart's data as a table
| System | Calagopus Wings (ms) | Pelican Wings (ms) | Pterodactyl Wings (ms) |
|---|---|---|---|
| 9900X | 1.0 | 88.5 | 87.5 |
| EPYC 7443P | 3.0 | 187.7 | 180.9 |
| 2× E5-2680v2 | 4.7 | 271.7 | 274.4 |
| i5-12500 | 1.8 | 155.3 | 163.7 |
| Altra Q80-30 | 3.4 | 207.6 | 209.5 |
CPU cost per request
↓ Lower is better - less CPU burned per response, with the idle floor removed.
View this chart's data as a table
| System | Calagopus Wings (cpu-ms) | Pelican Wings (cpu-ms) | Pterodactyl Wings (cpu-ms) |
|---|---|---|---|
| 9900X | 0.0170 | 0.459 | 0.477 |
| EPYC 7443P | 0.0460 | 0.856 | 0.872 |
| 2× E5-2680v2 | 0.0790 | 1.5 | 1.6 |
| i5-12500 | 0.0200 | 0.583 | 0.584 |
| Altra Q80-30 | 0.0520 | 0.989 | 1.0 |
Test setup
Methodology
All three daemons run from their official :latest Docker images with no configuration beyond initial setup, driven by our open-source benchmarking suite at CPU limits of 1, 2, 4 and 8 CPUs.
Request scenarios hold 384 concurrent connections for 10 seconds after a 1-second warmup and report throughput and latency from a single run. The suite defaults to 32 connections (8 for the 8 MiB download) and this run passed -c 384, so its README figures differ from these. Task scenarios are timed one at a time, 5 times (10 for directory listings) after a warmup run, and report the median. Run-to-run spread is typically 13% and above 23% for a quarter of the cells, so treat task gaps under about 25% as ties. The warmup leaves the files in page cache, so archive and listing tasks compare codecs and serialisation rather than disk reads; on an HDD, a network volume or a cold cache, storage would dominate and the gaps would shrink.
Memory is anon + shmem, excluding page cache and slab. cpu-ms is CPU time per request or task run with the idle floor subtracted, and lower is better.
Daemons tested
1.2.41.0.0-beta291.13.3Capability gaps
Where a daemon cannot perform a scenario the suite skips it rather than recording a zero, so these are missing features, not missing measurements.
compress 100 MiB tree (zip) is not supported by Pelican Wings, Pterodactyl Wings
Data
Where the numbers come from
Every figure here comes from the suite's JSON reports (pnpm run bench <target> --json), checked into the site repository as one typed file per daemon and system, with each scenario's load profile, sampled CPU and memory, and the suite's notes. The import script rounds to three decimals and drops per-run timings and failure strings. The reports record each daemon's self-reported version, but not the suite commit or image digests.