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
26 Oct 2026, 12:23 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 9V45 96-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)
- FeatherPanel1,600
- Pterodactyl79
- Pelican19
- Hydrodactyl65
- FeatherPanelp50 20, p90 28, p99 37
- Pterodactylp50 399, p90 491, p99 508
- Pelicanp50 1,698, p90 1,932, p99 2,107
- Hydrodactylp50 496, p90 583, p99 604
p50 (typical)p90p99 (slowest 1%)
account (auth)
- FeatherPanel1,489
- Pterodactyl83
- Pelican17
- Hydrodactyl77
- FeatherPanelp50 21, p90 30, p99 39
- Pterodactylp50 395, p90 414, p99 497
- Pelicanp50 1,886, p90 2,169, p99 2,478
- Hydrodactylp50 404, p90 485, p99 498
p50 (typical)p90p99 (slowest 1%)
list servers (auth)
- FeatherPanel1,377
- Pterodactyl77
- Pelican18
- Hydrodactyl70
- FeatherPanelp50 23, p90 32, p99 60
- Pterodactylp50 404, p90 486, p99 497
- Pelicanp50 1,795, p90 2,000, p99 2,192
- Hydrodactylp50 477, p90 504, p99 584
p50 (typical)p90p99 (slowest 1%)
settings (unauth)
- FeatherPanel2,482
- Pterodactyl152
- Pelican38
- Hydrodactyl122
- FeatherPanelp50 13, p90 20, p99 25
- Pterodactylp50 204, p90 263, p99 289
- Pelicanp50 812, p90 916, p99 996
- Hydrodactylp50 272, p90 299, p99 353
p50 (typical)p90p99 (slowest 1%)
account (auth)
- FeatherPanel2,436
- Pterodactyl158
- Pelican34
- Hydrodactyl149
- FeatherPanelp50 13, p90 20, p99 27
- Pterodactylp50 200, p90 222, p99 270
- Pelicanp50 914, p90 1,011, p99 1,096
- Hydrodactylp50 206, p90 262, p99 283
p50 (typical)p90p99 (slowest 1%)
list servers (auth)
- FeatherPanel2,569
- Pterodactyl154
- Pelican35
- Hydrodactyl140
- FeatherPanelp50 12, p90 20, p99 26
- Pterodactylp50 204, p90 246, p99 268
- Pelicanp50 916, p90 1,006, p99 1,087
- Hydrodactylp50 218, p90 272, p99 289
p50 (typical)p90p99 (slowest 1%)
settings (unauth)
- FeatherPanel3,246
- Pterodactyl294
- Pelican53
- Hydrodactyl220
- FeatherPanelp50 9.4, p90 16, p99 21
- Pterodactylp50 107, p90 126, p99 147
- Pelicanp50 575, p90 700, p99 888
- Hydrodactylp50 142, p90 168, p99 193
p50 (typical)p90p99 (slowest 1%)
account (auth)
- FeatherPanel3,405
- Pterodactyl290
- Pelican53
- Hydrodactyl272
- FeatherPanelp50 8.9, p90 15, p99 21
- Pterodactylp50 110, p90 123, p99 141
- Pelicanp50 588, p90 644, p99 778
- Hydrodactylp50 116, p90 133, p99 161
p50 (typical)p90p99 (slowest 1%)
list servers (auth)
- FeatherPanel3,279
- Pterodactyl264
- Pelican55
- Hydrodactyl242
- FeatherPanelp50 9.2, p90 16, p99 22
- Pterodactylp50 120, p90 136, p99 160
- Pelicanp50 569, p90 633, p99 710
- Hydrodactylp50 130, p90 152, p99 175
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.
- 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.
- FeatherPanel196
- Pterodactyl143
- Pelican328
- Hydrodactyl134
- FeatherPanel136
- Pterodactyl94
- Pelican200
- Hydrodactyl107
- FeatherPanel0.71
- Pterodactyl12.17
- Pelican57.15
- Hydrodactyl14.18
Not recorded in this run.
- FeatherPanel15.4 s
- Pterodactyl7.63 s
- Pelican11.5 s
- Hydrodactyl8.63 s
- FeatherPanel1002 MiB
- Pterodactyl332 MiB
- Pelican510 MiB
- Hydrodactyl555 MiB
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, median of 3 rounds
Each endpoint
Successful requests per second and latency percentiles for every endpoint. Pick a CPU quota.
system info
- FeatherWings478
- Pterodactyl Wings482
- Pelican Wings476
- FeatherWingsp50 68, p90 89, p99 112
- Pterodactyl Wingsp50 68, p90 87, p99 109
- Pelican Wingsp50 69, p90 86, p99 108
p50 (typical)p90p99 (slowest 1%)
list directory (50 entries)
- FeatherWings629
- Pterodactyl Wings578
- Pelican Wings636
- FeatherWingsp50 55, p90 90, p99 125
- Pterodactyl Wingsp50 39, p90 109, p99 205
- Pelican Wingsp50 29, p90 101, p99 194
p50 (typical)p90p99 (slowest 1%)
download file (4 KiB)
- FeatherWings6,133
- Pterodactyl Wings5,909
- Pelican Wings5,880
- FeatherWingsp50 2.3, p90 6.2, p99 55
- Pterodactyl Wingsp50 2.5, p90 6.7, p99 55
- Pelican Wingsp50 2.4, p90 6.6, p99 55
p50 (typical)p90p99 (slowest 1%)
download file (8 MiB)
- FeatherWings35
- Pterodactyl Wings35
- Pelican Wings35
- FeatherWingsp50 212, p90 313, p99 401
- Pterodactyl Wingsp50 213, p90 306, p99 408
- Pelican Wingsp50 214, p90 309, p99 410
p50 (typical)p90p99 (slowest 1%)
chmod file
- FeatherWings7,628
- Pterodactyl Wings7,744
- Pelican Wings7,516
- FeatherWingsp50 1.8, p90 3.3, p99 54
- Pterodactyl Wingsp50 1.6, p90 3.5, p99 55
- Pelican Wingsp50 1.6, p90 3.7, p99 56
p50 (typical)p90p99 (slowest 1%)
system info
- FeatherWings470
- Pterodactyl Wings465
- Pelican Wings475
- FeatherWingsp50 70, p90 86, p99 110
- Pterodactyl Wingsp50 69, p90 90, p99 112
- Pelican Wingsp50 69, p90 87, p99 109
p50 (typical)p90p99 (slowest 1%)
list directory (50 entries)
- FeatherWings1,300
- Pterodactyl Wings1,167
- Pelican Wings1,302
- FeatherWingsp50 24, p90 39, p99 57
- Pterodactyl Wingsp50 23, p90 54, p99 99
- Pelican Wingsp50 21, p90 48, p99 84
p50 (typical)p90p99 (slowest 1%)
download file (4 KiB)
- FeatherWings12,115
- Pterodactyl Wings11,258
- Pelican Wings11,050
- FeatherWingsp50 2.3, p90 5.2, p99 8.1
- Pterodactyl Wingsp50 2.4, p90 5.8, p99 8.7
- Pelican Wingsp50 2.5, p90 5.9, p99 8.8
p50 (typical)p90p99 (slowest 1%)
download file (8 MiB)
- FeatherWings66
- Pterodactyl Wings67
- Pelican Wings67
- FeatherWingsp50 117, p90 165, p99 224
- Pterodactyl Wingsp50 114, p90 166, p99 216
- Pelican Wingsp50 116, p90 166, p99 227
p50 (typical)p90p99 (slowest 1%)
chmod file
- FeatherWings14,830
- Pterodactyl Wings14,901
- Pelican Wings14,106
- FeatherWingsp50 1.8, p90 3.1, p99 13
- Pterodactyl Wingsp50 1.7, p90 3.4, p99 14
- Pelican Wingsp50 1.7, p90 3.7, p99 15
p50 (typical)p90p99 (slowest 1%)
system info
- FeatherWings449
- Pterodactyl Wings470
- Pelican Wings471
- FeatherWingsp50 73, p90 94, p99 116
- Pterodactyl Wingsp50 70, p90 90, p99 111
- Pelican Wingsp50 70, p90 89, p99 112
p50 (typical)p90p99 (slowest 1%)
list directory (50 entries)
- FeatherWings1,669
- Pterodactyl Wings1,495
- Pelican Wings1,678
- FeatherWingsp50 18, p90 37, p99 62
- Pterodactyl Wingsp50 16, p90 46, p99 91
- Pelican Wingsp50 15, p90 40, p99 80
p50 (typical)p90p99 (slowest 1%)
download file (4 KiB)
- FeatherWings13,530
- Pterodactyl Wings12,722
- Pelican Wings12,700
- FeatherWingsp50 2.0, p90 4.5, p99 8.1
- Pterodactyl Wingsp50 2.1, p90 4.8, p99 8.6
- Pelican Wingsp50 2.1, p90 4.9, p99 8.7
p50 (typical)p90p99 (slowest 1%)
download file (8 MiB)
- FeatherWings84
- Pterodactyl Wings83
- Pelican Wings83
- FeatherWingsp50 94, p90 129, p99 161
- Pterodactyl Wingsp50 95, p90 131, p99 162
- Pelican Wingsp50 96, p90 128, p99 166
p50 (typical)p90p99 (slowest 1%)
chmod file
- FeatherWings16,929
- Pterodactyl Wings16,683
- Pelican Wings15,888
- FeatherWingsp50 1.6, p90 3.4, p99 6.1
- Pterodactyl Wingsp50 1.6, p90 3.5, p99 6.4
- Pelican Wingsp50 1.7, p90 3.8, p99 7.0
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.
- FeatherWings42
- Pterodactyl Wings21
- Pelican Wings21
- FeatherWings38
- Pterodactyl Wings25
- Pelican Wings25
- FeatherWings6.19
- Pterodactyl Wings6.25
- Pelican Wings6.19
Not recorded in this run.
- FeatherWings883 ms
- Pterodactyl Wings876 ms
- Pelican Wings884 ms
- FeatherWings56 MiB
- Pterodactyl Wings29 MiB
- Pelican Wings41 MiB
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) | 123 ms | 129 ms | 115 ms |
| list directory (50000 entries) | 1.36 s | 1.30 s | 1.18 s |
| compress 100 MiB tree (tar.gz) | 276 ms | 307 ms | 270 ms |
| compress 1 GiB tree (tar.gz) | 2.91 s | 2.07 s | 2.82 s |
| compress 50k small files tree (tar.gz) | 2.62 s | 1.11 s | 2.65 s |
| compress 100 MiB tree (zip) | 119 ms | - | - |
| decompress 100 MiB archive (tar.gz) | 588 ms | 623 ms | 380 ms |
| decompress 1 GiB archive (tar.gz) | 6.65 s | 6.90 s | 4.06 s |
| decompress 50k small files archive (tar.gz) | 10.9 s | 11.4 s | 6.16 s |
| decompress 100 MiB archive (zip) | 577 ms | 595 ms | 376 ms |
| decompress 1 GiB archive (zip) | 6.82 s | 6.90 s | 3.91 s |
| delete 100 MiB tree | 257 ms | 193 ms | 232 ms |
| delete 1 GiB tree | 2.70 s | 2.04 s | 2.43 s |
| delete 50k small files tree | 6.05 s | 4.55 s | 5.52 s |
| upload file (256 MiB) | 539 ms | 566 ms | 480 ms |
| Task | FeatherWings | Pterodactyl Wings | Pelican Wings |
|---|---|---|---|
| list directory (5000 entries) | 118 ms | 120 ms | 107 ms |
| list directory (50000 entries) | 1.21 s | 1.16 s | 1.02 s |
| compress 100 MiB tree (tar.gz) | 271 ms | 216 ms | 268 ms |
| compress 1 GiB tree (tar.gz) | 2.77 s | 1.09 s | 2.68 s |
| compress 50k small files tree (tar.gz) | 2.40 s | 960 ms | 2.40 s |
| compress 100 MiB tree (zip) | 119 ms | - | - |
| decompress 100 MiB archive (tar.gz) | 563 ms | 571 ms | 363 ms |
| decompress 1 GiB archive (tar.gz) | 6.39 s | 6.37 s | 3.73 s |
| decompress 50k small files archive (tar.gz) | 10.4 s | 10.5 s | 5.70 s |
| decompress 100 MiB archive (zip) | 549 ms | 556 ms | 346 ms |
| decompress 1 GiB archive (zip) | 6.60 s | 6.56 s | 3.63 s |
| delete 100 MiB tree | 263 ms | 187 ms | 231 ms |
| delete 1 GiB tree | 2.68 s | 2.08 s | 2.50 s |
| delete 50k small files tree | 5.97 s | 4.56 s | 5.64 s |
| upload file (256 MiB) | 485 ms | 488 ms | 429 ms |
| Task | FeatherWings | Pterodactyl Wings | Pelican Wings |
|---|---|---|---|
| list directory (5000 entries) | 119 ms | 120 ms | 105 ms |
| list directory (50000 entries) | 1.21 s | 1.16 s | 1.04 s |
| compress 100 MiB tree (tar.gz) | 271 ms | 214 ms | 263 ms |
| compress 1 GiB tree (tar.gz) | 2.75 s | 1.06 s | 2.66 s |
| compress 50k small files tree (tar.gz) | 2.41 s | 958 ms | 2.38 s |
| compress 100 MiB tree (zip) | 118 ms | - | - |
| decompress 100 MiB archive (tar.gz) | 563 ms | 572 ms | 364 ms |
| decompress 1 GiB archive (tar.gz) | 6.36 s | 6.50 s | 3.77 s |
| decompress 50k small files archive (tar.gz) | 10.4 s | 10.4 s | 5.75 s |
| decompress 100 MiB archive (zip) | 554 ms | 560 ms | 350 ms |
| decompress 1 GiB archive (zip) | 6.46 s | 6.53 s | 3.62 s |
| delete 100 MiB tree | 256 ms | 195 ms | 240 ms |
| delete 1 GiB tree | 2.69 s | 2.04 s | 2.45 s |
| delete 50k small files tree | 6.02 s | 4.62 s | 5.51 s |
| upload file (256 MiB) | 475 ms | 492 ms | 425 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.
- FeatherPanel
- Pterodactyl
- Pelican
- Hydrodactyl
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 | 1002 MiB | 15.4 s | 3 rounds |
| Pterodactyl | 1.15.2 | ghcr.io/pterodactyl/panel:latestsha256:cd7cda1727f1 | 332 MiB | 7.63 s | 3 rounds |
| Pelican | 1.0.0-rc.2 | ghcr.io/pelican/panel:latestsha256:9a4364ce709c | 510 MiB | 11.5 s | 3 rounds |
| Hydrodactyl | v6.4.1-hotfix | ghcr.io/blueprintframework/hydrodactyl:latestsha256:6a0f10587258 | 555 MiB | 8.63 s | 3 rounds |
| FeatherWings | 1.4.3 | ghcr.io/mythicalltd/featherwings:latestsha256:6173d2cf96e4 | 56 MiB | 883 ms | 3 rounds |
| Pterodactyl Wings | 1.13.4 | ghcr.io/pterodactyl/wings:latestsha256:f3eb1fcca035 | 29 MiB | 876 ms | 3 rounds |
| Pelican Wings | 1.0.0-rc.1 | ghcr.io/pelican/wings:latestsha256:cf62cae99329 | 41 MiB | 884 ms | 3 rounds |
A dash means the value was not recorded in this run.
Methodology
How the numbers
are produced.
- Run
- MythicalLTD/benchmarking/actions/runs/40296650963
- Date
- 26 Oct 2026, 12:23 UTC
- Schedule
- Mondays, 03:17 UTC
- Panels
- AMD EPYC 9V45 96-Core Processor, 4 vCPU, 16 GB RAM, 3 rounds
- Wings
- AMD EPYC 7763 64-Core Processor, 4 vCPU, 16 GB RAM, 3 rounds
- 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.