use python asyncio
All checks were successful
/ build (push) Successful in 43s

This commit is contained in:
2025-03-02 22:19:41 +01:00
parent ea7529c443
commit 8e82c90734

View File

@ -14,7 +14,7 @@ This is a 2025 update from previous [2024 benchmark]({{< ref "/posts/22-web-api-
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------- | -------------- |
| [Laravel 11](https://github.com/adr1enbe4udou1n/laravel-realworld-example-app) ([api](https://laravelrealworld.okami101.io/api/) / [image](https://gitea.okami101.io/conduit/-/packages/container/laravel/latest)) | FrankenPHP 8.4 | Eloquent |
| [Symfony 7.2](https://github.com/adr1enbe4udou1n/symfony-realworld-example-app) ([api](https://symfonyrealworld.okami101.io/api/) / [image](https://gitea.okami101.io/conduit/-/packages/container/symfony/latest)) | FrankenPHP 8.4 | Doctrine |
| [FastAPI](https://github.com/adr1enbe4udou1n/fastapi-realworld-example-app) ([api](https://fastapirealworld.okami101.io/api/) / [image](https://gitea.okami101.io/conduit/-/packages/container/fastapi/latest)) | Python 3.13 | SQLAlchemy 2.0 |
| [FastAPI](https://github.com/adr1enbe4udou1n/fastapi-realworld-example-app) ([api](https://fastapirealworld.okami101.io/api/) / [image](https://gitea.okami101.io/conduit/-/packages/container/fastapi/latest)) | Python 3.13 (asyncio) | SQLAlchemy 2.0 (asyncio) |
| [NestJS 10](https://github.com/adr1enbe4udou1n/nestjs-realworld-example-app) ([api](https://nestjsrealworld.okami101.io/api/) / [image](https://gitea.okami101.io/conduit/-/packages/container/nestjs/latest)) | Node 22 | Prisma 6 |
| [Spring Boot 3.4](https://github.com/adr1enbe4udou1n/spring-boot-realworld-example-app) ([api](https://springbootrealworld.okami101.io/api/) / [image](https://gitea.okami101.io/conduit/-/packages/container/spring-boot/latest)) | Java 21 | Hibernate 6 |
| [ASP.NET Core 9](https://github.com/adr1enbe4udou1n/aspnetcore-realworld-example-app) ([api](https://aspnetcorerealworld.okami101.io/api/) / [image](https://gitea.okami101.io/conduit/-/packages/container/aspnet-core/latest)) | .NET 9.0 | EF Core 9 |
@ -147,6 +147,7 @@ services:
- DB_PASSWORD=okami
- DB_DATABASE=conduit_fastapi
- JWT_PASSPHRASE=c2b344e1-1a20-47fc-9aef-55b0c0d568a7
- UVICORN_WORKERS=2
networks:
- postgres_db
- traefik_public
@ -155,7 +156,7 @@ services:
- traefik.enable=true
- traefik.http.routers.fastapi.entrypoints=websecure
- traefik.http.services.fastapi.loadbalancer.server.port=8000
replicas: 4
replicas: 2
placement:
max_replicas_per_node: 2
constraints:
@ -1036,23 +1037,23 @@ As a side note here, uvicorn is limited to 1 CPU core, so I use 2 replicas on ea
Iteration creation rate = **15/s**
```txt
checks.........................: 100.00% 39678 out of 39678
data_received..................: 321 MB 5.2 MB/s
data_sent......................: 3.4 MB 55 kB/s
dropped_iterations.............: 123 1.983368/s
http_req_blocked...............: avg=23.83µs min=213ns med=799ns max=113.17ms p(90)=1.41µs p(95)=1.59µs
http_req_connecting............: avg=1.42µs min=0s med=0s max=6.53ms p(90)=0s p(95)=0s
http_req_duration..............: avg=69.21ms min=6.41ms med=54.17ms max=382.34ms p(90)=142.86ms p(95)=166.33ms
{ expected_response:true }...: avg=69.21ms min=6.41ms med=54.17ms max=382.34ms p(90)=142.86ms p(95)=166.33ms
http_req_failed................: 0.00% 0 out of 39678
http_req_receiving.............: avg=491.01µs min=23.44µs med=282.51µs max=20.46ms p(90)=1.01ms p(95)=1.6ms
http_req_sending...............: avg=106.95µs min=17.61µs med=85.46µs max=20.9ms p(90)=155.94µs p(95)=189.16µs
http_req_tls_handshaking.......: avg=18.91µs min=0s med=0s max=34.33ms p(90)=0s p(95)=0s
http_req_waiting...............: avg=68.62ms min=6.23ms med=53.56ms max=381.34ms p(90)=142.08ms p(95)=165.56ms
http_reqs......................: 39678 639.805458/s
iteration_duration.............: avg=3.56s min=1s med=3.68s max=5.11s p(90)=4.22s p(95)=4.38s
iterations.....................: 778 12.545205/s
vus............................: 3 min=3 max=50
checks.........................: 100.00% 39525 out of 39525
data_received..................: 324 MB 5.2 MB/s
data_sent......................: 3.5 MB 56 kB/s
dropped_iterations.............: 126 2.032659/s
http_req_blocked...............: avg=22.84µs min=258ns med=1.01µs max=41.9ms p(90)=1.45µs p(95)=1.6µs
http_req_connecting............: avg=1.32µs min=0s med=0s max=3.49ms p(90)=0s p(95)=0s
http_req_duration..............: avg=69.4ms min=6.28ms med=62.49ms max=323.87ms p(90)=131.32ms p(95)=147.63ms
{ expected_response:true }...: avg=69.4ms min=6.28ms med=62.49ms max=323.87ms p(90)=131.32ms p(95)=147.63ms
http_req_failed................: 0.00% 0 out of 39525
http_req_receiving.............: avg=410.93µs min=24.46µs med=281.1µs max=17.76ms p(90)=784.35µs p(95)=1.12ms
http_req_sending...............: avg=121.75µs min=14.48µs med=105.29µs max=11.05ms p(90)=179.47µs p(95)=221.68µs
http_req_tls_handshaking.......: avg=19.44µs min=0s med=0s max=28.07ms p(90)=0s p(95)=0s
http_req_waiting...............: avg=68.87ms min=5.63ms med=61.98ms max=323.69ms p(90)=130.68ms p(95)=147ms
http_reqs......................: 39525 637.625912/s
iteration_duration.............: avg=3.57s min=822.25ms med=3.74s max=5.09s p(90)=4.25s p(95)=4.37s
iterations.....................: 775 12.502469/s
vus............................: 1 min=1 max=50
vus_max........................: 50 min=50 max=50
```
@ -1064,13 +1065,13 @@ vus_max........................: 50 min=50 max=50
{
label: 'Req/s',
data: [
205, 686, 625, 657, 643, 684, 625, 652, 606,
656, 610, 662, 672, 687, 647, 650, 636, 663,
665, 617, 600, 621, 637, 655, 628, 681, 649,
637, 662, 568, 669, 667, 630, 625, 630, 685,
654, 647, 667, 631, 618, 656, 614, 695, 650,
659, 629, 638, 646, 609, 642, 661, 647, 677,
601, 662, 665, 608, 671, 628, 632, 629, 150
30, 575, 674, 684, 617, 668, 634, 638, 647,
621, 662, 661, 670, 659, 617, 672, 644, 653,
623, 606, 663, 650, 634, 666, 625, 652, 650,
671, 651, 617, 598, 620, 624, 626, 602, 657,
646, 649, 650, 638, 669, 640, 639, 636, 628,
636, 654, 651, 668, 643, 663, 645, 644, 618,
575, 627, 622, 660, 643, 644, 637, 626, 413
]
}
]
@ -1085,12 +1086,12 @@ vus_max........................: 50 min=50 max=50
{
label: 'VUs',
data: [
15, 18, 22, 30, 31, 36, 37, 41, 49, 50, 49, 50,
47, 48, 47, 48, 49, 47, 49, 44, 47, 48, 48, 50,
46, 46, 45, 50, 48, 47, 45, 50, 45, 49, 45, 45,
50, 47, 48, 50, 47, 50, 46, 47, 49, 47, 50, 47,
50, 46, 49, 46, 47, 49, 48, 49, 47, 47, 48, 49,
38, 3
13, 18, 20, 24, 29, 33, 38, 41, 49, 47, 49, 49,
46, 49, 49, 50, 42, 47, 49, 50, 50, 48, 50, 49,
48, 46, 45, 50, 50, 49, 49, 50, 50, 47, 47, 48,
50, 48, 50, 46, 49, 50, 50, 49, 50, 48, 47, 49,
49, 48, 50, 49, 50, 49, 49, 48, 46, 48, 49, 49,
34, 1
]
}
]
@ -1101,12 +1102,12 @@ vus_max........................: 50 min=50 max=50
{
label: 'Duration (ms)',
data: [
19, 22, 29, 35, 44, 46, 57, 60, 71, 73, 80, 73,
73, 67, 76, 74, 73, 73, 70, 80, 76, 77, 76, 74,
77, 65, 70, 75, 73, 84, 68, 71, 80, 74, 79, 64,
74, 77, 69, 77, 79, 71, 78, 67, 75, 72, 77, 76,
74, 78, 71, 73, 74, 70, 78, 76, 71, 75, 71, 79,
71, 49, 17
19, 17, 24, 27, 36, 41, 48, 57, 64, 73, 71, 75,
73, 71, 76, 72, 77, 67, 70, 80, 73, 75, 74, 75,
78, 76, 73, 69, 74, 80, 79, 78, 78, 77, 81, 71,
74, 74, 75, 75, 71, 72, 76, 76, 78, 74, 72, 76,
71, 75, 70, 75, 75, 79, 84, 78, 77, 72, 74, 76,
74, 64, 27
]
}
]
@ -1120,11 +1121,11 @@ vus_max........................: 50 min=50 max=50
{
label: 'User',
data: [
0.01, 0.48, 0.69, 0.7,
0.69, 0.7, 0.7, 0.69,
0.71, 0.69, 0.68, 0.69,
0.69, 0.41, 0.01, 0.02,
0.01, 0.01
0.02, 0.09, 0.72, 0.72,
0.76, 0.76, 0.75, 0.75,
0.75, 0.75, 0.76, 0.77,
0.78, 0.78, 0.17, 0.02,
0.02, 0.02, 0.02
],
borderColor: '#4bc0c0',
backgroundColor: '#4bc0c0',
@ -1133,11 +1134,11 @@ vus_max........................: 50 min=50 max=50
{
label: 'System',
data: [
0.01, 0.16, 0.26, 0.26,
0.24, 0.24, 0.25, 0.25,
0.26, 0.25, 0.24, 0.24,
0.24, 0.16, 0.01, 0.02,
0.01, 0.01
0.01, 0.04, 0.22, 0.21,
0.22, 0.23, 0.22, 0.22,
0.22, 0.22, 0.21, 0.23,
0.22, 0.22, 0.06, 0.01,
0.02, 0.01, 0.01
],
borderColor: '#ff6384',
backgroundColor: '#ff6384',
@ -1151,11 +1152,11 @@ vus_max........................: 50 min=50 max=50
{
label: 'User',
data: [
0.02, 0.11, 0.46, 0.49,
0.48, 0.5, 0.5, 0.49,
0.48, 0.48, 0.47, 0.49,
0.48, 0.49, 0.05, 0.02,
0.02, 0.02
0.02, 0.04, 0.32, 0.33,
0.34, 0.34, 0.34, 0.35,
0.34, 0.33, 0.34, 0.33,
0.34, 0.35, 0.11, 0.02,
0.02, 0.02, 0.02
],
borderColor: '#4bc0c0',
backgroundColor: '#4bc0c0',
@ -1164,11 +1165,11 @@ vus_max........................: 50 min=50 max=50
{
label: 'System',
data: [
0.02, 0.06, 0.24, 0.35,
0.28, 0.35, 0.33, 0.3,
0.28, 0.32, 0.27, 0.34,
0.29, 0.3, 0.04, 0.02,
0.02, 0.02
0.03, 0.03, 0.16, 0.2,
0.19, 0.2, 0.21, 0.23,
0.23, 0.19, 0.22, 0.18,
0.23, 0.2, 0.07, 0.02,
0.02, 0.03, 0.03
],
borderColor: '#ff6384',
backgroundColor: '#ff6384',
@ -1185,24 +1186,24 @@ vus_max........................: 50 min=50 max=50
Iteration creation rate = **2/s**
```txt
checks.........................: 100.00% 82414 out of 82414
data_received..................: 164 MB 1.8 MB/s
data_sent......................: 6.1 MB 68 kB/s
dropped_iterations.............: 64 0.711058/s
http_req_blocked...............: avg=13.71µs min=208ns med=783ns max=143.23ms p(90)=1.39µs p(95)=1.56µs
http_req_connecting............: avg=1.28µs min=0s med=0s max=25.89ms p(90)=0s p(95)=0s
http_req_duration..............: avg=43.46ms min=3.99ms med=24.29ms max=315.4ms p(90)=108.49ms p(95)=129.33ms
{ expected_response:true }...: avg=43.46ms min=3.99ms med=24.29ms max=315.4ms p(90)=108.49ms p(95)=129.33ms
http_req_failed................: 0.00% 0 out of 82414
http_req_receiving.............: avg=205.46µs min=16.8µs med=103.34µs max=23.42ms p(90)=394.08µs p(95)=591.95µs
http_req_sending...............: avg=94.88µs min=17.56µs med=78.81µs max=14.63ms p(90)=143.76µs p(95)=171.26µs
http_req_tls_handshaking.......: avg=9.75µs min=0s med=0s max=29.89ms p(90)=0s p(95)=0s
http_req_waiting...............: avg=43.16ms min=23.62µs med=23.97ms max=315.14ms p(90)=108.17ms p(95)=129.04ms
http_reqs......................: 82414 915.642582/s
iteration_duration.............: avg=1m5s min=44.88s med=1m10s max=1m14s p(90)=1m13s p(95)=1m13s
iterations.....................: 36 0.39997/s
vus............................: 21 min=2 max=50
vus_max........................: 50 min=50 max=50
checks.........................: 67.75% 35254 out of 52029
data_received..................: 92 MB 1.0 MB/s
data_sent......................: 3.8 MB 42 kB/s
dropped_iterations.............: 70 0.777606/s
http_req_blocked...............: avg=23.08µs min=232ns med=1µs max=103.63ms p(90)=1.42µs p(95)=1.56µs
http_req_connecting............: avg=977ns min=0s med=0s max=5.29ms p(90)=0s p(95)=0s
http_req_duration..............: avg=74.22ms min=3.71ms med=57.69ms max=366.12ms p(90)=157.54ms p(95)=180.86ms
{ expected_response:true }...: avg=68.87ms min=3.71ms med=52.82ms max=366.12ms p(90)=147.21ms p(95)=170.41ms
http_req_failed................: 32.24% 16775 out of 52029
http_req_receiving.............: avg=237.94µs min=18.29µs med=130.97µs max=11.5ms p(90)=498.83µs p(95)=758.8µs
http_req_sending...............: avg=116.57µs min=16.04µs med=104.78µs max=5.81ms p(90)=174.59µs p(95)=212.82µs
http_req_tls_handshaking.......: avg=19.29µs min=0s med=0s max=27.95ms p(90)=0s p(95)=0s
http_req_waiting...............: avg=73.86ms min=3.02ms med=57.38ms max=365.81ms p(90)=157.13ms p(95)=180.31ms
http_reqs......................: 52029 577.972273/s
iteration_duration.............: avg=1m26s min=1m26s med=1m26s max=1m26s p(90)=1m26s p(95)=1m26s
iterations.....................: 3 0.033326/s
vus............................: 47 min=2 max=50
vus_max........................: 50 min=50 max=50
```
{{< tabs >}}
@ -1213,15 +1214,15 @@ vus_max........................: 50 min=50 max=50
{
label: 'Req/s',
data: [
12, 155, 362, 681, 799, 914, 973, 975, 984, 928, 959,
964, 934, 975, 874, 924, 883, 908, 931, 888, 983, 935,
967, 959, 898, 942, 939, 935, 933, 904, 926, 909, 911,
904, 945, 929, 990, 962, 973, 896, 998, 962, 930, 983,
891, 1007, 944, 925, 983, 952, 938, 984, 939, 936, 872,
959, 996, 983, 968, 945, 909, 964, 973, 897, 921, 996,
953, 986, 941, 929, 942, 966, 880, 943, 901, 956, 925,
944, 967, 899, 935, 937, 924, 960, 899, 999, 917, 891,
880, 884, 538
34, 277, 442, 502, 566, 530, 612, 611, 593, 630, 577,
606, 619, 529, 568, 567, 599, 606, 559, 567, 557, 613,
604, 558, 617, 580, 607, 586, 581, 615, 564, 610, 612,
576, 596, 561, 610, 602, 561, 616, 571, 612, 604, 577,
586, 593, 595, 598, 566, 599, 592, 589, 585, 590, 603,
596, 608, 580, 571, 580, 583, 598, 606, 541, 581, 575,
595, 580, 591, 625, 577, 584, 601, 591, 585, 592, 620,
598, 574, 598, 571, 599, 596, 592, 603, 590, 593, 578,
599, 585, 113
]
}
]
@ -1240,10 +1241,10 @@ vus_max........................: 50 min=50 max=50
26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48,
50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
50, 50, 50, 50, 49, 49, 50, 50, 50, 50, 50, 50,
49, 49, 49, 49, 48, 47, 46, 46, 46, 45, 45, 44,
43, 43, 43, 42, 41, 40, 40, 40, 38, 36, 35, 34,
32, 30, 29, 26, 25, 21
50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
50, 50, 48, 47, 47, 47
]
}
]
@ -1254,14 +1255,14 @@ vus_max........................: 50 min=50 max=50
{
label: 'Duration (ms)',
data: [
20, 14, 12, 9, 10, 11, 12, 14, 16, 19, 21, 23,
26, 27, 32, 32, 36, 38, 38, 44, 41, 45, 46, 47,
54, 52, 51, 55, 54, 55, 54, 55, 54, 55, 53, 54,
49, 53, 51, 56, 50, 52, 53, 51, 55, 50, 53, 53,
49, 53, 53, 50, 53, 53, 57, 50, 52, 49, 52, 54,
54, 52, 50, 53, 54, 49, 49, 47, 49, 49, 47, 45,
50, 47, 47, 45, 44, 44, 41, 45, 42, 41, 39, 36,
38, 31, 33, 32, 31, 28, 24
28, 11, 11, 14, 16, 21, 21, 25, 28, 30, 36, 37,
40, 50, 50, 56, 55, 58, 64, 67, 73, 71, 75, 83,
79, 84, 83, 83, 88, 81, 89, 82, 81, 86, 83, 89,
81, 85, 87, 80, 88, 82, 81, 88, 84, 83, 84, 86,
86, 84, 83, 85, 86, 84, 81, 85, 81, 86, 88, 83,
86, 85, 83, 91, 86, 87, 86, 85, 85, 80, 84, 85,
83, 84, 85, 85, 82, 83, 85, 84, 84, 86, 84, 84,
84, 82, 86, 81, 81, 79, 80
]
}
]
@ -1275,11 +1276,11 @@ vus_max........................: 50 min=50 max=50
{
label: 'User',
data: [
0.01, 0.24, 0.65, 0.68,
0.66, 0.69, 0.68, 0.68,
0.68, 0.69, 0.69, 0.71,
0.69, 0.68, 0.7, 0.7,
0.69, 0.68, 0.65
0.02, 0.03, 0.53, 0.76,
0.8, 0.81, 0.83, 0.83,
0.83, 0.83, 0.83, 0.83,
0.8, 0.75, 0.83, 0.8,
0.83, 0.8, 0.75
],
borderColor: '#4bc0c0',
backgroundColor: '#4bc0c0',
@ -1288,11 +1289,11 @@ vus_max........................: 50 min=50 max=50
{
label: 'System',
data: [
0.01, 0.08, 0.23, 0.26,
0.25, 0.28, 0.27, 0.25,
0.25, 0.25, 0.25, 0.27,
0.28, 0.26, 0.27, 0.28,
0.27, 0.24, 0.24
0.02, 0.02, 0.12, 0.17,
0.17, 0.17, 0.17, 0.17,
0.17, 0.17, 0.17, 0.17,
0.17, 0.16, 0.17, 0.17,
0.17, 0.17, 0.16
],
borderColor: '#ff6384',
backgroundColor: '#ff6384',
@ -1306,11 +1307,11 @@ vus_max........................: 50 min=50 max=50
{
label: 'User',
data: [
0.02, 0.03, 0.24, 0.24,
0.25, 0.26, 0.28, 0.28,
0.29, 0.28, 0.29, 0.28,
0.27, 0.28, 0.29, 0.28,
0.28, 0.27, 0.28
0.02, 0.02, 0.17, 0.26,
0.24, 0.21, 0.22, 0.21,
0.22, 0.23, 0.22, 0.22,
0.22, 0.23, 0.22, 0.22,
0.23, 0.22, 0.22
],
borderColor: '#4bc0c0',
backgroundColor: '#4bc0c0',
@ -1319,11 +1320,11 @@ vus_max........................: 50 min=50 max=50
{
label: 'System',
data: [
0.02, 0.02, 0.13, 0.16,
0.2, 0.23, 0.23, 0.24,
0.26, 0.26, 0.26, 0.23,
0.23, 0.25, 0.24, 0.25,
0.25, 0.23, 0.23
0.02, 0.02, 0.13, 0.21,
0.24, 0.26, 0.26, 0.22,
0.23, 0.26, 0.24, 0.26,
0.26, 0.25, 0.26, 0.26,
0.26, 0.26, 0.26
],
borderColor: '#ff6384',
backgroundColor: '#ff6384',
@ -2291,13 +2292,13 @@ Here are the final req/s results for each framework against PgSQL database.
borderColor: "#0f766e",
backgroundColor: "#0f766e",
data: [
205, 686, 625, 657, 643, 684, 625, 652, 606,
656, 610, 662, 672, 687, 647, 650, 636, 663,
665, 617, 600, 621, 637, 655, 628, 681, 649,
637, 662, 568, 669, 667, 630, 625, 630, 685,
654, 647, 667, 631, 618, 656, 614, 695, 650,
659, 629, 638, 646, 609, 642, 661, 647, 677,
601, 662, 665, 608, 671, 628, 632, 629, 150
30, 575, 674, 684, 617, 668, 634, 638, 647,
621, 662, 661, 670, 659, 617, 672, 644, 653,
623, 606, 663, 650, 634, 666, 625, 652, 650,
671, 651, 617, 598, 620, 624, 626, 602, 657,
646, 649, 650, 638, 669, 640, 639, 636, 628,
636, 654, 651, 668, 643, 663, 645, 644, 618,
575, 627, 622, 660, 643, 644, 637, 626, 413
],
},
{
@ -2388,15 +2389,15 @@ Here are the final req/s results for each framework against PgSQL database.
borderColor: "#0f766e",
backgroundColor: "#0f766e",
data: [
12, 155, 362, 681, 799, 914, 973, 975, 984, 928, 959,
964, 934, 975, 874, 924, 883, 908, 931, 888, 983, 935,
967, 959, 898, 942, 939, 935, 933, 904, 926, 909, 911,
904, 945, 929, 990, 962, 973, 896, 998, 962, 930, 983,
891, 1007, 944, 925, 983, 952, 938, 984, 939, 936, 872,
959, 996, 983, 968, 945, 909, 964, 973, 897, 921, 996,
953, 986, 941, 929, 942, 966, 880, 943, 901, 956, 925,
944, 967, 899, 935, 937, 924, 960, 899, 999, 917, 891,
880, 884, 538
34, 277, 442, 502, 566, 530, 612, 611, 593, 630, 577,
606, 619, 529, 568, 567, 599, 606, 559, 567, 557, 613,
604, 558, 617, 580, 607, 586, 581, 615, 564, 610, 612,
576, 596, 561, 610, 602, 561, 616, 571, 612, 604, 577,
586, 593, 595, 598, 566, 599, 592, 589, 585, 590, 603,
596, 608, 580, 571, 580, 583, 598, 606, 541, 581, 575,
595, 580, 591, 625, 577, 584, 601, 591, 585, 592, 620,
598, 574, 598, 571, 599, 596, 592, 603, 590, 593, 578,
599, 585, 113
],
},
{