From 21ff0825ccb78746e385d9e03bf3056669a3083b Mon Sep 17 00:00:00 2001 From: Adrien Beaudouin Date: Tue, 4 Mar 2025 20:07:53 +0100 Subject: [PATCH] up python --- .../posts/23-web-api-benchmarks-2025/index.md | 261 +++++++++--------- 1 file changed, 128 insertions(+), 133 deletions(-) diff --git a/content/posts/23-web-api-benchmarks-2025/index.md b/content/posts/23-web-api-benchmarks-2025/index.md index a4a8222..5ebde2d 100644 --- a/content/posts/23-web-api-benchmarks-2025/index.md +++ b/content/posts/23-web-api-benchmarks-2025/index.md @@ -158,7 +158,7 @@ services: - traefik.http.services.fastapi.loadbalancer.server.port=8000 replicas: 2 placement: - max_replicas_per_node: 2 + max_replicas_per_node: 1 constraints: - node.labels.run == true @@ -1030,30 +1030,28 @@ Huge gap in performance against Laravel Octane here, about twice better ! Withou ### FastAPI -As a side note here, uvicorn is limited to 1 CPU core, so I use 2 replicas on each worker to use all CPU cores. - #### FastAPI scenario 1 Iteration creation rate = **15/s** ```txt -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 +checks.........................: 100.00% 28764 out of 28764 +data_received..................: 234 MB 3.7 MB/s +data_sent......................: 2.6 MB 41 kB/s +dropped_iterations.............: 336 5.300365/s +http_req_blocked...............: avg=39.99µs min=242ns med=669ns max=68.16ms p(90)=1.14µs p(95)=1.32µs +http_req_connecting............: avg=1.66µs min=0s med=0s max=3.75ms p(90)=0s p(95)=0s +http_req_duration..............: avg=103.18ms min=6.22ms med=101.32ms max=452.09ms p(90)=139.92ms p(95)=157.15ms + { expected_response:true }...: avg=103.18ms min=6.22ms med=101.32ms max=452.09ms p(90)=139.92ms p(95)=157.15ms +http_req_failed................: 0.00% 0 out of 28764 +http_req_receiving.............: avg=460.02µs min=28.21µs med=334.44µs max=18.75ms p(90)=862.97µs p(95)=1.19ms +http_req_sending...............: avg=93.58µs min=21.19µs med=79.76µs max=3.26ms p(90)=141.54µs p(95)=167.69µs +http_req_tls_handshaking.......: avg=35.6µs min=0s med=0s max=28.74ms p(90)=0s p(95)=0s +http_req_waiting...............: avg=102.63ms min=5.98ms med=100.76ms max=451.57ms p(90)=139.32ms p(95)=156.56ms +http_reqs......................: 28764 453.749133/s +iteration_duration.............: avg=5.28s min=1.61s med=5.38s max=6.19s p(90)=5.71s p(95)=5.79s +iterations.....................: 564 8.897042/s +vus............................: 17 min=15 max=50 vus_max........................: 50 min=50 max=50 ``` @@ -1065,13 +1063,13 @@ vus_max........................: 50 min=50 max=50 { label: 'Req/s', data: [ - 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 + 50, 371, 331, 391, 475, 450, 464, 464, 467, 450, + 447, 467, 467, 455, 451, 458, 463, 485, 470, 476, + 449, 481, 485, 461, 476, 442, 455, 474, 454, 456, + 439, 478, 472, 436, 473, 453, 463, 471, 456, 455, + 439, 470, 456, 473, 465, 459, 468, 471, 475, 474, + 444, 484, 469, 466, 468, 448, 477, 449, 443, 482, + 444, 452, 432, 374, 1 ] } ] @@ -1086,12 +1084,12 @@ vus_max........................: 50 min=50 max=50 { label: 'VUs', data: [ - 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 + 15, 27, 39, 50, 50, 50, 49, 48, 48, 50, 50, 50, + 48, 46, 49, 50, 48, 49, 49, 50, 50, 50, 49, 48, + 47, 48, 50, 47, 48, 50, 47, 50, 50, 48, 46, 49, + 50, 50, 50, 49, 48, 50, 48, 49, 50, 50, 49, 44, + 49, 49, 49, 48, 50, 48, 50, 50, 47, 50, 49, 50, + 45, 37, 17 ] } ] @@ -1102,12 +1100,13 @@ vus_max........................: 50 min=50 max=50 { label: 'Duration (ms)', data: [ - 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 + 21, 34, 77, 93, 102, 110, 107, 104, 105, 109, + 112, 106, 105, 103, 106, 107, 106, 103, 103, 102, + 108, 103, 102, 107, 103, 109, 106, 106, 107, 108, + 112, 103, 103, 111, 105, 107, 105, 104, 107, 107, + 115, 103, 108, 103, 107, 108, 105, 102, 101, 104, + 112, 102, 105, 104, 105, 110, 104, 106, 108, 105, + 111, 102, 85, 47, 8 ] } ] @@ -1121,10 +1120,10 @@ vus_max........................: 50 min=50 max=50 { label: 'User', data: [ - 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.1, 0.74, + 0.78, 0.77, 0.79, 0.79, + 0.78, 0.78, 0.78, 0.78, + 0.78, 0.77, 0.78, 0.36, 0.02, 0.02, 0.02 ], borderColor: '#4bc0c0', @@ -1134,10 +1133,10 @@ vus_max........................: 50 min=50 max=50 { label: 'System', data: [ - 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.01, 0.01, 0.04, 0.2, + 0.21, 0.21, 0.21, 0.2, + 0.21, 0.21, 0.21, 0.21, + 0.21, 0.22, 0.21, 0.1, 0.02, 0.01, 0.01 ], borderColor: '#ff6384', @@ -1152,11 +1151,11 @@ vus_max........................: 50 min=50 max=50 { label: 'User', data: [ - 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 + 0.02, 0.02, 0.37, 0.5, + 0.5, 0.49, 0.48, 0.5, + 0.49, 0.5, 0.49, 0.5, + 0.49, 0.5, 0.41, 0.02, + 0.03, 0.02, 0.02 ], borderColor: '#4bc0c0', backgroundColor: '#4bc0c0', @@ -1165,11 +1164,11 @@ vus_max........................: 50 min=50 max=50 { label: 'System', data: [ - 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 + 0.02, 0.02, 0.33, 0.34, + 0.34, 0.33, 0.32, 0.35, + 0.34, 0.35, 0.36, 0.33, + 0.32, 0.36, 0.33, 0.02, + 0.02, 0.02, 0.02 ], borderColor: '#ff6384', backgroundColor: '#ff6384', @@ -1186,24 +1185,24 @@ vus_max........................: 50 min=50 max=50 Iteration creation rate = **2/s** ```txt -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 +checks.........................: 100.00% 72770 out of 72770 +data_received..................: 145 MB 1.6 MB/s +data_sent......................: 5.5 MB 61 kB/s +dropped_iterations.............: 66 0.733176/s +http_req_blocked...............: avg=14.03µs min=198ns med=645ns max=144.52ms p(90)=1.11µs p(95)=1.27µs +http_req_connecting............: avg=629ns min=0s med=0s max=5.17ms p(90)=0s p(95)=0s +http_req_duration..............: avg=50.94ms min=3.78ms med=38.97ms max=384.02ms p(90)=107.46ms p(95)=136.98ms + { expected_response:true }...: avg=50.94ms min=3.78ms med=38.97ms max=384.02ms p(90)=107.46ms p(95)=136.98ms +http_req_failed................: 0.00% 0 out of 72770 +http_req_receiving.............: avg=200.09µs min=18.28µs med=107.44µs max=18.54ms p(90)=399.04µs p(95)=632µs +http_req_sending...............: avg=86.57µs min=16.71µs med=73.65µs max=13.95ms p(90)=132.89µs p(95)=158.51µs +http_req_tls_handshaking.......: avg=10.86µs min=0s med=0s max=28.74ms p(90)=0s p(95)=0s +http_req_waiting...............: avg=50.66ms min=3.64ms med=38.7ms max=383.81ms p(90)=107.11ms p(95)=136.61ms +http_reqs......................: 72770 808.381614/s +iteration_duration.............: avg=1m6s min=49.42s med=1m8s max=1m19s p(90)=1m18s p(95)=1m18s +iterations.....................: 18 0.199957/s +vus............................: 37 min=2 max=50 +vus_max........................: 50 min=50 max=50 ``` {{< tabs >}} @@ -1214,15 +1213,14 @@ vus_max........................: 50 min=50 max=50 { label: 'Req/s', data: [ - 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 + 734, 921, 803, 822, 870, 809, 859, 751, 834, 825, + 786, 779, 811, 928, 869, 802, 802, 802, 832, 802, + 798, 824, 768, 845, 825, 762, 860, 758, 812, 813, + 808, 783, 772, 797, 831, 835, 799, 781, 844, 824, + 787, 801, 769, 819, 799, 774, 837, 776, 837, 826, + 821, 776, 791, 816, 838, 792, 900, 795, 815, 807, + 781, 819, 729, 848, 861, 839, 872, 762, 796, 902, + 790, 791, 791, 830, 815, 835, 832, 583 ] } ] @@ -1237,14 +1235,13 @@ vus_max........................: 50 min=50 max=50 { label: 'VUs', data: [ - 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 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, 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 + 50, 49, 50, 50, 50, 50, 50, 50, 50, 50, 50, 49, + 50, 50, 50, 49, 49, 48, 48, 48, 48, 47, 47, 46, + 46, 46, 45, 44, 44, 44, 44, 43, 43, 42, 42, 40, + 40, 39, 38, 37, 37, 37 ] } ] @@ -1255,14 +1252,13 @@ vus_max........................: 50 min=50 max=50 { label: 'Duration (ms)', data: [ - 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 + 29, 30, 37, 38, 39, 44, 43, 53, 49, 53, 58, 61, + 61, 54, 57, 62, 62, 62, 61, 62, 61, 61, 65, 59, + 60, 66, 59, 65, 61, 62, 62, 63, 65, 63, 60, 60, + 61, 63, 59, 60, 62, 64, 65, 60, 63, 65, 59, 64, + 59, 60, 61, 62, 62, 58, 59, 60, 53, 60, 57, 58, + 57, 57, 61, 53, 50, 53, 51, 56, 54, 46, 54, 50, + 51, 48, 47, 45, 45, 50 ] } ] @@ -1276,11 +1272,11 @@ vus_max........................: 50 min=50 max=50 { label: 'User', data: [ - 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 + 0.51, 0.71, 0.76, 0.7, + 0.72, 0.72, 0.74, 0.77, + 0.72, 0.73, 0.75, 0.74, + 0.73, 0.78, 0.77, 0.66, + 0.76, 0.6, 0.02 ], borderColor: '#4bc0c0', backgroundColor: '#4bc0c0', @@ -1289,11 +1285,11 @@ vus_max........................: 50 min=50 max=50 { label: 'System', data: [ - 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 + 0.15, 0.2, 0.2, 0.18, + 0.19, 0.18, 0.19, 0.2, + 0.19, 0.19, 0.19, 0.19, + 0.19, 0.19, 0.18, 0.17, + 0.2, 0.16, 0.01 ], borderColor: '#ff6384', backgroundColor: '#ff6384', @@ -1307,11 +1303,11 @@ vus_max........................: 50 min=50 max=50 { label: 'User', data: [ - 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 + 0.42, 0.47, 0.48, 0.51, + 0.51, 0.52, 0.49, 0.52, + 0.52, 0.52, 0.51, 0.53, + 0.51, 0.52, 0.49, 0.5, + 0.52, 0.12, 0.03 ], borderColor: '#4bc0c0', backgroundColor: '#4bc0c0', @@ -1320,11 +1316,11 @@ vus_max........................: 50 min=50 max=50 { label: 'System', data: [ - 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 + 0.15, 0.29, 0.37, 0.44, + 0.43, 0.46, 0.42, 0.47, + 0.47, 0.45, 0.46, 0.46, + 0.41, 0.46, 0.39, 0.39, + 0.42, 0.11, 0.02 ], borderColor: '#ff6384', backgroundColor: '#ff6384', @@ -2292,13 +2288,13 @@ Here are the final req/s results for each framework against PgSQL database. borderColor: "#0f766e", backgroundColor: "#0f766e", data: [ - 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 + 50, 371, 331, 391, 475, 450, 464, 464, 467, 450, + 447, 467, 467, 455, 451, 458, 463, 485, 470, 476, + 449, 481, 485, 461, 476, 442, 455, 474, 454, 456, + 439, 478, 472, 436, 473, 453, 463, 471, 456, 455, + 439, 470, 456, 473, 465, 459, 468, 471, 475, 474, + 444, 484, 469, 466, 468, 448, 477, 449, 443, 482, + 444, 452, 432, 374, 1 ], }, { @@ -2389,15 +2385,14 @@ Here are the final req/s results for each framework against PgSQL database. borderColor: "#0f766e", backgroundColor: "#0f766e", data: [ - 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 + 734, 921, 803, 822, 870, 809, 859, 751, 834, 825, + 786, 779, 811, 928, 869, 802, 802, 802, 832, 802, + 798, 824, 768, 845, 825, 762, 860, 758, 812, 813, + 808, 783, 772, 797, 831, 835, 799, 781, 844, 824, + 787, 801, 769, 819, 799, 774, 837, 776, 837, 826, + 821, 776, 791, 816, 838, 792, 900, 795, 815, 807, + 781, 819, 729, 848, 861, 839, 872, 762, 796, 902, + 790, 791, 791, 830, 815, 835, 832, 583 ], }, {