Game panel benchmarks,
re-run every week.
Every Monday we run FeatherPanel, Pterodactyl, Pelican and Hydrodactyl and their Wings daemons through the same open-source suite on the same machine. This page is generated from the raw results, so no figure on it is typed in by hand.
This run at a glance
23 Oct 2026, 01:10 UTC. Panels at 4 CPUs, median of 3 rounds.
How to read this
A figure like 3.0x means FeatherPanel answered three times as many requests per second as that panel, on the same machine, in the same run. It is the geometric mean over the endpoints that need a login, so one fast endpoint cannot carry the result. Only successful responses count: an error or a 429 is not a served request.
Latency is shown as percentiles. p50 is the typical request, p99 is the slowest one in a hundred, which is what a user notices when a page hangs. Lower is better for latency, memory, CPU time, error rate and startup.
Compare targets inside one run. Between weeks the runner's CPU model can change, so this week's figure and last week's are not directly comparable. The 4 CPU quota uses the whole runner, so the load generator competes with the panel for CPU there.
Panels
Panel API under load
at 1, 2, 4 CPUs.
oha keeps 32 connections busy for 10 seconds per endpoint while the panel container is capped by a CPU quota. The database and Redis run uncapped beside it. API rate limiting is switched off for every panel through its own configuration.
AMD EPYC 9V74 80-Core Processor, 4 vCPU, 16 GB RAM, median of 3 rounds
Each endpoint
Successful requests per second and latency percentiles for every endpoint. Pick a CPU quota.
settings (unauth)
- FeatherPanel913
- Pterodactyl51
- Pelican26
- Hydrodactyl44
- FeatherPanelp50 35, p90 44, p99 57
- Pterodactylp50 610, p90 702, p99 792
- Pelicanp50 1,203, p90 1,421, p99 1,692
- Hydrodactylp50 710, p90 805, p99 900
p50 (typical)p90p99 (slowest 1%)
account (auth)
- FeatherPanel876
- Pterodactyl16
- Pelican19
- Hydrodactyl51
- FeatherPanelp50 36, p90 46, p99 70
- Pterodactylp50 594, p90 684, p99 783
- Pelicanp50 1,519, p90 1,900, p99 2,095
- Hydrodactylp50 608, p90 700, p99 792
p50 (typical)p90p99 (slowest 1%)
Non-2xx responses in this test: Pterodactyl 70%, Pelican 3.9%. They are left out of req/s and latency.
list servers (auth)
- FeatherPanel778
- Pterodactylall requests failed-
- Pelicanall requests failed-
- Hydrodactyl3
- FeatherPanelp50 41, p90 53, p99 76
- Pterodactylall requests failed
- Pelicanall requests failed
- Hydrodactylp50 597, p90 680, p99 698
p50 (typical)p90p99 (slowest 1%)
Non-2xx responses in this test: Pterodactyl 100%, Pelican 100%, Hydrodactyl 95%. They are left out of req/s and latency.
settings (unauth)
- FeatherPanel1,503
- Pterodactyl104
- Pelican53
- Hydrodactyl90
- FeatherPanelp50 21, p90 29, p99 38
- Pterodactylp50 304, p90 362, p99 386
- Pelicanp50 601, p90 702, p99 778
- Hydrodactylp50 365, p90 395, p99 419
p50 (typical)p90p99 (slowest 1%)
account (auth)
- FeatherPanel1,430
- Pterodactyl11
- Pelican21
- Hydrodactyl57
- FeatherPanelp50 22, p90 31, p99 39
- Pterodactylp50 300, p90 344, p99 382
- Pelicanp50 709, p90 826, p99 969
- Hydrodactylp50 299, p90 344, p99 387
p50 (typical)p90p99 (slowest 1%)
Non-2xx responses in this test: Pterodactyl 89%, Pelican 54%, Hydrodactyl 47%. They are left out of req/s and latency.
list servers (auth)
- FeatherPanel1,346
- Pterodactylall requests failed-
- Pelicanall requests failed-
- Hydrodactylall requests failed-
- FeatherPanelp50 23, p90 34, p99 44
- Pterodactylall requests failed
- Pelicanall requests failed
- Hydrodactylall requests failed
p50 (typical)p90p99 (slowest 1%)
Non-2xx responses in this test: Pterodactyl 100%, Pelican 100%, Hydrodactyl 100%. They are left out of req/s and latency.
settings (unauth)
- FeatherPanel2,053
- Pterodactyl187
- Pelican102
- Hydrodactyl162
- FeatherPanelp50 15, p90 23, p99 30
- Pterodactylp50 169, p90 194, p99 218
- Pelicanp50 313, p90 350, p99 417
- Hydrodactylp50 196, p90 217, p99 244
p50 (typical)p90p99 (slowest 1%)
account (auth)
- FeatherPanel2,177
- Pterodactyl4
- Pelican18
- Hydrodactyl49
- FeatherPanelp50 14, p90 22, p99 30
- Pterodactylp50 168, p90 188, p99 207
- Pelicanp50 364, p90 411, p99 449
- Hydrodactylp50 167, p90 184, p99 204
p50 (typical)p90p99 (slowest 1%)
Non-2xx responses in this test: Pterodactyl 98%, Pelican 80%, Hydrodactyl 74%. They are left out of req/s and latency.
list servers (auth)
- FeatherPanel1,993
- Pterodactylall requests failed-
- Pelicanall requests failed-
- Hydrodactylall requests failed-
- FeatherPanelp50 15, p90 23, p99 32
- Pterodactylall requests failed
- Pelicanall requests failed
- Hydrodactylall requests failed
p50 (typical)p90p99 (slowest 1%)
Non-2xx responses in this test: Pterodactyl 100%, Pelican 100%, Hydrodactyl 100%. They are left out of req/s and latency.
CPU scaling
How successful req/s changes as the container gets more CPU. A line that keeps rising uses extra cores; a flat line is limited by something else, such as a single-threaded worker or the database.
- FeatherPanel
- Pterodactyl
- Pelican
- Hydrodactyl
- FeatherPanel
- Pterodactyl
- Pelican
- Hydrodactyl
- FeatherPanel
- Pterodactyl
- Pelican
- Hydrodactyl
Resources
Memory and CPU at 4 CPUs, the error rate over every load test, and what it takes to start the stack. Startup runs from docker compose up to the first healthy response, so it includes database migrations the image runs on boot.
- FeatherPanel193
- Pterodactyl118
- Pelican368
- Hydrodactyl134
- FeatherPanel127
- Pterodactyl94
- Pelican191
- Hydrodactyl107
- FeatherPanel1.14
- Pterodactyl18.12
- Pelican42.05
- Hydrodactyl19.06
- FeatherPanel0%
- Pterodactyl65%
- Pelican51%
- Hydrodactyl54%
Not recorded in this run.
Not recorded in this run.
Wings
Node daemons
file API and tasks.
Each daemon boots against a small mock of the panel API, so the numbers isolate the daemon. Load tests use oha. File tasks are timed one at a time on a generated dataset, and the first run is discarded.
AMD EPYC 7763 64-Core Processor, 4 vCPU, 16 GB RAM, one round
Each endpoint
Successful requests per second and latency percentiles for every endpoint. Pick a CPU quota.
system info
- FeatherWings464
- Pterodactyl Wings428
- Pelican Wings450
- FeatherWingsp50 71, p90 88, p99 112
- Pterodactyl Wingsp50 78, p90 95, p99 121
- Pelican Wingsp50 73, p90 92, p99 114
p50 (typical)p90p99 (slowest 1%)
list directory (50 entries)
- FeatherWings720
- Pterodactyl Wings546
- Pelican Wings625
- FeatherWingsp50 30, p90 85, p99 107
- Pterodactyl Wingsp50 56, p90 112, p99 217
- Pelican Wingsp50 32, p90 101, p99 191
p50 (typical)p90p99 (slowest 1%)
download file (4 KiB)
- FeatherWings6,874
- Pterodactyl Wings5,695
- Pelican Wings5,683
- FeatherWingsp50 2.1, p90 5.4, p99 54
- Pterodactyl Wingsp50 2.6, p90 7.0, p99 55
- Pelican Wingsp50 2.6, p90 7.1, p99 55
p50 (typical)p90p99 (slowest 1%)
download file (8 MiB)
- FeatherWings35
- Pterodactyl Wings34
- Pelican Wings35
- FeatherWingsp50 214, p90 304, p99 422
- Pterodactyl Wingsp50 219, p90 313, p99 451
- Pelican Wingsp50 212, p90 308, p99 401
p50 (typical)p90p99 (slowest 1%)
chmod file
- FeatherWings8,386
- Pterodactyl Wings7,665
- Pelican Wings7,304
- FeatherWingsp50 1.7, p90 2.9, p99 54
- Pterodactyl Wingsp50 1.6, p90 3.8, p99 55
- Pelican Wingsp50 1.6, p90 4.0, p99 59
p50 (typical)p90p99 (slowest 1%)
system info
- FeatherWings471
- Pterodactyl Wings466
- Pelican Wings473
- FeatherWingsp50 69, p90 86, p99 110
- Pterodactyl Wingsp50 70, p90 90, p99 112
- Pelican Wingsp50 69, p90 87, p99 110
p50 (typical)p90p99 (slowest 1%)
list directory (50 entries)
- FeatherWings1,486
- Pterodactyl Wings1,152
- Pelican Wings1,312
- FeatherWingsp50 21, p90 34, p99 49
- Pterodactyl Wingsp50 23, p90 55, p99 98
- Pelican Wingsp50 21, p90 47, p99 83
p50 (typical)p90p99 (slowest 1%)
download file (4 KiB)
- FeatherWings12,739
- Pterodactyl Wings10,976
- Pelican Wings11,368
- FeatherWingsp50 2.2, p90 4.9, p99 7.7
- Pterodactyl Wingsp50 2.5, p90 5.9, p99 8.8
- Pelican Wingsp50 2.4, p90 5.8, p99 8.6
p50 (typical)p90p99 (slowest 1%)
download file (8 MiB)
- FeatherWings65
- Pterodactyl Wings64
- Pelican Wings65
- FeatherWingsp50 122, p90 166, p99 214
- Pterodactyl Wingsp50 120, p90 177, p99 240
- Pelican Wingsp50 119, p90 167, p99 209
p50 (typical)p90p99 (slowest 1%)
chmod file
- FeatherWings15,952
- Pterodactyl Wings14,621
- Pelican Wings14,324
- FeatherWingsp50 1.7, p90 2.9, p99 12
- Pterodactyl Wingsp50 1.7, p90 3.4, p99 15
- Pelican Wingsp50 1.7, p90 3.6, p99 14
p50 (typical)p90p99 (slowest 1%)
system info
- FeatherWings471
- Pterodactyl Wings456
- Pelican Wings450
- FeatherWingsp50 70, p90 88, p99 112
- Pterodactyl Wingsp50 72, p90 92, p99 112
- Pelican Wingsp50 74, p90 92, p99 115
p50 (typical)p90p99 (slowest 1%)
list directory (50 entries)
- FeatherWings1,878
- Pterodactyl Wings1,510
- Pelican Wings1,649
- FeatherWingsp50 15, p90 33, p99 56
- Pterodactyl Wingsp50 16, p90 44, p99 82
- Pelican Wingsp50 15, p90 41, p99 84
p50 (typical)p90p99 (slowest 1%)
download file (4 KiB)
- FeatherWings14,408
- Pterodactyl Wings12,702
- Pelican Wings12,482
- FeatherWingsp50 1.9, p90 4.1, p99 7.6
- Pterodactyl Wingsp50 2.1, p90 4.8, p99 8.5
- Pelican Wingsp50 2.1, p90 5.0, p99 8.8
p50 (typical)p90p99 (slowest 1%)
download file (8 MiB)
- FeatherWings80
- Pterodactyl Wings82
- Pelican Wings80
- FeatherWingsp50 98, p90 133, p99 175
- Pterodactyl Wingsp50 96, p90 132, p99 159
- Pelican Wingsp50 99, p90 135, p99 171
p50 (typical)p90p99 (slowest 1%)
chmod file
- FeatherWings17,474
- Pterodactyl Wings16,384
- Pelican Wings15,515
- FeatherWingsp50 1.6, p90 3.3, p99 5.9
- Pterodactyl Wingsp50 1.7, p90 3.6, p99 6.6
- Pelican Wingsp50 1.7, p90 3.9, p99 7.2
p50 (typical)p90p99 (slowest 1%)
CPU scaling
How successful req/s changes as the container gets more CPU. A line that keeps rising uses extra cores; a flat line is limited by something else, such as a single-threaded worker or the database.
- FeatherWings
- Pterodactyl Wings
- Pelican Wings
- FeatherWings
- Pterodactyl Wings
- Pelican Wings
- FeatherWings
- Pterodactyl Wings
- Pelican Wings
- FeatherWings
- Pterodactyl Wings
- Pelican Wings
- FeatherWings
- Pterodactyl Wings
- Pelican Wings
Resources
Memory and CPU at 4 CPUs, the error rate over every load test, and what it takes to start the stack. Startup runs from docker compose up to the first healthy response, so it includes database migrations the image runs on boot.
- FeatherWings43
- Pterodactyl Wings25
- Pelican Wings21
- FeatherWings39
- Pterodactyl Wings23
- Pelican Wings23
- FeatherWings6.26
- Pterodactyl Wings6.32
- Pelican Wings6.33
Not recorded in this run.
Not recorded in this run.
Not recorded in this run.
File tasks
Median time per task, lower is better. The fastest daemon in each row is shown in white.
| Task | FeatherWings | Pterodactyl Wings | Pelican Wings |
|---|---|---|---|
| list directory (5000 entries) | 102 ms | 138 ms | 115 ms |
| list directory (50000 entries) | 1.15 s | 1.34 s | 1.19 s |
| compress 100 MiB tree (tar.gz) | 263 ms | 331 ms | 282 ms |
| compress 1 GiB tree (tar.gz) | 2.76 s | 2.11 s | 2.82 s |
| compress 50k small files tree (tar.gz) | 2.56 s | 1.14 s | 2.67 s |
| compress 100 MiB tree (zip) | 117 ms | - | - |
| decompress 100 MiB archive (tar.gz) | 375 ms | 619 ms | 414 ms |
| decompress 1 GiB archive (tar.gz) | 3.96 s | 6.84 s | 4.43 s |
| decompress 50k small files archive (tar.gz) | 6.12 s | 11.3 s | 6.46 s |
| decompress 100 MiB archive (zip) | 363 ms | 603 ms | 392 ms |
| decompress 1 GiB archive (zip) | 3.89 s | 6.90 s | 4.00 s |
| delete 100 MiB tree | 230 ms | 189 ms | 229 ms |
| delete 1 GiB tree | 2.45 s | 1.97 s | 2.44 s |
| delete 50k small files tree | 5.53 s | 4.58 s | 5.39 s |
| upload file (256 MiB) | 482 ms | 539 ms | 478 ms |
| Task | FeatherWings | Pterodactyl Wings | Pelican Wings |
|---|---|---|---|
| list directory (5000 entries) | 102 ms | 121 ms | 107 ms |
| list directory (50000 entries) | 1.04 s | 1.17 s | 1.03 s |
| compress 100 MiB tree (tar.gz) | 259 ms | 213 ms | 265 ms |
| compress 1 GiB tree (tar.gz) | 2.65 s | 1.10 s | 2.65 s |
| compress 50k small files tree (tar.gz) | 2.41 s | 967 ms | 2.40 s |
| compress 100 MiB tree (zip) | 117 ms | - | - |
| decompress 100 MiB archive (tar.gz) | 363 ms | 596 ms | 375 ms |
| decompress 1 GiB archive (tar.gz) | 3.80 s | 6.64 s | 3.91 s |
| decompress 50k small files archive (tar.gz) | 5.86 s | 10.8 s | 5.91 s |
| decompress 100 MiB archive (zip) | 354 ms | 577 ms | 358 ms |
| decompress 1 GiB archive (zip) | 3.70 s | 6.80 s | 3.70 s |
| delete 100 MiB tree | 241 ms | 218 ms | 226 ms |
| delete 1 GiB tree | 2.41 s | 2.23 s | 2.41 s |
| delete 50k small files tree | 5.56 s | 4.99 s | 5.39 s |
| upload file (256 MiB) | 442 ms | 479 ms | 450 ms |
| Task | FeatherWings | Pterodactyl Wings | Pelican Wings |
|---|---|---|---|
| list directory (5000 entries) | 102 ms | 119 ms | 109 ms |
| list directory (50000 entries) | 1.04 s | 1.15 s | 1.04 s |
| compress 100 MiB tree (tar.gz) | 262 ms | 214 ms | 267 ms |
| compress 1 GiB tree (tar.gz) | 2.65 s | 1.04 s | 2.66 s |
| compress 50k small files tree (tar.gz) | 2.39 s | 967 ms | 2.40 s |
| compress 100 MiB tree (zip) | 116 ms | - | - |
| decompress 100 MiB archive (tar.gz) | 365 ms | 582 ms | 373 ms |
| decompress 1 GiB archive (tar.gz) | 3.79 s | 6.52 s | 3.88 s |
| decompress 50k small files archive (tar.gz) | 5.84 s | 10.5 s | 5.91 s |
| decompress 100 MiB archive (zip) | 356 ms | 554 ms | 360 ms |
| decompress 1 GiB archive (zip) | 3.67 s | 6.58 s | 3.70 s |
| delete 100 MiB tree | 231 ms | 185 ms | 223 ms |
| delete 1 GiB tree | 2.47 s | 1.98 s | 2.37 s |
| delete 50k small files tree | 5.48 s | 4.46 s | 5.38 s |
| upload file (256 MiB) | 442 ms | 476 ms | 443 ms |
History
Week by week
Successful req/s on the logged-in endpoints (geometric mean), one point per published run. Runner hardware can change between weeks, so read the shape, not small steps.
Tested
Versions and images
The version each target reported while it ran, the image it came from, its size and its start time.
| Target | Version | Image | Size | Startup | Status |
|---|---|---|---|---|---|
| FeatherPanel | 1.5.2 | ghcr.io/mythicalltd/featherpanel-backend:latestsha256:9bbdfd7fac09 | - | - | 3 rounds |
| Pterodactyl | 1.15.2 | ghcr.io/pterodactyl/panel:latestsha256:cd7cda1727f1 | - | - | 3 rounds |
| Pelican | 1.0.0-rc.2 | ghcr.io/pelican/panel:latestsha256:cb717c15da9b | - | - | 3 rounds |
| Hydrodactyl | v6.4.1-hotfix | ghcr.io/blueprintframework/hydrodactyl:latestsha256:6a0f10587258 | - | - | 3 rounds |
| FeatherWings | 1.4.1 | ghcr.io/mythicalltd/featherwings:latestsha256:6f30d5c70784 | - | - | Completed |
| Pterodactyl Wings | 1.13.4 | ghcr.io/pterodactyl/wings:latestsha256:f3eb1fcca035 | - | - | Completed |
| Pelican Wings | 1.0.0-rc.1 | ghcr.io/pelican/wings:latestsha256:cf62cae99329 | - | - | Completed |
A dash means the value was not recorded in this run.
Methodology
How the numbers
are produced.
- Run
- MythicalLTD/benchmarking/actions/runs/39871697830
- Date
- 23 Oct 2026, 01:10 UTC
- Schedule
- Mondays, 03:17 UTC
- Panels
- AMD EPYC 9V74 80-Core Processor, 4 vCPU, 16 GB RAM, 3 rounds
- Wings
- AMD EPYC 7763 64-Core Processor, 4 vCPU, 16 GB RAM, 1 round
- Figures
- Median across rounds
- Targets
- 7 of 7 completed
- 01
Every target starts from its published
:latestimage in its own Docker Compose stack. The version in the table is the one the running software reported. - 02
API rate limiting is switched off for every panel through configuration only: the
APP_API_*_RATELIMITsettings for Pterodactyl, Pelican and Hydrodactyl, and FeatherPanel's rate-limit file. No panel's code is changed. - 03
Each stack runs at 1, 2 and 4 CPUs with Docker's
cpuslimit on the panel or daemon container. Startup time is measured fromdocker compose upto the first healthy response. - 04
For panels, the suite creates an admin user, logs in, and points oha at a public endpoint, the account endpoint and the server list for 10 seconds each after a 1 second warmup. The public endpoint is each panel's own cheapest route, so it is left out of the headline figures.
- 05
For daemons, Wings talks to an in-process mock of the panel API. Load tests cover system info, a 50-entry listing, file downloads and chmod. Tasks cover large listings, compress, decompress, delete and a 256 MiB upload on a generated dataset.
- 06
Container CPU and memory (anonymous plus shared memory, page cache excluded) are sampled during each test and at idle. CPU time per request subtracts the idle floor.
- 07
A GitHub Actions workflow runs Mondays, 03:17 UTC as two jobs: all panels in series on one runner and all Wings daemons in series on another. Each group runs three rounds in alternating order (forwards, backwards, forwards), and the page shows the median.
