Skip to content

Roadmap v4.0: Target Actix-web performance parity and superiority #319

Open

Description

@gg582

Background

With CWIST v3.9 released, the primary performance objective for the upcoming v4.0 (first LTS / stable release) is to surpass Actix-web across throughput, mean latency, and tail latency (P99 / P99.999).

CWIST already consistently outperforms Axum, Gin, and Spring Boot under standard CI benchmarking profiles. However, Actix-web represents the highest-throughput compiled async web framework standard on Linux.

Action Items & Milestones

  1. Benchmark Integration & Continuous Tracking

    • Integrated Actix-web (actix-web = 4) into the CI webserver benchmark matrix in .github/workflows/bsd-kqueue-benchmarks.yml.
    • Added Actix metrics to render_webserver_svg and KDE latency density chart generation (scripts/ci/benchmark.py).
    • Documented the measurement contract in docs/webserver-benchmark.md.
  2. Core Reactor & I/O Optimizations for v4.0

    • Profile event loop overhead against Actix's thread-local worker model.
    • Maximize zero-copy socket buffer handoff and batch submission in the io_uring / epoll reactor.
    • Reduce memory allocation overhead in HTTP header parsing and path dispatching.
    • Investigate lock-free connection dispatching and worker CPU core pinning enhancements.
  3. Verification

    • Continuously track Actix-web vs CWIST (Classic & C1M) in automated GitHub Actions runs across various runner hardware (AMD EPYC, Intel Xeon).
    • Target >= 1.05x Actix throughput and lower P99.999 tail latency across all runner architectures.

Activity

  1. added a commit that references this issue on Oct 7, 2026
  2. gg582 commented on Oct 9, 2026

    @gg582
    MemberAuthor
    Rank Language Framework req/s p99 Latency (ms) Saturation (%) Overall (req/s / Latency)
    1 rust nickel 111,685.80 0.06 54.84 1,861,430.00
    2 d cgi_processes 123,697.85 0.14 73.05 883,556.07
    3 javascript morojs 259,417.82 1.17 48.70 221,724.63
    4 javascript morojs-engine 259,616.52 1.20 48.81 216,347.10
    5 rust may_minihttp 227,010.26 1.18 53.52 192,381.58
    6 javascript uwebsockets 242,222.94 1.27 50.88 190,726.72
    7 rust iron 105,479.34 0.56 73.39 188,355.96
    8 javascript fulmine.js 241,971.66 1.35 51.14 179,238.27
    9 rust tako 200,360.89 1.34 56.65 149,523.05
    10 rust actix 193,082.18 1.38 57.90 139,914.62
    11 javascript sifrr 200,985.22 1.45 56.87 138,610.50
    12 rust ohkami-nio 230,703.07 1.82 53.09 126,759.93
    13 java activej 209,294.28 1.68 56.28 124,579.93
    14 javascript elysia-bun 198,319.57 1.71 57.25 115,976.36
    15 rust zeno-rs-actix 174,578.45 1.52 60.31 114,854.24
    16 rust ohkami-tokio 219,199.30 1.97 52.68 111,268.68
    17 python peregrine-wsgi 176,303.20 1.60 62.19 110,189.50
    18 php workerman 168,101.47 1.69 61.73 99,468.33
    19 java jooby 193,465.50 1.95 58.86 99,213.08
    20 zig httpz 215,314.94 2.18 55.83 98,768.32
    21 java rapidoid 164,072.00 1.68 63.49 97,661.90
    22 rust hyper 201,964.40 2.14 54.94 94,375.89
    23 php mark 161,778.44 1.74 63.00 92,976.11
    24 d cgi_threads 107,790.33 1.16 70.29 92,922.70
    25 c cwist 166,573.26 1.84 63.27 90,528.95
    26 rust khttp 199,813.36 2.03 59.65 88,578.01
    27 lua ulute 164,082.15 1.90 - 86,359.03
    28 javascript routejs-uwebsocket 167,425.25 1.94 61.48 86,301.68
    29 javascript morojs-uws 166,315.76 1.93 61.47 86,173.97
    30 rust micro-web 188,786.75 2.29 57.09 82,439.63
    31 javascript vixeny-deno 154,121.81 1.93 63.66 79,855.86
    32 javascript bun 162,334.08 2.08 62.67 78,045.23
    33 java vertx 174,718.79 2.26 61.56 77,309.20
    34 javascript hono-deno 150,626.71 1.96 64.42 76,850.36
    35 javascript ignisia 163,834.82 2.14 62.30 76,558.33
    36 rust argan 179,665.73 2.40 58.79 74,860.72
    37 javascript nifra-bun 159,908.10 2.21 62.87 72,356.61
    38 rust warp 175,248.76 2.46 58.90 71,239.33
    39 javascript nhttp 145,064.63 2.08 64.71 69,742.61
    40 java vertx4web 163,854.92 2.36 62.99 69,430.05
    41 javascript fast 143,277.65 2.11 65.01 67,904.10
    42 java undertow 152,198.59 2.28 65.80 66,753.77
    43 rust viz 168,582.92 2.56 60.44 65,852.70
    44 python weft-wsgi 143,333.62 2.24 65.93 63,988.22
    45 python fastpysgi-wsgi 138,116.71 2.14 67.23 64,540.52
    46 php webman 132,780.29 2.11 67.14 62,929.05
    47 rust hyperlane 163,911.24 2.62 61.91 62,561.54
    48 rust axum 165,760.00 2.59 60.72 63,999.99
    49 d vibed_light 125,037.42 2.13 69.16 58,703.01
    50 perl feersum 170,142.06 2.78 62.11 61,202.18
    51 javascript vixeny-bun 148,322.54 2.44 64.73 60,787.93
    52 rust reinhardt-web 159,935.99 2.68 61.61 59,677.61
    53 rust graphul 160,168.22 2.69 62.14 59,542.09
    54 java helidon-se 140,928.55 2.38 67.26 59,213.68
    55 rust poem 158,060.13 2.72 61.78 58,110.34
    56 clojure donkey 134,058.63 2.30 48.47 58,286.36
    57 rust gotham 155,960.50 2.75 62.43 56,712.91
    58 scala zio-http 155,586.89 2.42 63.71 64,292.10
    59 rust salvo 151,481.43 2.85 63.33 53,151.38
    60 go web 187,396.61 3.63 59.75 51,624.41
    61 java quarkus 136,112.67 2.66 66.67 51,170.18
    62 rust rama 146,909.43 2.92 63.96 50,311.45
    63 javascript spliffy 137,411.43 2.75 66.88 49,967.79
    64 python peregrine-asgi 120,339.29 2.52 73.55 47,753.69
    65 rust silent 141,885.61 3.03 64.85 46,826.93
    66 rust zeno-rs-axum 139,672.34 3.06 65.21 45,644.56
    67 d serverino 144,809.98 3.23 65.40 44,832.81
    68 go breeze 200,282.82 4.54 52.78 44,115.16
    69 javascript bunicorn 121,355.09 2.76 68.44 43,969.24
    70 go fasthttp 166,243.39 3.90 63.01 42,626.51
    71 go gearbox 165,605.50 3.94 62.82 42,031.85
    72 rust mq-bridge 132,694.02 3.22 66.05 41,209.32
    73 fsharp oxpecker 147,963.37 3.62 64.72 40,873.86
    74 go fiber 162,991.91 3.98 63.02 40,952.74
    75 go gorouter-fasthttp 163,151.05 3.99 63.14 40,890.00
    76 go hertz 154,278.94 3.76 63.87 41,031.63
    77 nim supranim 161,485.19 12.16 60.05 13,280.03
    78 swift garuda 196,530.04 3.72 58.14 52,830.66
    79 go router 157,386.76 4.19 63.94 37,562.47
    80 rust trillium-tokio 126,384.94 3.38 67.34 37,392.00
    81 python weft-asgi 118,360.68 3.12 72.89 37,936.12
    82 java restheart 102,959.05 2.73 73.43 37,713.94
    83 fsharp frank 146,436.49 4.00 65.11 36,609.12
    84 nim guildenstern 106,368.22 2.77 66.09 38,400.08
    85 go atreugo 155,174.97 4.26 64.04 36,426.05
    86 javascript low-http-server 104,124.20 2.99 71.15 34,824.15
    87 javascript hyper-express 112,135.80 2.99 70.57 37,503.61
    88 javascript polkadot 104,247.15 3.08 73.42 33,846.48
    89 csharp carter 146,862.40 4.42 64.82 33,226.79
    90 perl feersum-psgi 122,890.40 3.83 69.72 32,086.27
    91 fsharp giraffe-endpoints 141,362.62 4.48 65.26 31,554.16
    92 fsharp falco 140,456.23 4.65 66.14 30,205.64
    93 csharp aspnet-minimal-api 147,804.97 4.91 64.75 30,102.85
    94 javascript 0http-bun 137,461.45 4.43 66.31 31,029.67
    95 fsharp saturn 117,881.83 3.80 63.67 31,021.53
    96 fsharp suave 112,687.47 3.67 67.51 30,705.03
    97 javascript 0http 98,375.16 3.31 74.25 29,720.59
    98 c cagoo-c 214,704.40 7.71 59.62 27,847.52
    99 crystal caprese 256,003.63 9.41 49.73 27,205.49
    100 nim caprese 256,003.63 9.41 49.73 27,205.49
    101 python oxapy 115,039.98 4.32 72.09 26,629.63
    102 rust trillium-smol 112,424.59 4.28 69.69 26,267.43
    103 d vibed 93,839.32 3.33 71.33 28,179.98
    104 php phpmixphp-workerman 92,607.25 3.76 54.34 24,629.59
    105 csharp codebehind 127,251.85 5.04 66.17 25,248.38
    106 csharp fastendpoints 125,524.66 5.02 66.67 25,004.91
    107 fsharp giraffe 129,721.84 5.16 66.62 25,139.89
    108 rust rocket 103,431.86 4.18 71.34 24,744.46
    109 haskell scotty 104,645.01 4.29 71.05 24,392.78
    110 csharp effinitive-framework 103,343.23 4.36 69.22 23,702.58
    111 rust ohkami-smol 83,268.26 3.61 16.12 23,066.00
    112 v pico 95,668.97 3.63 12.66 26,355.09
    113 javascript restana 88,992.73 3.65 75.67 24,381.57
    114 go gogo 90,747.13 3.77 13.58 24,070.86
    115 javascript routejs 80,654.30 3.84 75.71 21,003.72
    116 javascript polka 80,911.77 4.01 75.40 20,177.50
    117 javascript rayo 79,626.38 4.01 75.97 19,856.95
    118 fsharp websharper 101,300.33 5.07 74.27 19,980.34
    119 python peregrine-blacksheep 78,982.90 3.97 81.38 19,894.94
    120 csharp aspnet-mvc 108,497.82 5.43 70.59 19,981.18
    121 javascript h3 80,983.38 4.19 77.72 19,327.78
    122 kotlin ktor 98,965.45 5.16 72.25 19,179.35
    123 php nano 132,978.39 7.02 67.05 18,942.79
    124 javascript fastify 76,363.11 4.20 76.95 18,181.69
    125 zig zzz 77,053.75 4.36 14.92 17,672.88
    126 csharp genhttp 95,798.15 5.26 71.07 18,212.58
    127 dart jet_server-vm 256,385.22 15.58 - 16,456.05
    128 dart jet_server 255,548.73 15.63 - 16,350.00
    129 nim powpow 248,309.11 15.88 53.29 15,636.59
    130 java light-4j 151,211.95 9.42 66.02 16,052.22
    131 kotlin hexagon-netty-epoll 151,837.35 9.54 64.76 15,915.86
    132 javascript oak-deno 72,494.22 4.60 77.96 15,759.61
    133 javascript hono 70,497.21 4.63 15.64 15,226.18
    134 kotlin hexagon-netty 141,607.08 9.56 66.38 14,812.46
    135 javascript hono-node 67,940.27 4.64 78.47 14,642.30
    136 javascript muneem 66,884.64 4.58 78.73 14,603.63
    137 java spring-webflux 67,697.76 4.74 80.06 14,282.23
    138 clojure coast 78,938.66 5.64 71.76 13,996.22
    139 julia mongoose 69,804.63 5.05 15.81 13,822.70
    140 javascript adonisjs-http 64,586.86 4.77 79.19 13,539.99
    141 scala cask 97,566.53 8.13 74.08 12,000.80
    142 go apirouter 100,288.11 8.08 71.81 12,411.90
    143 go bunrouter 99,286.17 8.20 71.80 12,108.07
    144 go rte 99,152.22 8.28 71.86 11,974.91
    145 go gin 98,710.81 8.22 71.66 12,008.61
    146 go clevergo 98,461.06 8.21 71.78 11,992.82
    147 go r2 99,048.29 8.43 71.80 11,749.50
    148 java aspectran 133,181.22 10.47 70.05 12,720.27
    149 go echo 98,347.25 8.53 71.64 11,529.57
    150 go httprouter 98,230.63 8.32 72.31 11,806.57
    151 java micronaut 114,694.71 9.87 69.54 11,620.54
    152 nim httpbeast 204,344.62 17.50 60.50 11,676.84
    153 javascript brahma-firelight 75,782.99 6.52 80.72 11,623.16
    154 javascript nestjs-fastify 60,969.98 5.30 79.74 11,503.77
    155 go nethttp 96,617.05 8.56 72.38 11,287.04
    156 python emmett 64,903.34 6.21 82.59 10,451.42
    157 javascript foxify 57,750.65 5.17 80.97 11,170.34
    158 v vanilla_epoll 196,046.19 18.23 61.81 10,754.04
    159 nim whip 182,474.58 16.45 63.63 11,092.68
    160 ruby agoo 100,610.81 9.56 74.09 10,524.14
    161 haskell servant 57,377.80 5.41 16.96 10,605.88
    162 javascript blaze-node 57,699.25 5.49 80.92 10,510.00
    163 go gorouter 96,600.61 8.97 72.21 10,769.29
    164 go frame 94,404.43 8.88 73.04 10,631.13
    165 crystal toro 166,909.92 16.86 61.53 9,899.76
    166 crystal router.cr 165,332.48 16.46 61.54 10,044.50
    167 go aero 93,609.88 8.37 73.07 11,183.98
    168 go chi 93,887.53 9.34 72.49 10,052.20
    169 d cgi_hybrid 126,727.52 12.54 70.92 10,105.86
    170 crystal spider-gazelle 163,058.16 16.96 61.99 9,614.28
    171 go poteto 92,842.55 9.30 72.76 9,983.07
    172 go go-zero 93,005.81 9.48 72.82 9,810.74
    173 elixir cowboy_stream 60,643.68 6.16 80.07 9,844.75
    174 rust oxidy 53,376.68 5.23 57.85 10,205.87
    175 go webgo 91,458.32 9.15 73.15 9,995.44
    176 go goroute 91,909.96 9.63 73.39 9,544.13
    177 go violetear 90,992.99 9.02 73.52 10,087.91
    178 crystal runcobo 156,279.90 16.58 63.11 9,425.81
    179 crystal grip 157,791.82 17.31 62.00 9,115.65
    180 nim mike 177,846.49 15.55 63.52 11,437.07
    181 crystal orion 126,003.03 13.72 63.55 9,183.90
    182 crystal kemal 147,353.64 16.33 63.38 9,023.49
    183 javascript iotjs-express 56,948.12 5.81 81.05 9,801.74
    184 go gorilla-mux 89,675.32 9.91 73.23 9,048.97
    185 go goyave 88,381.41 9.35 73.93 9,452.56
    186 go kami 89,489.54 9.88 73.59 9,057.65
    187 crystal amber 132,401.38 14.58 64.16 9,081.03
    188 nim jester 141,969.32 15.45 70.34 9,188.95
    189 javascript koa 52,764.66 5.81 81.80 9,081.70
    190 javascript elysia-node 53,936.53 5.70 81.58 9,462.55
    191 go goravel-fiber 80,342.11 9.09 76.09 8,838.52
    192 go beego 87,288.52 10.21 73.88 8,549.32
    193 cpp drogon 178,340.92 21.32 62.14 8,364.96
    194 crystal athena-routing 149,221.42 17.84 63.16 8,364.43
    195 csharp simplify.web 57,220.85 6.97 84.18 8,209.59
    196 java javalin 70,903.36 8.10 75.59 8,753.50
    197 scala pekkohttp 71,988.93 7.33 80.16 9,821.14
    198 nim cps-http 163,004.94 20.24 65.17 8,053.60
    199 java armeria 83,613.31 10.36 75.87 8,070.78
    200 java spark 70,260.54 7.53 64.32 9,330.75
    201 javascript turbo_polka 49,162.60 6.26 18.25 7,852.97
    202 javascript fastify-bun 50,058.22 6.16 17.94 8,126.33
    203 go air 79,996.73 11.06 75.39 7,232.98
    204 v fasthttp 145,834.14 20.43 56.91 7,138.23
    205 javascript express 47,573.17 6.39 83.33 7,444.94
    206 javascript moleculer 47,370.93 6.52 83.19 7,265.48
    207 gleam mist 51,000.38 7.32 82.95 6,967.27
    208 go aurora 80,474.39 11.99 75.39 6,711.79
    209 elixir plug_bandit 44,685.84 6.43 84.49 6,949.59
    210 lua lapis 50,744.47 7.42 83.41 6,838.88
    211 python asgineer 42,914.60 6.28 83.72 6,833.53
    212 javascript adonisjs-slim 44,105.21 7.00 84.14 6,300.74
    213 nim rosencrantz 41,078.21 6.56 19.20 6,261.92
    214 elixir phoenix_bandit 41,709.32 6.74 85.15 6,188.33
    215 swift hummingbird-framework 52,238.18 8.66 85.72 6,032.12
    216 php chubbyphp-workerman 39,558.33 6.71 86.78 5,895.43
    217 python lihil 39,844.19 6.83 84.38 5,833.70
    218 nim prologue 90,566.77 15.78 78.00 5,739.34
    219 python mq-bridge-py 41,340.47 7.28 50.61 5,678.64
    220 go flamego 71,696.17 12.68 77.50 5,654.27
    221 php imi-workerman 54,457.26 5.38 83.08 10,122.17
    222 javascript feathersjs 42,277.64 7.38 84.63 5,728.68
    223 javascript nifra-node 45,034.65 6.95 83.30 6,479.81
    224 d lighttp 41,526.20 7.52 20.53 5,522.10
    225 julia http 44,081.24 8.24 22.25 5,349.66
    226 ocaml dream 40,102.71 7.74 19.02 5,181.23
    227 javascript oak-bun 39,402.10 7.67 19.13 5,137.17
    228 python blacksheep 37,328.98 7.27 84.65 5,134.66
    229 javascript express-bun 39,187.07 7.76 19.23 5,049.88
    230 javascript restify 39,609.47 7.79 85.16 5,084.66
    231 php simps 187,676.35 29.45 60.87 6,372.71
    232 php fomo 180,193.66 32.26 62.05 5,585.67
    233 php swoole 155,389.49 31.29 65.01 4,966.11
    234 nim hashi 163,552.05 36.62 69.21 4,466.19
    235 swift vapor-framework 35,166.72 7.44 88.09 4,726.71
    236 javascript koa-bun 37,219.38 7.87 19.63 4,729.27
    237 crystal marten 86,240.35 18.83 74.24 4,579.94
    238 java jersey-grizzly2 49,762.72 11.22 82.81 4,435.18
    239 java jersey3-grizzly2 49,297.15 11.27 82.81 4,374.20
    240 python starlette 34,324.09 7.78 85.97 4,411.84
    241 python panther 33,901.12 7.94 85.90 4,269.66
    242 nim basolato 33,727.66 8.00 20.02 4,215.96
    243 python veloce 33,531.64 8.03 86.29 4,175.80
    244 python baize-asgi 31,997.98 8.46 82.21 3,782.27
    245 python index.py 28,165.51 9.58 83.79 2,939.99
    246 python heaven 25,234.51 10.73 84.88 2,351.77
    247 python litestar 24,040.10 11.51 88.86 2,088.63
    248 python robyn 37,253.25 14.40 89.12 2,587.03
    249 python sanic 36,187.63 18.41 86.44 1,965.65
    250 python peregrine-fastapi 29,580.11 10.41 92.14 2,841.51
    251 python weft-fastapi 28,577.50 13.69 91.67 2,087.47
    252 python peregrine-flask 21,554.75 13.57 92.20 1,588.41
    253 python fastapi 19,345.15 14.22 90.42 1,360.42
    254 python aiohttp 18,491.67 14.13 21.42 1,308.68
    255 python peregrine-django 18,240.06 15.94 92.19 1,144.29
    256 python responder 16,603.61 16.42 90.74 1,011.18
    257 php swoole-coroutine 130,582.86 33.23 67.98 3,929.67
    258 php chubbyphp-swoole 34,158.43 35.81 85.16 953.88
    259 php slim-swoole 31,033.83 46.23 86.07 671.29
    260 dart shelf-vm 32,974.13 49.55 - 665.47
    261 dart shelf 32,824.40 48.15 - 681.71
    262 java struts2 23,265.97 156.21 85.02 148.94
    263 go goravel-gin 45,099.77 107.38 84.12 419.99
    264 javascript totaljs 7,647.68 2,677.78 25.79 2.86
    265 swift swifter-framework 12,939.20 2,668.38 53.06 4.85
    266 python cherrypy 1,087.30 1,107.41 27.67 0.98
    267 python flask 1,209.72 973.27 20.88 1.24
    268 python falcon 1,210.23 750.68 13.54 1.61
    269 nim scorper 0.00 0.00 - 0.00
  3. gg582 commented on Oct 13, 2026

    @gg582
    MemberAuthor

    External benchmark: CWIST 3.9.1 vs actix-web 4.8

    Source: the benchmarker latest run, side-by-side comparison. The site labels CWIST as "3.9"; the build under test is 3.9.1. Both frameworks come from the same run on the same hardware.

    Latency in ms, lower is better. Each cell shows cwist / actix (Δ), where Δ is how much slower cwist is than actix (negative means cwist is faster).

    Metric 64 conns 256 conns 512 conns
    Min 0.05 / 0.07 (−29%) 0.05 / 0.04 (+25%) 0.05 / 0.06 (−17%)
    Average 0.36 / 0.30 (+20%) 1.60 / 1.32 (+21%) 3.27 / 2.73 (+20%)
    P50 0.37 / 0.30 (+23%) 1.60 / 1.32 (+21%) 3.34 / 2.73 (+22%)
    P75 0.43 / 0.31 (+39%) 1.70 / 1.33 (+28%) 3.51 / 2.75 (+28%)
    P90 0.48 / 0.32 (+50%) 1.81 / 1.35 (+34%) 3.62 / 2.77 (+31%)
    P99 0.50 / 0.33 (+52%) 1.84 / 1.38 (+33%) 3.68 / 2.81 (+31%)
    P99.999 1.17 / 1.06 (+10%) 7.28 / 5.15 (+41%) 8.48 / 9.82 (−14%)
    Max n/a n/a n/a

    The throughput (req/s) table was not included in the export, so it is not shown here.

    Observations

    • Median gap stays at about 20% at every concurrency level. Because the gap does not grow with load, it points to a fixed cost per request rather than a scaling problem.
    • cwist's latency spreads out more within the distribution. From P50 to P99, cwist goes 0.37 → 0.50 ms at 64 conns (+35%), while actix stays almost flat at 0.30 → 0.33 ms (+10%). The same pattern holds at 256 and 512 conns.
    • Extreme tail: cwist is behind at 256 conns (+41%) but ahead of actix at 512 conns (8.48 vs 9.82 ms).
    • Minimum latency is about the same for both, so the raw syscall path is not where cwist loses.

    Next for #319: find the fixed per-request cost (dispatch, response build/serialize, write path) and the source of the P50–P99 spread (wakeup/batching jitter). Then rerun this comparison once the changes now on dev (async logger #370, late fast-path #361, syscall reduction #336) ship in a release.

  4. gg582 commented on Oct 13, 2026

    @gg582
    MemberAuthor

    Local A/B: v3.9.1 vs dev (f00cafda)

    Since v3.9.1, these PRs have landed on dev: #336 (syscall reduction), #349, #356, #361 (late fast-path) and #370 (async logger). This A/B checks whether any of them changes the workload the-benchmarker runs.

    Setup

    • App: benchmarks/web-frameworks/main.c (the-benchmarker contract app), GET /, CWIST_WORKERS=4 as in the published config.yaml.
    • Both trees built the same way (make libcwist.a, app at -O2), each with the libttak commit it pins. BoringSSL and lsquic are shared between them.
    • Machine: Ryzen 5 5600X (6C/12T), Linux 6.12, loopback.
    • Load: wrk 10 s per run after a 3 s warm-up, fresh server process per run. v3.9.1 and dev runs are interleaved, with the order flipped every round. Every value below is the median across rounds.

    Server-bound: server on 2 physical cores (cpus 0,1,6,7), wrk -t8 on the other 4

    6 rounds per cell. Avg/P50/P99 latency in ms.

    Conns Metric v3.9.1 dev Δ
    64 req/s 348.2k 345.8k −0.7%
    64 Avg / P50 / P99 0.18 / 0.17 / 0.45 0.19 / 0.17 / 0.52 +2.5% / −3.2% / +15.2%
    256 req/s 366.2k 364.8k −0.4%
    256 Avg / P50 / P99 0.68 / 0.67 / 1.10 0.68 / 0.67 / 1.12 +0.4% / −0.7% / +1.4%
    512 req/s 369.0k 367.0k −0.5%
    512 Avg / P50 / P99 1.35 / 1.34 / 1.97 1.35 / 1.35 / 1.97 +0.4% / +0.7% / 0.0%

    Client-bound: server on 4 physical cores, wrk -t4 on 2

    4 rounds per cell, plus 10 extra rounds at 512 conns.

    Conns v3.9.1 req/s dev req/s
    64 343.4k 342.3k
    256 342.9k 343.0k
    512 (14 runs) 342k 341.5k

    Every cell sits at about 342k. That is wrk's ceiling with 2 cores, so this setup can't show a difference in server throughput.

    Findings

    • No measurable change between v3.9.1 and dev on this workload. Throughput is within ±1% and P50 within noise. The PRs merged since v3.9.1 target syscalls on other paths, the async/deferred path and log output. The contract app hits none of these: its handlers are empty, it has no logger, and it never defers. So a new release alone should not move the published numbers.
    • dev's P99 at 64 conns varied more between runs: dev 0.42–0.86 ms vs v3.9.1 0.40–0.49 ms over 6 runs, about +15% at the median. It didn't show up at 256 or 512 conns. It is within noise for a shared desktop, but I'm noting it.
    • One open item. In the first client-bound pass, dev dropped to about 263k in 2 of 4 runs at 512 conns, and to 278k in 1 of 4 at 64 conns. 263k is about 3/4 of the 342k ceiling, which is what one idle worker out of 4 would look like. A rerun of 10 runs per version at 512 conns didn't reproduce it: dev ran 339–343k, v3.9.1 338–343k. I'm treating it as noise from the shared machine for now. It is worth watching per-worker accept counts in the next profiling pass.

    Next steps for #319

    Since the release-to-release delta is flat, the about-20% median gap to actix has to come from the request path itself. Next steps:

    1. Run perf record on GET / (parse, route, response build/serialize, write) to find the fixed per-request cost.
    2. Sweep CWIST_WORKERS (4 / 6 / 8 / auto). The published config pins 4 workers, while actix uses every core on the benchmark host.
    3. Use strace -c to compare syscalls per request on keep-alive against actix.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions