diff --git a/frameworks/vanilla-epoll/Dockerfile b/frameworks/vanilla-epoll/Dockerfile index f5336dca7..95803940d 100644 --- a/frameworks/vanilla-epoll/Dockerfile +++ b/frameworks/vanilla-epoll/Dockerfile @@ -2,7 +2,8 @@ FROM debian:stable-slim AS build RUN apt-get -qq update && \ apt-get -qy install --no-install-recommends \ - ca-certificates build-essential git libpq-dev liburing-dev && \ + ca-certificates build-essential git libpq-dev liburing-dev \ + cmake curl bzip2 python3 && \ rm -rf /var/lib/apt/lists/* # Pinned, reproducible V at master commit 02015a7c (built from source). Moved off @@ -22,22 +23,68 @@ RUN git clone https://github.com/vlang/v /opt/v && \ # (or rate-limit) failed the whole build (MDA2AV/HttpArena#895). To pick up upstream # library fixes, bump this commit. # -# vanilla main @15bd57e picks up the allocation fixes from a lib-wide audit: -# enghitalo/vanilla#72 (pg_async: read wire ints at offset, drop per-read slices), -# #73 (static_assets: zero-copy conditional-GET/Range parsing) and #74 (TLS: pool the -# per-connection read/response buffers). +# Pinned to vanilla main @5137a9a — the lib-wide alloc audit (#72 pg_async, #73 +# static_assets, #74 TLS buffer pooling) PLUS kTLS record offload for json-tls +# (merged via enghitalo/vanilla#79): after the Mbed TLS handshake the kernel does +# TLS 1.3 record AES-128-GCM (setsockopt TLS_TX+TLS_RX), so the epoll worker's +# steady-state read/write are plain recv/send — no per-record userspace crypto and +# no PSA key-store mutex on the hot path. Falls back to userspace TLS where the +# `tls` kernel module is absent. RUN git clone https://github.com/enghitalo/vanilla /root/.vmodules/vanilla && \ - git -C /root/.vmodules/vanilla checkout 15bd57e5ae8cf1383bd386826e48e08a10f6d4b4 + git -C /root/.vmodules/vanilla checkout 5137a9a9276c85325b28302f5a799cb3da46efe7 + +# Mbed TLS 4 for the json-tls profile. The vanilla `tls` module's C shim +# (vanilla_tls.c, built with `-d vanilla_tls`) targets the Mbed TLS 4.x API +# (PSA, TLS 1.3); Debian apt only ships 2.28, which is ABI/API-incompatible, so +# build 4.x from the version-pinned release tarball (self-contained — needs no +# Python framework) as SHARED libs into /usr/local, matching the #flag in +# tls_mbedtls_d_vanilla_tls.c.v (-L/usr/local/lib -lmbedtls -lmbedx509 +# -lmbedcrypto). 4.x also produces libtfpsacrypto (the TF-PSA-Crypto split), +# linked transitively. Headers land in /usr/local/include for the build. +ARG MBEDTLS_VERSION=4.1.0 +RUN curl -fsSL -o /tmp/mbedtls.tar.bz2 \ + "https://github.com/Mbed-TLS/mbedtls/releases/download/mbedtls-${MBEDTLS_VERSION}/mbedtls-${MBEDTLS_VERSION}.tar.bz2" && \ + tar -xf /tmp/mbedtls.tar.bz2 -C /tmp && \ + cd "/tmp/mbedtls-${MBEDTLS_VERSION}" && \ + # THREAD-SAFETY (load-bearing): vanilla runs N TLS worker threads, each driving + # TLS 1.3 handshakes through Mbed TLS's PSA crypto, whose key store is a GLOBAL, + # process-wide table. Without MBEDTLS_THREADING_C the concurrent handshakes race + # on the key slots — a heap-use-after-free under load (confirmed with ASan: + # psa_wipe_key_slot on one thread frees a slot another thread is mid-memcpy in + # psa_hmac_setup; crashes ~c1024 with "double free or corruption"). THREADING_C + + # THREADING_PTHREAD guard the key store with a pthread mutex. In 4.x the crypto + # (and so its config) lives in the tf-psa-crypto submodule. + python3 tf-psa-crypto/scripts/config.py set MBEDTLS_THREADING_C && \ + python3 tf-psa-crypto/scripts/config.py set MBEDTLS_THREADING_PTHREAD && \ + cmake -S "/tmp/mbedtls-${MBEDTLS_VERSION}" -B /tmp/mbedtls-build \ + -DCMAKE_BUILD_TYPE=Release \ + -DUSE_SHARED_MBEDTLS_LIBRARY=On -DUSE_STATIC_MBEDTLS_LIBRARY=Off \ + -DENABLE_TESTING=Off -DENABLE_PROGRAMS=Off \ + -DCMAKE_INSTALL_PREFIX=/usr/local && \ + cmake --build /tmp/mbedtls-build -j"$(nproc)" && \ + cmake --install /tmp/mbedtls-build && ldconfig && \ + rm -rf /tmp/mbedtls.tar.bz2 "/tmp/mbedtls-${MBEDTLS_VERSION}" /tmp/mbedtls-build WORKDIR /app COPY . . -RUN v -prod -gc none . -o server +# -d vanilla_tls compiles the real Mbed TLS backend (the json-tls listener on +# :8081); without it the tls module is a stub and the binary stays mbedtls-free. +RUN v -prod -gc none -d vanilla_tls . -o server FROM debian:stable-slim RUN apt-get -qq update && \ apt-get -qy install --no-install-recommends libpq5 liburing2 && \ rm -rf /var/lib/apt/lists/* +# Mbed TLS 4 shared libs for the json-tls endpoint (libmbedcrypto pulls in +# libtfpsacrypto transitively). ldconfig so the loader resolves them with no +# LD_LIBRARY_PATH. Plain-HTTP builds don't link mbedtls, but this image always +# enables -d vanilla_tls, so the runtime needs them. +COPY --from=build /usr/local/lib/libmbedcrypto.so* /usr/local/lib/libmbedx509.so* /usr/local/lib/libmbedtls.so* /usr/local/lib/libtfpsacrypto.so* /usr/local/lib/ +RUN ldconfig COPY --from=build /app/server /server -EXPOSE 8080 +# 8080 = plaintext HTTP; 8081 = json-tls (HTTP/1.1 over TLS). The harness +# bind-mounts the cert/key at /certs and the server reads /certs/server.{crt,key} +# (override via TLS_CERT/TLS_KEY); with no cert mounted it self-signs. +EXPOSE 8080 8081 CMD ["/server"] diff --git a/frameworks/vanilla-epoll/main.v b/frameworks/vanilla-epoll/main.v index 445dcbd94..f4f0efb7c 100644 --- a/frameworks/vanilla-epoll/main.v +++ b/frameworks/vanilla-epoll/main.v @@ -3,6 +3,7 @@ module main import vanilla.http_server import vanilla.http_server.http1_1.request_parser import vanilla.http_server.core +import vanilla.http_server.tls import vanilla.pg_async import json import os @@ -848,23 +849,29 @@ fn (mut w WorkerCtx) render_crud_update(mut out []u8, id int) { // ── /json (non-DB) ─────────────────────────────────────────────────────────── -fn (w &WorkerCtx) write_json_response(mut out []u8, count int, m i64) { +// write_json_into is the transport-agnostic /json serializer: it only APPENDS +// response bytes to `out`, so the plaintext path (via WorkerCtx) and the json-tls +// path (a stateless TLS handler) share it verbatim. `ro` is read-only and nothing +// per-request is heap-allocated. Content-Length is precomputed from the SAME +// values the body emits, so the framed length can never desync from the body +// (no response-splitting / smuggling surface). +fn write_json_into(ro &SharedRO, mut out []u8, count int, m i64) { // 21 = len('{"items":[') + len('],"count":') + '}'; plus the count's own digits mut clen := 21 + digits(i64(count)) if count > 0 { clen += count - 1 } for i in 0 .. count { - t := w.ro.dataset[i].price * w.ro.dataset[i].quantity * m - clen += w.ro.prefixes[i].len + digits(t) + 1 + t := ro.dataset[i].price * ro.dataset[i].quantity * m + clen += ro.prefixes[i].len + digits(t) + 1 } ws(mut out, 'HTTP/1.1 200 OK\r\nServer: vanilla\r\nContent-Type: application/json\r\nContent-Length: ') wi(mut out, i64(clen)) ws(mut out, '\r\nConnection: keep-alive\r\n\r\n{"items":[') for i in 0 .. count { - ws(mut out, w.ro.prefixes[i]) - wi(mut out, w.ro.dataset[i].price * w.ro.dataset[i].quantity * m) + ws(mut out, ro.prefixes[i]) + wi(mut out, ro.dataset[i].price * ro.dataset[i].quantity * m) ws(mut out, if i < count - 1 { '},' } else { '}' }) } ws(mut out, '],"count":') @@ -872,6 +879,10 @@ fn (w &WorkerCtx) write_json_response(mut out []u8, count int, m i64) { ws(mut out, '}') } +fn (w &WorkerCtx) write_json_response(mut out []u8, count int, m i64) { + write_json_into(w.ro, mut out, count, m) +} + fn (mut w WorkerCtx) write_json_gzip(mut out []u8, count int, m i64) { key := (u64(u32(count)) << 32) | u64(u32(m)) mut cached := []u8{} @@ -1281,6 +1292,30 @@ fn parse_db_url(u string) pg_async.ConnConfig { } } +// load_tls_config builds the json-tls server's TLS config. It reads the cert/key +// the HttpArena harness bind-mounts at /certs (overridable via TLS_CERT/TLS_KEY). +// If NO cert is mounted (local dev), it falls back to a fresh self-signed cert — +// the benchmark/validate clients use `curl -k` / wrk, which never verify it. If a +// cert IS present but the key is missing/unreadable, it FAILS LOUDLY rather than +// silently self-signing, so a real misconfiguration can't slip through as "works +// but with the wrong identity". TLS 1.3 + ALPN http/1.1 are fixed by the tls shim. +fn load_tls_config() &tls.Config { + cert_path := os.getenv_opt('TLS_CERT') or { '/certs/server.crt' } + key_path := os.getenv_opt('TLS_KEY') or { '/certs/server.key' } + cert := os.read_bytes(cert_path) or { + eprintln('vanilla-epoll: no TLS cert at ${cert_path} (${err}); using ephemeral self-signed') + return tls.new_self_signed() or { + panic('vanilla-epoll: self-signed TLS bring-up failed: ${err}') + } + } + key := os.read_bytes(key_path) or { + panic('vanilla-epoll: TLS cert present at ${cert_path} but key unreadable at ${key_path}: ${err}') + } + return tls.new_from_pem(cert, key) or { + panic('vanilla-epoll: TLS cert/key parse failed: ${err}') + } +} + fn main() { url := os.getenv_opt('DATABASE_URL') or { 'postgres://bench:bench@localhost:5432/benchmark' } cfg := parse_db_url(url) @@ -1343,6 +1378,62 @@ fn main() { gz_mu: sync.new_rwmutex() } + // ── json-tls profile: the same /json handler over HTTPS on :8081 ─────────── + // A SECOND server because tls_config is server-wide. It serves ONLY /json + // (404 for everything else) so the TLS port exposes the minimal surface the + // profile needs — no /static, /upload, /crud or DB routes. The handler is a + // STATELESS request_handler (no make_state, sidestepping the TLS worker's + // stateful path) capturing the read-only `ro`; it reuses write_json_into + // verbatim, so the bytes are identical to the plaintext /json. Mbed TLS 1.3, + // ALPN http/1.1 (set by the tls shim) → curl --http1.1 negotiates 1.1. + tls_handler := fn [ro] (req_buffer []u8, fd int, mut out []u8) ! { + mut req := request_parser.HttpRequest{ + buffer: req_buffer + } + if !request_parser.decode_into(mut req) { + wb(mut out, bad_request) + return + } + target := unsafe { tos(&req.buffer[req.path.start], req.path.len) } + qpos := target.index_u8(`?`) + route := if qpos < 0 { target } else { unsafe { tos(target.str, qpos) } } + if route.starts_with('/json/') { + count := clamp_count(parse_u_at(route, 6), ro.dataset.len) + mut m := qint(req, qk_m) + if m == 0 { + m = 1 + } + write_json_into(ro, mut out, count, m) + return + } + wb(mut out, not_found) + } + // Port is fixed to 8081 by the HttpArena harness; TLS_PORT lets local runs pick + // a free port (the harness injects nothing, so the default is the contract). + mut tls_port := (os.getenv_opt('TLS_PORT') or { '8081' }).int() + if tls_port <= 0 { + tls_port = 8081 + } + tls_server := http_server.new_server(http_server.ServerConfig{ + port: tls_port + io_multiplexing: .epoll + limits: http_server.Limits{ + // json-tls requests are tiny GETs; a small ceiling bounds per-conn + // memory and shrinks the DoS surface (the TLS port has no upload path). + max_request_bytes: 64 * 1024 + } + request_handler: tls_handler + tls_config: load_tls_config() + })! + // run() blocks in the accept loop, so the TLS server runs on its own thread + // while the plaintext server.run() below blocks main. run() has a value-mut + // receiver, so spawn it via a closure with a local mut copy (each Server is + // independent — own socket, workers and counters). + spawn fn [tls_server] () { + mut s := tls_server + s.run() + }() + mut server := http_server.new_server(http_server.ServerConfig{ port: 8080 io_multiplexing: .epoll diff --git a/frameworks/vanilla-epoll/meta.json b/frameworks/vanilla-epoll/meta.json index a090c3dc3..f21423c91 100644 --- a/frameworks/vanilla-epoll/meta.json +++ b/frameworks/vanilla-epoll/meta.json @@ -3,7 +3,7 @@ "language": "V", "type": "engine", "engine": "epoll", - "description": "vanilla is a minimalist, high-performance HTTP server written in V: multi-threaded, non-blocking epoll I/O, lock-free, copy-free, SO_REUSEPORT. Handlers are pure (request)->[]u8 returning raw response bytes. JSON is built in a single allocation with precomputed prefixes (no per-request reflection); json-comp gzips on Accept-Encoding; static assets are preloaded into memory; fortunes renders the DB rows + a runtime row with HTML escaping; async-db uses the stdlib db.pg ConnectionPool. Pinned V 0.5.1 (prebuilt release). crud uses an in-memory cache-aside (X-Cache MISS/HIT, invalidated on update) \u2014 no Redis required.", + "description": "vanilla is a minimalist, high-performance HTTP server written in V: multi-threaded, non-blocking epoll I/O, lock-free, copy-free, SO_REUSEPORT. Handlers are pure (request)->[]u8 returning raw response bytes. JSON is built in a single allocation with precomputed prefixes (no per-request reflection); json-comp gzips on Accept-Encoding; json-tls terminates TLS 1.3 (Mbed TLS 4) on :8081 with ALPN http/1.1, reusing the same allocation-free /json serializer; static assets are preloaded into memory; fortunes renders the DB rows + a runtime row with HTML escaping; async-db uses the stdlib db.pg ConnectionPool. Pinned V 0.5.1 (prebuilt release). crud uses an in-memory cache-aside (X-Cache MISS/HIT, invalidated on update) \u2014 no Redis required.", "repo": "https://github.com/enghitalo/vanilla", "enabled": true, "tests": [ @@ -12,6 +12,7 @@ "limited-conn", "json", "json-comp", + "json-tls", "upload", "static", "async-db", diff --git a/site/data/api-16-1024.json b/site/data/api-16-1024.json index 92ac5b93c..9ac43090a 100644 --- a/site/data/api-16-1024.json +++ b/site/data/api-16-1024.json @@ -1481,28 +1481,28 @@ { "framework": "vanilla-epoll", "language": "V", - "rps": 243035, - "avg_latency": "1.75ms", - "p99_latency": "14.80ms", - "cpu": "1379.2%", - "memory": "165MiB", + "rps": 245137, + "avg_latency": "1.69ms", + "p99_latency": "14.30ms", + "cpu": "1406.9%", + "memory": "180MiB", "connections": 1024, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "1.20GB/s", - "input_bw": "13.67MB/s", - "reconnects": 728796, - "status_2xx": 3645532, + "bandwidth": "1.21GB/s", + "input_bw": "13.79MB/s", + "reconnects": 735222, + "status_2xx": 3677055, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0, - "tpl_baseline": 1367533, - "tpl_json": 1367615, + "tpl_baseline": 1380046, + "tpl_json": 1378497, "tpl_db": 0, "tpl_upload": 0, "tpl_static": 0, - "tpl_async_db": 910375 + "tpl_async_db": 918508 }, { "framework": "vanilla-io_uring", diff --git a/site/data/api-4-256.json b/site/data/api-4-256.json index 4090fe703..6e396d9af 100644 --- a/site/data/api-4-256.json +++ b/site/data/api-4-256.json @@ -1481,28 +1481,28 @@ { "framework": "vanilla-epoll", "language": "V", - "rps": 65503, - "avg_latency": "1.88ms", - "p99_latency": "13.70ms", - "cpu": "360.2%", - "memory": "100MiB", + "rps": 68078, + "avg_latency": "1.94ms", + "p99_latency": "13.90ms", + "cpu": "374.1%", + "memory": "114MiB", "connections": 256, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "330.72MB/s", - "input_bw": "3.69MB/s", - "reconnects": 196427, - "status_2xx": 982555, + "bandwidth": "343.61MB/s", + "input_bw": "3.83MB/s", + "reconnects": 204208, + "status_2xx": 1021176, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0, - "tpl_baseline": 368543, - "tpl_json": 368583, + "tpl_baseline": 383232, + "tpl_json": 382788, "tpl_db": 0, "tpl_upload": 0, "tpl_static": 0, - "tpl_async_db": 245429 + "tpl_async_db": 255155 }, { "framework": "vanilla-io_uring", diff --git a/site/data/async-db-1024.json b/site/data/async-db-1024.json index beab31176..b6dcff907 100644 --- a/site/data/async-db-1024.json +++ b/site/data/async-db-1024.json @@ -1239,19 +1239,19 @@ { "framework": "vanilla-epoll", "language": "V", - "rps": 282557, - "avg_latency": "859us", - "p99_latency": "7.12ms", - "cpu": "3034.2%", - "memory": "142MiB", + "rps": 291066, + "avg_latency": "876us", + "p99_latency": "7.44ms", + "cpu": "3114.4%", + "memory": "151MiB", "connections": 1024, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "1.06GB/s", - "input_bw": "18.86MB/s", - "reconnects": 113136, - "status_2xx": 2825573, + "bandwidth": "1.10GB/s", + "input_bw": "19.43MB/s", + "reconnects": 116639, + "status_2xx": 2910666, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 diff --git a/site/data/baseline-4096.json b/site/data/baseline-4096.json index 4a47fffd1..cb1a7f745 100644 --- a/site/data/baseline-4096.json +++ b/site/data/baseline-4096.json @@ -1731,19 +1731,19 @@ { "framework": "vanilla-epoll", "language": "V", - "rps": 4033627, - "avg_latency": "1.02ms", - "p99_latency": "6.57ms", - "cpu": "6307.1%", - "memory": "152MiB", + "rps": 4063080, + "avg_latency": "1.01ms", + "p99_latency": "6.55ms", + "cpu": "6302.1%", + "memory": "154MiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "411.47MB/s", - "input_bw": "311.59MB/s", + "bandwidth": "414.49MB/s", + "input_bw": "313.86MB/s", "reconnects": 0, - "status_2xx": 20168136, + "status_2xx": 20315403, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 diff --git a/site/data/baseline-512.json b/site/data/baseline-512.json index 316c17418..1333ec4b2 100644 --- a/site/data/baseline-512.json +++ b/site/data/baseline-512.json @@ -1731,19 +1731,19 @@ { "framework": "vanilla-epoll", "language": "V", - "rps": 3661083, + "rps": 3669090, "avg_latency": "139us", - "p99_latency": "621us", - "cpu": "6411.5%", - "memory": "69MiB", + "p99_latency": "601us", + "cpu": "6375.2%", + "memory": "77MiB", "connections": 512, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "373.47MB/s", - "input_bw": "282.81MB/s", + "bandwidth": "374.42MB/s", + "input_bw": "283.43MB/s", "reconnects": 0, - "status_2xx": 18305417, + "status_2xx": 18345453, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 diff --git a/site/data/crud-4096.json b/site/data/crud-4096.json index 41a379117..528790e0f 100644 --- a/site/data/crud-4096.json +++ b/site/data/crud-4096.json @@ -502,22 +502,22 @@ { "framework": "vanilla-epoll", "language": "V", - "rps": 307133, - "avg_latency": "11.57ms", - "p99_latency": "74.20ms", - "cpu": "781.2%", - "memory": "207MiB", + "rps": 314523, + "avg_latency": "11.34ms", + "p99_latency": "74.30ms", + "cpu": "790.0%", + "memory": "217MiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "94.09MB/s", - "input_bw": "26.36MB/s", - "reconnects": 21821, - "status_2xx": 4606995, + "bandwidth": "96.32MB/s", + "input_bw": "27.00MB/s", + "reconnects": 22374, + "status_2xx": 4717853, "status_3xx": 0, "status_4xx": 0, - "status_5xx": 69764 + "status_5xx": 66635 }, { "framework": "vanilla-io_uring", diff --git a/site/data/fortunes-1024.json b/site/data/fortunes-1024.json index ee4aa92e3..cc4577b89 100644 --- a/site/data/fortunes-1024.json +++ b/site/data/fortunes-1024.json @@ -173,18 +173,18 @@ { "framework": "vanilla-epoll", "language": "V", - "rps": 167329, - "avg_latency": "4.64ms", - "p99_latency": "13.00ms", - "cpu": "6099.8%", - "memory": "248MiB", + "rps": 165704, + "avg_latency": "4.68ms", + "p99_latency": "13.10ms", + "cpu": "6150.7%", + "memory": "255MiB", "connections": 1024, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "3.88GB/s", + "bandwidth": "3.84GB/s", "reconnects": 0, - "status_2xx": 836648, + "status_2xx": 828520, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 diff --git a/site/data/frameworks.json b/site/data/frameworks.json index edbe9441a..abd828a5c 100644 --- a/site/data/frameworks.json +++ b/site/data/frameworks.json @@ -927,7 +927,7 @@ }, "vanilla-epoll": { "dir": "vanilla-epoll", - "description": "vanilla is a minimalist, high-performance HTTP server written in V: multi-threaded, non-blocking epoll I/O, lock-free, copy-free, SO_REUSEPORT. Handlers are pure (request)->[]u8 returning raw response bytes. JSON is built in a single allocation with precomputed prefixes (no per-request reflection); json-comp gzips on Accept-Encoding; static assets are preloaded into memory; fortunes renders the DB rows + a runtime row with HTML escaping; async-db uses the stdlib db.pg ConnectionPool. Pinned V 0.5.1 (prebuilt release). crud uses an in-memory cache-aside (X-Cache MISS/HIT, invalidated on update) \u2014 no Redis required.", + "description": "vanilla is a minimalist, high-performance HTTP server written in V: multi-threaded, non-blocking epoll I/O, lock-free, copy-free, SO_REUSEPORT. Handlers are pure (request)->[]u8 returning raw response bytes. JSON is built in a single allocation with precomputed prefixes (no per-request reflection); json-comp gzips on Accept-Encoding; json-tls terminates TLS 1.3 (Mbed TLS 4) on :8081 with ALPN http/1.1, reusing the same allocation-free /json serializer; static assets are preloaded into memory; fortunes renders the DB rows + a runtime row with HTML escaping; async-db uses the stdlib db.pg ConnectionPool. Pinned V 0.5.1 (prebuilt release). crud uses an in-memory cache-aside (X-Cache MISS/HIT, invalidated on update) \u2014 no Redis required.", "repo": "https://github.com/enghitalo/vanilla", "type": "engine", "engine": "epoll" diff --git a/site/data/json-4096.json b/site/data/json-4096.json index 3d931cc75..222509013 100644 --- a/site/data/json-4096.json +++ b/site/data/json-4096.json @@ -1459,19 +1459,19 @@ { "framework": "vanilla-epoll", "language": "V", - "rps": 2128514, - "avg_latency": "1.36ms", - "p99_latency": "35.60ms", - "cpu": "6440.0%", - "memory": "170MiB", + "rps": 2142316, + "avg_latency": "1.33ms", + "p99_latency": "33.70ms", + "cpu": "6408.6%", + "memory": "178MiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "7.20GB/s", - "input_bw": "101.50MB/s", - "reconnects": 424768, - "status_2xx": 10642573, + "bandwidth": "7.25GB/s", + "input_bw": "102.15MB/s", + "reconnects": 427583, + "status_2xx": 10711581, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 diff --git a/site/data/json-comp-16384.json b/site/data/json-comp-16384.json index 696131484..d9b1fe9e8 100644 --- a/site/data/json-comp-16384.json +++ b/site/data/json-comp-16384.json @@ -1202,19 +1202,19 @@ { "framework": "vanilla-epoll", "language": "V", - "rps": 2313362, - "avg_latency": "6.72ms", - "p99_latency": "167.80ms", - "cpu": "6056.2%", - "memory": "107MiB", + "rps": 2318394, + "avg_latency": "6.68ms", + "p99_latency": "167.50ms", + "cpu": "6059.6%", + "memory": "101MiB", "connections": 16384, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "3.69GB/s", - "input_bw": "172.08MB/s", - "reconnects": 462059, - "status_2xx": 11566811, + "bandwidth": "3.70GB/s", + "input_bw": "172.46MB/s", + "reconnects": 463035, + "status_2xx": 11591970, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 diff --git a/site/data/json-comp-4096.json b/site/data/json-comp-4096.json index 0d6b53e4a..a2f9bb57f 100644 --- a/site/data/json-comp-4096.json +++ b/site/data/json-comp-4096.json @@ -1202,19 +1202,19 @@ { "framework": "vanilla-epoll", "language": "V", - "rps": 2309040, - "avg_latency": "1.61ms", - "p99_latency": "38.60ms", - "cpu": "6226.7%", - "memory": "106MiB", + "rps": 2334382, + "avg_latency": "1.58ms", + "p99_latency": "37.50ms", + "cpu": "6209.6%", + "memory": "144MiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "3.69GB/s", - "input_bw": "171.76MB/s", - "reconnects": 461385, - "status_2xx": 11545200, + "bandwidth": "3.73GB/s", + "input_bw": "173.65MB/s", + "reconnects": 467093, + "status_2xx": 11671910, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 diff --git a/site/data/json-comp-512.json b/site/data/json-comp-512.json index 6c2ccd021..9612bfb7c 100644 --- a/site/data/json-comp-512.json +++ b/site/data/json-comp-512.json @@ -1202,19 +1202,19 @@ { "framework": "vanilla-epoll", "language": "V", - "rps": 2108470, - "avg_latency": "126us", - "p99_latency": "1.47ms", - "cpu": "6401.1%", - "memory": "86MiB", + "rps": 2111855, + "avg_latency": "124us", + "p99_latency": "1.27ms", + "cpu": "6181.6%", + "memory": "79MiB", "connections": 512, "threads": 64, "duration": "5s", "pipeline": 1, "bandwidth": "3.37GB/s", - "input_bw": "156.84MB/s", - "reconnects": 421671, - "status_2xx": 10542351, + "input_bw": "157.09MB/s", + "reconnects": 422158, + "status_2xx": 10559277, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 diff --git a/site/data/json-tls-4096.json b/site/data/json-tls-4096.json index e81cc1163..3e03defa4 100644 --- a/site/data/json-tls-4096.json +++ b/site/data/json-tls-4096.json @@ -827,6 +827,25 @@ "status_4xx": 0, "status_5xx": 0 }, + { + "framework": "vanilla-epoll", + "language": "V", + "rps": 1506349, + "avg_latency": "19.80ms", + "p99_latency": "966.07ms", + "cpu": "6121.2%", + "memory": "398MiB", + "connections": 4096, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "5.10GB", + "reconnects": 0, + "status_2xx": 7683721, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, { "framework": "workerman", "language": "PHP", diff --git a/site/data/limited-conn-4096.json b/site/data/limited-conn-4096.json index 45cfddff9..36d13aa8a 100644 --- a/site/data/limited-conn-4096.json +++ b/site/data/limited-conn-4096.json @@ -1731,19 +1731,19 @@ { "framework": "vanilla-epoll", "language": "V", - "rps": 1012911, - "avg_latency": "4.02ms", - "p99_latency": "40.40ms", - "cpu": "3045.6%", - "memory": "100MiB", + "rps": 990370, + "avg_latency": "4.12ms", + "p99_latency": "41.30ms", + "cpu": "3029.1%", + "memory": "108MiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "103.33MB/s", - "input_bw": "78.24MB/s", - "reconnects": 506548, - "status_2xx": 5064556, + "bandwidth": "101.03MB/s", + "input_bw": "76.50MB/s", + "reconnects": 495186, + "status_2xx": 4951850, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 diff --git a/site/data/limited-conn-512.json b/site/data/limited-conn-512.json index 3e6638b15..4744d6590 100644 --- a/site/data/limited-conn-512.json +++ b/site/data/limited-conn-512.json @@ -1731,19 +1731,19 @@ { "framework": "vanilla-epoll", "language": "V", - "rps": 991490, - "avg_latency": "507us", - "p99_latency": "4.80ms", - "cpu": "3182.4%", - "memory": "61MiB", + "rps": 1004965, + "avg_latency": "500us", + "p99_latency": "4.74ms", + "cpu": "3206.9%", + "memory": "67MiB", "connections": 512, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "101.15MB/s", - "input_bw": "76.59MB/s", - "reconnects": 495746, - "status_2xx": 4957452, + "bandwidth": "102.52MB/s", + "input_bw": "77.63MB/s", + "reconnects": 502481, + "status_2xx": 5024826, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 diff --git a/site/data/pipelined-4096.json b/site/data/pipelined-4096.json index 69cfd4818..e43cfc63e 100644 --- a/site/data/pipelined-4096.json +++ b/site/data/pipelined-4096.json @@ -1674,18 +1674,18 @@ { "framework": "vanilla-epoll", "language": "V", - "rps": 39516038, + "rps": 39526902, "avg_latency": "1.66ms", - "p99_latency": "8.84ms", - "cpu": "6513.1%", - "memory": "157MiB", + "p99_latency": "9.80ms", + "cpu": "6707.0%", + "memory": "163MiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 16, "bandwidth": "3.94GB/s", "reconnects": 0, - "status_2xx": 197580192, + "status_2xx": 197634512, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 diff --git a/site/data/pipelined-512.json b/site/data/pipelined-512.json index 1452640f2..8534fafe9 100644 --- a/site/data/pipelined-512.json +++ b/site/data/pipelined-512.json @@ -1674,18 +1674,18 @@ { "framework": "vanilla-epoll", "language": "V", - "rps": 39455972, - "avg_latency": "206us", - "p99_latency": "3.50ms", - "cpu": "6721.3%", - "memory": "65MiB", + "rps": 39770883, + "avg_latency": "205us", + "p99_latency": "3.59ms", + "cpu": "6684.2%", + "memory": "74MiB", "connections": 512, "threads": 64, "duration": "5s", "pipeline": 16, - "bandwidth": "3.93GB/s", + "bandwidth": "3.96GB/s", "reconnects": 0, - "status_2xx": 197279862, + "status_2xx": 198854415, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 diff --git a/site/data/static-1024.json b/site/data/static-1024.json index 333c85a74..ebcab0666 100644 --- a/site/data/static-1024.json +++ b/site/data/static-1024.json @@ -1370,18 +1370,18 @@ { "framework": "vanilla-epoll", "language": "V", - "rps": 1108277, - "avg_latency": "555.71us", - "p99_latency": "33.72ms", - "cpu": "5566.0%", - "memory": "96MiB", + "rps": 1099156, + "avg_latency": "568.91us", + "p99_latency": "30.03ms", + "cpu": "5539.4%", + "memory": "106MiB", "connections": 1024, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "65.74GB", + "bandwidth": "65.20GB", "reconnects": 0, - "status_2xx": 5652348, + "status_2xx": 5601797, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 diff --git a/site/data/static-4096.json b/site/data/static-4096.json index 887f418d9..f39343405 100644 --- a/site/data/static-4096.json +++ b/site/data/static-4096.json @@ -1370,18 +1370,18 @@ { "framework": "vanilla-epoll", "language": "V", - "rps": 1149659, - "avg_latency": "1.88ms", - "p99_latency": "13.75ms", - "cpu": "5658.5%", - "memory": "253MiB", + "rps": 1140750, + "avg_latency": "1.92ms", + "p99_latency": "47.83ms", + "cpu": "5635.8%", + "memory": "259MiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "68.20GB", + "bandwidth": "67.67GB", "reconnects": 0, - "status_2xx": 5863837, + "status_2xx": 5818938, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 diff --git a/site/data/static-6800.json b/site/data/static-6800.json index ff9bb098b..3a1d7913d 100644 --- a/site/data/static-6800.json +++ b/site/data/static-6800.json @@ -1370,18 +1370,18 @@ { "framework": "vanilla-epoll", "language": "V", - "rps": 1189005, - "avg_latency": "3.07ms", - "p99_latency": "69.49ms", - "cpu": "5589.0%", - "memory": "374MiB", + "rps": 1175210, + "avg_latency": "3.01ms", + "p99_latency": "66.51ms", + "cpu": "5607.6%", + "memory": "375MiB", "connections": 6800, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "70.53GB", + "bandwidth": "69.71GB", "reconnects": 0, - "status_2xx": 6066026, + "status_2xx": 5996054, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 diff --git a/site/data/upload-256.json b/site/data/upload-256.json index 88aafdf5b..67cacae76 100644 --- a/site/data/upload-256.json +++ b/site/data/upload-256.json @@ -1321,19 +1321,19 @@ { "framework": "vanilla-epoll", "language": "V", - "rps": 2998, - "avg_latency": "78.47ms", - "p99_latency": "258.10ms", - "cpu": "3685.9%", - "memory": "319MiB", + "rps": 3004, + "avg_latency": "78.44ms", + "p99_latency": "257.90ms", + "cpu": "3662.1%", + "memory": "332MiB", "connections": 256, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "328.60KB/s", - "input_bw": "23.78GB/s", - "reconnects": 2976, - "status_2xx": 15080, + "bandwidth": "329.43KB/s", + "input_bw": "23.83GB/s", + "reconnects": 2987, + "status_2xx": 15114, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 diff --git a/site/data/upload-32.json b/site/data/upload-32.json index 954738a6f..28d8acf01 100644 --- a/site/data/upload-32.json +++ b/site/data/upload-32.json @@ -1321,19 +1321,19 @@ { "framework": "vanilla-epoll", "language": "V", - "rps": 2980, - "avg_latency": "10.70ms", - "p99_latency": "34.80ms", - "cpu": "2120.7%", - "memory": "128MiB", + "rps": 2968, + "avg_latency": "10.73ms", + "p99_latency": "34.60ms", + "cpu": "2046.9%", + "memory": "132MiB", "connections": 32, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "326.71KB/s", - "input_bw": "23.64GB/s", - "reconnects": 2982, - "status_2xx": 14932, + "bandwidth": "325.70KB/s", + "input_bw": "23.54GB/s", + "reconnects": 2972, + "status_2xx": 14872, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 diff --git a/site/static/logs/api-16/1024/vanilla-epoll.log b/site/static/logs/api-16/1024/vanilla-epoll.log index e05644d2b..7e0c123c0 100644 --- a/site/static/logs/api-16/1024/vanilla-epoll.log +++ b/site/static/logs/api-16/1024/vanilla-epoll.log @@ -1,3 +1,6 @@ -[socket] Binding to 0.0.0.0:8080 +[socket] Binding to 0.0.0.0:8081 +[socket] SO_REUSEPORT enabled for load balancing [socket] SO_REUSEPORT enabled for load balancing +[socket] Binding to 0.0.0.0:8080 +listening on http://localhost:8081/ listening on http://localhost:8080/ diff --git a/site/static/logs/api-4/256/vanilla-epoll.log b/site/static/logs/api-4/256/vanilla-epoll.log index e05644d2b..7e0c123c0 100644 --- a/site/static/logs/api-4/256/vanilla-epoll.log +++ b/site/static/logs/api-4/256/vanilla-epoll.log @@ -1,3 +1,6 @@ -[socket] Binding to 0.0.0.0:8080 +[socket] Binding to 0.0.0.0:8081 +[socket] SO_REUSEPORT enabled for load balancing [socket] SO_REUSEPORT enabled for load balancing +[socket] Binding to 0.0.0.0:8080 +listening on http://localhost:8081/ listening on http://localhost:8080/ diff --git a/site/static/logs/async-db/1024/vanilla-epoll.log b/site/static/logs/async-db/1024/vanilla-epoll.log index e05644d2b..761cac6b1 100644 --- a/site/static/logs/async-db/1024/vanilla-epoll.log +++ b/site/static/logs/async-db/1024/vanilla-epoll.log @@ -1,3 +1,6 @@ +[socket] Binding to 0.0.0.0:8081 [socket] Binding to 0.0.0.0:8080 [socket] SO_REUSEPORT enabled for load balancing +[socket] SO_REUSEPORT enabled for load balancing listening on http://localhost:8080/ +listening on http://localhost:8081/ diff --git a/site/static/logs/baseline/4096/vanilla-epoll.log b/site/static/logs/baseline/4096/vanilla-epoll.log index e05644d2b..9de548a21 100644 --- a/site/static/logs/baseline/4096/vanilla-epoll.log +++ b/site/static/logs/baseline/4096/vanilla-epoll.log @@ -1,3 +1,6 @@ +[socket] Binding to 0.0.0.0:8081 +[socket] SO_REUSEPORT enabled for load balancing [socket] Binding to 0.0.0.0:8080 [socket] SO_REUSEPORT enabled for load balancing +listening on http://localhost:8081/ listening on http://localhost:8080/ diff --git a/site/static/logs/baseline/512/vanilla-epoll.log b/site/static/logs/baseline/512/vanilla-epoll.log index e05644d2b..6af0df417 100644 --- a/site/static/logs/baseline/512/vanilla-epoll.log +++ b/site/static/logs/baseline/512/vanilla-epoll.log @@ -1,3 +1,6 @@ +[socket] SO_REUSEPORT enabled for load balancing +[socket] Binding to 0.0.0.0:8081 [socket] Binding to 0.0.0.0:8080 [socket] SO_REUSEPORT enabled for load balancing +listening on http://localhost:8081/ listening on http://localhost:8080/ diff --git a/site/static/logs/crud/4096/vanilla-epoll.log b/site/static/logs/crud/4096/vanilla-epoll.log index e05644d2b..255dbf08b 100644 --- a/site/static/logs/crud/4096/vanilla-epoll.log +++ b/site/static/logs/crud/4096/vanilla-epoll.log @@ -1,3 +1,6 @@ +[socket] Binding to 0.0.0.0:8081 [socket] Binding to 0.0.0.0:8080 [socket] SO_REUSEPORT enabled for load balancing +[socket] SO_REUSEPORT enabled for load balancing +listening on http://localhost:8081/ listening on http://localhost:8080/ diff --git a/site/static/logs/fortunes/1024/vanilla-epoll.log b/site/static/logs/fortunes/1024/vanilla-epoll.log index e05644d2b..761cac6b1 100644 --- a/site/static/logs/fortunes/1024/vanilla-epoll.log +++ b/site/static/logs/fortunes/1024/vanilla-epoll.log @@ -1,3 +1,6 @@ +[socket] Binding to 0.0.0.0:8081 [socket] Binding to 0.0.0.0:8080 [socket] SO_REUSEPORT enabled for load balancing +[socket] SO_REUSEPORT enabled for load balancing listening on http://localhost:8080/ +listening on http://localhost:8081/ diff --git a/site/static/logs/json-comp/16384/vanilla-epoll.log b/site/static/logs/json-comp/16384/vanilla-epoll.log index e05644d2b..7e0c123c0 100644 --- a/site/static/logs/json-comp/16384/vanilla-epoll.log +++ b/site/static/logs/json-comp/16384/vanilla-epoll.log @@ -1,3 +1,6 @@ -[socket] Binding to 0.0.0.0:8080 +[socket] Binding to 0.0.0.0:8081 +[socket] SO_REUSEPORT enabled for load balancing [socket] SO_REUSEPORT enabled for load balancing +[socket] Binding to 0.0.0.0:8080 +listening on http://localhost:8081/ listening on http://localhost:8080/ diff --git a/site/static/logs/json-comp/4096/vanilla-epoll.log b/site/static/logs/json-comp/4096/vanilla-epoll.log index 806e2188d..029eef843 100644 --- a/site/static/logs/json-comp/4096/vanilla-epoll.log +++ b/site/static/logs/json-comp/4096/vanilla-epoll.log @@ -1,3 +1,6 @@ [socket] SO_REUSEPORT enabled for load balancing +[socket] Binding to 0.0.0.0:8081 [socket] Binding to 0.0.0.0:8080 +[socket] SO_REUSEPORT enabled for load balancing listening on http://localhost:8080/ +listening on http://localhost:8081/ diff --git a/site/static/logs/json-comp/512/vanilla-epoll.log b/site/static/logs/json-comp/512/vanilla-epoll.log index e05644d2b..761cac6b1 100644 --- a/site/static/logs/json-comp/512/vanilla-epoll.log +++ b/site/static/logs/json-comp/512/vanilla-epoll.log @@ -1,3 +1,6 @@ +[socket] Binding to 0.0.0.0:8081 [socket] Binding to 0.0.0.0:8080 [socket] SO_REUSEPORT enabled for load balancing +[socket] SO_REUSEPORT enabled for load balancing listening on http://localhost:8080/ +listening on http://localhost:8081/ diff --git a/site/static/logs/json-tls/4096/vanilla-epoll.log b/site/static/logs/json-tls/4096/vanilla-epoll.log new file mode 100644 index 000000000..2745380a7 --- /dev/null +++ b/site/static/logs/json-tls/4096/vanilla-epoll.log @@ -0,0 +1,7 @@ +[socket] Binding to 0.0.0.0:8081 +[socket] SO_REUSEPORT enabled for load balancing +[socket] Binding to 0.0.0.0:8080 +[socket] SO_REUSEPORT enabled for load balancing +listening on http://localhost:8080/ +listening on http://localhost:8081/ +[ktls] engaged: kernel TLS TX+RX (TLS 1.3, AES-128-GCM) diff --git a/site/static/logs/json/4096/vanilla-epoll.log b/site/static/logs/json/4096/vanilla-epoll.log index 806e2188d..daea85269 100644 --- a/site/static/logs/json/4096/vanilla-epoll.log +++ b/site/static/logs/json/4096/vanilla-epoll.log @@ -1,3 +1,6 @@ [socket] SO_REUSEPORT enabled for load balancing +[socket] Binding to 0.0.0.0:8081 +[socket] SO_REUSEPORT enabled for load balancing [socket] Binding to 0.0.0.0:8080 listening on http://localhost:8080/ +listening on http://localhost:8081/ diff --git a/site/static/logs/limited-conn/4096/vanilla-epoll.log b/site/static/logs/limited-conn/4096/vanilla-epoll.log index e05644d2b..255dbf08b 100644 --- a/site/static/logs/limited-conn/4096/vanilla-epoll.log +++ b/site/static/logs/limited-conn/4096/vanilla-epoll.log @@ -1,3 +1,6 @@ +[socket] Binding to 0.0.0.0:8081 [socket] Binding to 0.0.0.0:8080 [socket] SO_REUSEPORT enabled for load balancing +[socket] SO_REUSEPORT enabled for load balancing +listening on http://localhost:8081/ listening on http://localhost:8080/ diff --git a/site/static/logs/limited-conn/512/vanilla-epoll.log b/site/static/logs/limited-conn/512/vanilla-epoll.log index 806e2188d..dee8f8a58 100644 --- a/site/static/logs/limited-conn/512/vanilla-epoll.log +++ b/site/static/logs/limited-conn/512/vanilla-epoll.log @@ -1,3 +1,6 @@ +[socket] Binding to 0.0.0.0:8081 [socket] SO_REUSEPORT enabled for load balancing [socket] Binding to 0.0.0.0:8080 +[socket] SO_REUSEPORT enabled for load balancing listening on http://localhost:8080/ +listening on http://localhost:8081/ diff --git a/site/static/logs/pipelined/4096/vanilla-epoll.log b/site/static/logs/pipelined/4096/vanilla-epoll.log index e05644d2b..9de548a21 100644 --- a/site/static/logs/pipelined/4096/vanilla-epoll.log +++ b/site/static/logs/pipelined/4096/vanilla-epoll.log @@ -1,3 +1,6 @@ +[socket] Binding to 0.0.0.0:8081 +[socket] SO_REUSEPORT enabled for load balancing [socket] Binding to 0.0.0.0:8080 [socket] SO_REUSEPORT enabled for load balancing +listening on http://localhost:8081/ listening on http://localhost:8080/ diff --git a/site/static/logs/pipelined/512/vanilla-epoll.log b/site/static/logs/pipelined/512/vanilla-epoll.log index 806e2188d..dee8f8a58 100644 --- a/site/static/logs/pipelined/512/vanilla-epoll.log +++ b/site/static/logs/pipelined/512/vanilla-epoll.log @@ -1,3 +1,6 @@ +[socket] Binding to 0.0.0.0:8081 [socket] SO_REUSEPORT enabled for load balancing [socket] Binding to 0.0.0.0:8080 +[socket] SO_REUSEPORT enabled for load balancing listening on http://localhost:8080/ +listening on http://localhost:8081/ diff --git a/site/static/logs/static/1024/vanilla-epoll.log b/site/static/logs/static/1024/vanilla-epoll.log index e05644d2b..9de548a21 100644 --- a/site/static/logs/static/1024/vanilla-epoll.log +++ b/site/static/logs/static/1024/vanilla-epoll.log @@ -1,3 +1,6 @@ +[socket] Binding to 0.0.0.0:8081 +[socket] SO_REUSEPORT enabled for load balancing [socket] Binding to 0.0.0.0:8080 [socket] SO_REUSEPORT enabled for load balancing +listening on http://localhost:8081/ listening on http://localhost:8080/ diff --git a/site/static/logs/static/4096/vanilla-epoll.log b/site/static/logs/static/4096/vanilla-epoll.log index e05644d2b..7e0c123c0 100644 --- a/site/static/logs/static/4096/vanilla-epoll.log +++ b/site/static/logs/static/4096/vanilla-epoll.log @@ -1,3 +1,6 @@ -[socket] Binding to 0.0.0.0:8080 +[socket] Binding to 0.0.0.0:8081 +[socket] SO_REUSEPORT enabled for load balancing [socket] SO_REUSEPORT enabled for load balancing +[socket] Binding to 0.0.0.0:8080 +listening on http://localhost:8081/ listening on http://localhost:8080/ diff --git a/site/static/logs/static/6800/vanilla-epoll.log b/site/static/logs/static/6800/vanilla-epoll.log index e05644d2b..761cac6b1 100644 --- a/site/static/logs/static/6800/vanilla-epoll.log +++ b/site/static/logs/static/6800/vanilla-epoll.log @@ -1,3 +1,6 @@ +[socket] Binding to 0.0.0.0:8081 [socket] Binding to 0.0.0.0:8080 [socket] SO_REUSEPORT enabled for load balancing +[socket] SO_REUSEPORT enabled for load balancing listening on http://localhost:8080/ +listening on http://localhost:8081/ diff --git a/site/static/logs/upload/256/vanilla-epoll.log b/site/static/logs/upload/256/vanilla-epoll.log index e05644d2b..255dbf08b 100644 --- a/site/static/logs/upload/256/vanilla-epoll.log +++ b/site/static/logs/upload/256/vanilla-epoll.log @@ -1,3 +1,6 @@ +[socket] Binding to 0.0.0.0:8081 [socket] Binding to 0.0.0.0:8080 [socket] SO_REUSEPORT enabled for load balancing +[socket] SO_REUSEPORT enabled for load balancing +listening on http://localhost:8081/ listening on http://localhost:8080/ diff --git a/site/static/logs/upload/32/vanilla-epoll.log b/site/static/logs/upload/32/vanilla-epoll.log index 806e2188d..029eef843 100644 --- a/site/static/logs/upload/32/vanilla-epoll.log +++ b/site/static/logs/upload/32/vanilla-epoll.log @@ -1,3 +1,6 @@ [socket] SO_REUSEPORT enabled for load balancing +[socket] Binding to 0.0.0.0:8081 [socket] Binding to 0.0.0.0:8080 +[socket] SO_REUSEPORT enabled for load balancing listening on http://localhost:8080/ +listening on http://localhost:8081/