diff --git a/frameworks/aegon/CMakeLists.txt b/frameworks/aegon/CMakeLists.txt new file mode 100644 index 000000000..a71ea7117 --- /dev/null +++ b/frameworks/aegon/CMakeLists.txt @@ -0,0 +1,24 @@ +cmake_minimum_required(VERSION 3.25) +project(aegon_arena LANGUAGES CXX) + +set(CMAKE_CXX_STANDARD 26) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") + add_compile_options(-O3 -march=native -Wall -Wextra) +endif() + +find_package(Aegon REQUIRED) +find_package(glaze REQUIRED) +find_package(Threads REQUIRED) + +add_executable(aegon-arena main.cpp) + +target_link_libraries(aegon-arena PRIVATE + Aegon::http + Aegon::core + Aegon::config + glaze::glaze + Threads::Threads +) diff --git a/frameworks/aegon/Dockerfile b/frameworks/aegon/Dockerfile new file mode 100644 index 000000000..3b2e4ad11 --- /dev/null +++ b/frameworks/aegon/Dockerfile @@ -0,0 +1,55 @@ +FROM archlinux:latest AS build + +RUN pacman -Syu --noconfirm --needed \ + base-devel \ + cmake \ + ninja \ + git \ + liburing \ + glaze \ + openssl \ + libdeflate \ + sqlite \ + postgresql-libs + +ARG AEGON_REPO=https://github.com/UdayKhare09/Aegon.git +ARG AEGON_REF=main +ARG AEGON_COMMIT=f9edfc3 + +WORKDIR /src +RUN echo "Building Aegon commit: ${AEGON_COMMIT}" && \ + git clone --depth 1 --branch "${AEGON_REF}" "${AEGON_REPO}" aegon-src + +WORKDIR /src/aegon-src +RUN cmake -B build -G Ninja \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr/local && \ + cmake --build build --target aegon_core aegon_config aegon_redis aegon_memory aegon_orm aegon_http aegon_gateway aegon_cli -j$(nproc) && \ + cmake --install build + +WORKDIR /app +COPY CMakeLists.txt main.cpp ./ +RUN cmake -B build -G Ninja \ + -DCMAKE_BUILD_TYPE=Release && \ + cmake --build build -j$(nproc) + +FROM archlinux:latest + +RUN pacman -Syu --noconfirm --needed \ + liburing \ + openssl \ + libdeflate \ + sqlite \ + postgresql-libs \ + jemalloc && \ + pacman -Scc --noconfirm + +ENV LD_PRELOAD=/usr/lib/libjemalloc.so +ENV LD_LIBRARY_PATH=/usr/local/lib + +COPY --from=build /usr/local/lib/ /usr/local/lib/ +COPY --from=build /app/build/aegon-arena /usr/local/bin/aegon-arena + +EXPOSE 8080 8081 8082 8443 8443/udp + +CMD ["/usr/local/bin/aegon-arena"] diff --git a/frameworks/aegon/README.md b/frameworks/aegon/README.md new file mode 100644 index 000000000..5c01ee2f3 --- /dev/null +++ b/frameworks/aegon/README.md @@ -0,0 +1,52 @@ +# aegon + +[Aegon](https://github.com/UdayKhare09/Aegon) is a Linux-native C++26 asynchronous web framework powered by `io_uring` multishot primitives, coroutines, stepped SIMD vectorization, and compile-time data engines. + +## Stack + +- **Language:** C++26 (GCC 14) +- **Engine:** Linux `io_uring` multishot accept/recv, provided buffer rings +- **Serialization:** Glaze (compile-time reflection, zero-copy JSON) +- **Compression:** `libdeflate` gzip/deflate streaming middleware +- **Crypto & TLS:** OpenSSL with ALPN (`h2`, `http/1.1`) +- **WebSocket:** RFC 6455 frame parser with AVX2 SIMD payload unmasking and fast-path batched echo engine +- **Build:** CMake with Ninja on Arch Linux + +## Endpoints + +| Endpoint | Method | Protocol | Description | +|---|---|---|---| +| `/pipeline` | GET | HTTP/1.1 | Pipelined plaintext response (`ok`) | +| `/baseline11` | GET | HTTP/1.1 | Fast query string parameter summation | +| `/baseline11` | POST | HTTP/1.1 | Sums query parameters and request body | +| `/baseline2` | GET | HTTP/2 | Baseline query summation over HTTP/2 | +| `/baseline2` | POST | HTTP/2 | Baseline query + body summation over HTTP/2 | +| `/delay/:ms` | GET | HTTP/1.1 | Non-blocking asynchronous delay via `io_uring` timer coroutine | +| `/json/:count?m=N` | GET | HTTP/1.1 & HTTP/2 | Zero-copy Glaze JSON serialization with `libdeflate` compression | +| `/echo` | POST | TLS | 8Gbit verbatim binary stream echo | +| `/static/*` | GET | TLS, HTTP/2 & HTTP/3 | High-throughput static file delivery via `router.static_files` | +| `/ws` | Upgrade | HTTP/1.1 (RFC 6455) | Full-duplex WebSocket echo with SIMD unmasking and `io_uring` batching | + +## Ports & Protocols + +Aegon runs concurrent multi-port listeners with protocol multiplexing: + +- **Port 8080 (HTTP/1.1 Plaintext & WebSocket):** Primary plaintext and WebSocket benchmark port (`baseline`, `async`, `latency-*`, `pipelined`, `limited-conn`, `echo-ws`, `echo-ws-pipeline`, `echo-ws-limited`). +- **Port 8082 (HTTP/2 Cleartext / Prior Knowledge):** `h2c` benchmarking (`baseline-h2c`, `json-h2c`). +- **Port 8081 (HTTP/1.1 TLS):** Secure HTTP/1.1 workloads (`json-tls`, `8gbit`). +- **Port 8443 (HTTP/2 TLS & HTTP/3 QUIC / UDP):** Secure HTTP/2 and HTTP/3 workloads (`baseline-h2`, `static-h2`, `baseline-h3`, `static-h3`). + +## Completeness & Features + +Aegon qualifies for 4/4 Completeness (100%, multiplier ×1.00): +- **Routing:** Parameterized path matching (`:ms`, `:count`), static prefix tree matching (`/static/*`), RFC 6455 WebSocket routes (`/ws`) with automatic `426 Upgrade Required` fallback. +- **Middleware:** Composable request/response middleware chain with streaming compression (`Compress`). +- **Request:** Zero-copy URI decoding, query parsing, header lookup, route params, body handling. +- **Response:** Fluent response builder, custom status codes, headers, streaming, and direct Glaze JSON serialization. + +## Concurrency & CPU Sizing + +Worker thread allocation dynamically inspects container resource constraints: +- Evaluates cgroup v2 (`/sys/fs/cgroup/cpu.max`) and cgroup v1 CFS bandwidth quotas. +- Evaluates CPU affinity masks (`sched_getaffinity`). +- Falls back to hardware concurrency, guaranteeing at least one worker and avoiding thread over-subscription under restricted CPU quotas (e.g., `latency-500k-8cpu`). diff --git a/frameworks/aegon/main.cpp b/frameworks/aegon/main.cpp new file mode 100644 index 000000000..d0db7f93e --- /dev/null +++ b/frameworks/aegon/main.cpp @@ -0,0 +1,327 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace aegon::http; + +namespace { + +struct Rating { + int64_t score{0}; + int64_t count{0}; +}; + +struct DatasetItem { + int64_t id{0}; + std::string name; + std::string category; + int64_t price{0}; + int64_t quantity{0}; + bool active{false}; + std::vector tags; + Rating rating; +}; + +// Zero-copy view into dataset item with per-request total calculation +struct ProcessedItem { + int64_t id{0}; + std::string_view name; + std::string_view category; + int64_t price{0}; + int64_t quantity{0}; + int64_t total{0}; + bool active{false}; + std::span tags; + Rating rating; +}; + +struct JsonPayload { + int count{0}; + std::span items; +}; + +static std::vector g_dataset; +inline thread_local std::array tls_processed_items; + +static void load_dataset() { + std::vector paths = { + "/data/dataset.json", + "data/dataset.json", + "../data/dataset.json" + }; + + std::string content; + for (const auto& p : paths) { + std::ifstream f(p); + if (f.is_open()) { + std::ostringstream ss; + ss << f.rdbuf(); + content = ss.str(); + break; + } + } + + if (content.empty()) { + std::cerr << "Warning: Could not open dataset.json" << std::endl; + return; + } + + auto ec = glz::read_json(g_dataset, content); + if (ec) { + std::cerr << "Failed to parse dataset.json: " << glz::format_error(ec, content) << std::endl; + } +} + +void handle_baseline_get(Context& ctx) { + int64_t sum = 0; + std::string_view q = ctx.req().query(); + while (!q.empty()) { + size_t amp = q.find('&'); + std::string_view pair = (amp != std::string_view::npos) ? q.substr(0, amp) : q; + size_t eq = pair.find('='); + if (eq != std::string_view::npos) { + int64_t val = 0; + std::from_chars(pair.data() + eq + 1, pair.data() + pair.size(), val); + sum += val; + } + if (amp == std::string_view::npos) break; + q.remove_prefix(amp + 1); + } + char buf[32]; + auto [p, _] = std::to_chars(buf, buf + sizeof(buf), sum); + ctx.res().text(std::string_view(buf, p - buf)); +} + +void handle_baseline_post(Context& ctx) { + int64_t sum = 0; + std::string_view q = ctx.req().query(); + while (!q.empty()) { + size_t amp = q.find('&'); + std::string_view pair = (amp != std::string_view::npos) ? q.substr(0, amp) : q; + size_t eq = pair.find('='); + if (eq != std::string_view::npos) { + int64_t val = 0; + std::from_chars(pair.data() + eq + 1, pair.data() + pair.size(), val); + sum += val; + } + if (amp == std::string_view::npos) break; + q.remove_prefix(amp + 1); + } + std::string_view body = ctx.req().body(); + while (!body.empty() && std::isspace(static_cast(body.front()))) body.remove_prefix(1); + while (!body.empty() && std::isspace(static_cast(body.back()))) body.remove_suffix(1); + if (!body.empty()) { + int64_t body_val = 0; + auto [ptr, ec] = std::from_chars(body.data(), body.data() + body.size(), body_val); + if (ec == std::errc()) { + sum += body_val; + } + } + char buf[32]; + auto [p, _] = std::to_chars(buf, buf + sizeof(buf), sum); + ctx.res().text(std::string_view(buf, p - buf)); +} + +aegon::core::Task handle_delay(Context& ctx) { + uint64_t ms = 0; + if (auto ms_str = ctx.req().param("ms")) { + std::from_chars(ms_str->data(), ms_str->data() + ms_str->size(), ms); + } + if (ms > 0) { + co_await aegon::core::EventLoop::current()->ring().timeout(ms * 1'000'000ULL); + } + char buf[32]; + auto [p, _] = std::to_chars(buf, buf + sizeof(buf), ms); + ctx.res().text(std::string_view(buf, p - buf)); +} + +void register_routes(Router& router) { + // 1. Pipeline endpoint + router.get("/pipeline", [](Context& ctx) { + ctx.res().text("ok"); + }); + + // 2. Baseline endpoints (HTTP/1.1) + router.get("/baseline11", handle_baseline_get); + router.post("/baseline11", handle_baseline_post); + + // 3. Baseline endpoints (HTTP/2) + router.get("/baseline2", handle_baseline_get); + router.post("/baseline2", handle_baseline_post); + + // 4. Async delay endpoint (non-blocking io_uring timeout coroutine) + router.get("/delay/:ms", handle_delay); + + // 5. JSON serialization & compression endpoint (zero-copy view) + router.get("/json/:count", {aegon::http::middleware::Compress({ + .min_size = 64, + .gzip = true, + .deflate = true, + .prefer_deflate = false + })}, [](Context& ctx) { + size_t count = 0; + if (auto count_str = ctx.req().param("count")) { + std::from_chars(count_str->data(), count_str->data() + count_str->size(), count); + } + int64_t m = 1; + if (auto m_str = ctx.req().query_param("m")) { + std::from_chars(m_str->data(), m_str->data() + m_str->size(), m); + } + + size_t n = std::min(count, std::min(g_dataset.size(), tls_processed_items.size())); + for (size_t i = 0; i < n; ++i) { + const auto& d = g_dataset[i]; + tls_processed_items[i] = ProcessedItem{ + .id = d.id, + .name = d.name, + .category = d.category, + .price = d.price, + .quantity = d.quantity, + .total = d.price * d.quantity * m, + .active = d.active, + .tags = std::span(d.tags.data(), d.tags.size()), + .rating = d.rating + }; + } + + JsonPayload payload{ + .count = static_cast(n), + .items = std::span(tls_processed_items.data(), n) + }; + ctx.res().json(payload); + }); + + // 6. Echo endpoint (8gbit) + router.post("/echo", [](Context& ctx) { + ctx.res().header("Content-Type", "application/octet-stream"); + ctx.res().body(std::string(ctx.req().body())); + }); + + // 7. Static file serving (static-h2, static-h3) - Aegon core static_files API + const char* static_dir = std::filesystem::exists("/data/static") ? "/data/static" : "data/static"; + router.static_files("/static", static_dir); + + // 8. WebSocket Echo endpoint + router.ws("/ws"); +} + +unsigned int cgroup_cpus() { + unsigned int quota_limit = 0; + + // 1. cgroup v2: /sys/fs/cgroup/cpu.max contains " " or "max " + { + std::ifstream f("/sys/fs/cgroup/cpu.max"); + if (f.is_open()) { + std::string quota, period; + if (f >> quota >> period && quota != "max" && !period.empty()) { + long long q = std::strtoll(quota.c_str(), nullptr, 10); + long long p = std::strtoll(period.c_str(), nullptr, 10); + if (p > 0 && q > 0) { + quota_limit = static_cast(q / p); + } + } + } + } + + // 2. cgroup v1: /sys/fs/cgroup/cpu/cpu.cfs_quota_us and cpu.cfs_period_us + if (quota_limit == 0) { + std::ifstream qf("/sys/fs/cgroup/cpu/cpu.cfs_quota_us"); + std::ifstream pf("/sys/fs/cgroup/cpu/cpu.cfs_period_us"); + if (qf.is_open() && pf.is_open()) { + long long q = -1, p = -1; + if (qf >> q && pf >> p && q > 0 && p > 0) { + quota_limit = static_cast(q / p); + } + } + } + + // 3. CPU affinity mask (e.g. taskset or container cpuset) + unsigned int affinity_limit = 0; + cpu_set_t cs; + CPU_ZERO(&cs); + if (sched_getaffinity(0, sizeof(cs), &cs) == 0) { + int count = CPU_COUNT(&cs); + if (count > 0) { + affinity_limit = static_cast(count); + } + } + + // 4. Fallback to hardware concurrency + unsigned int hw = std::thread::hardware_concurrency(); + if (hw == 0) hw = 1; + + unsigned int effective = hw; + if (affinity_limit > 0 && affinity_limit < effective) { + effective = affinity_limit; + } + if (quota_limit > 0 && quota_limit < effective) { + effective = quota_limit; + } + + return std::max(1u, effective); +} + +} // namespace + +int main() { + load_dataset(); + + unsigned int threads = cgroup_cpus(); + + const std::string certFile = "/certs/server.crt"; + const std::string keyFile = "/certs/server.key"; + bool has_certs = std::filesystem::exists(certFile) && std::filesystem::exists(keyFile); + + struct rlimit rl{}; + bool low_memlock = false; + if (getrlimit(RLIMIT_MEMLOCK, &rl) == 0 && rl.rlim_cur != RLIM_INFINITY && rl.rlim_cur < 64 * 1024 * 1024) { + low_memlock = true; + } + + Server server; + if (low_memlock) { + server.ring_entries(512); + server.buffer_pool_entries(256); + } else { + server.ring_entries(8192); + server.buffer_pool_entries(16384); + } + register_routes(server.router()); + + // Port 8080: Plaintext HTTP/1.1 (main benchmarks) + server.listen(8080); + // Port 8082: Plaintext HTTP/2 prior-knowledge (baseline-h2c, json-h2c) + server.listen(8082); + + if (has_certs) { + server.enable_tls(certFile, keyFile); + server.enable_http3(true); + // Port 8081: TLS HTTP/1.1 (json-tls, 8gbit) + server.listen_tls(8081); + // Port 8443: TLS HTTP/2 & HTTP/3 (baseline-h2, static-h2, baseline-h3, static-h3) + server.listen_tls(8443); + } + + server.run(threads); + + return 0; +} diff --git a/frameworks/aegon/meta.json b/frameworks/aegon/meta.json new file mode 100644 index 000000000..dc6ab96ad --- /dev/null +++ b/frameworks/aegon/meta.json @@ -0,0 +1,41 @@ +{ + "display_name": "aegon", + "language": "C++", + "type": "experimental", + "mode": "standard", + "engine": "io_uring", + "completeness": { + "routing": true, + "middleware": true, + "request": true, + "response": true + }, + "description": "Linux-native C++26 asynchronous web framework powered by io_uring multishot primitives, coroutines, stepped SIMD vectorization, and Glaze JSON serialization.", + "repo": "https://github.com/UdayKhare09/Aegon", + "enabled": true, + "tests": [ + "baseline", + "async", + "latency-1m", + "latency-10k", + "latency-500k-8cpu", + "pipelined", + "limited-conn", + "json-tls", + "json-comp", + "8gbit", + "static-tls", + "baseline-h2", + "baseline-h2c", + "json-h2c", + "static-h2", + "baseline-h3", + "static-h3", + "echo-ws", + "echo-ws-pipeline", + "echo-ws-limited" + ], + "maintainers": [ + "UdayKhare09" + ] +} \ No newline at end of file diff --git a/site/data/frameworks.json b/site/data/frameworks.json index c5a76e1de..163d12ef9 100644 --- a/site/data/frameworks.json +++ b/site/data/frameworks.json @@ -37,6 +37,20 @@ } ] }, + "aegon": { + "dir": "aegon", + "description": "Linux-native C++26 asynchronous web framework powered by io_uring multishot primitives, coroutines, stepped SIMD vectorization, and Glaze JSON serialization.", + "repo": "https://github.com/UdayKhare09/Aegon", + "type": "experimental", + "engine": "io_uring", + "mode": "standard", + "completeness": { + "routing": true, + "middleware": true, + "request": true, + "response": true + } + }, "aiohttp": { "dir": "aiohttp", "description": "aiohttp 3.14 web server on uvloop, one forked worker per core sharing the port with SO_REUSEPORT. Routing through the aiohttp router, JSON through web.json_response, gzip through the built-in response compression.", diff --git a/site/data/results/aegon.json b/site/data/results/aegon.json new file mode 100644 index 000000000..40e96bd80 --- /dev/null +++ b/site/data/results/aegon.json @@ -0,0 +1,620 @@ +{ + "framework": "aegon", + "results": { + "8gbit-512": { + "framework": "aegon", + "language": "C++", + "rps": 49360, + "avg_latency": "119.6us", + "p99_latency": "170.0us", + "cpu": "315.1%", + "memory": "4.2GiB", + "connections": 512, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "512.11MB/s", + "input_bw": "482.03MB/s", + "reconnects": 0, + "status_2xx": 246870, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0, + "cpu_usec": 17256110, + "cpu_per_req_us": 69.8996, + "target_rate": 50000, + "rate_ratio": 0.9872, + "p99_9_latency": "3921.0us" + }, + "async-32000": { + "framework": "aegon", + "language": "C++", + "rps": 1816298, + "avg_latency": "17.50ms", + "p99_latency": "19.80ms", + "cpu": "3430.1%", + "memory": "4.6GiB", + "connections": 32000, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "114.30MB/s", + "input_bw": "83.14MB/s", + "reconnects": 0, + "status_2xx": 18162984, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "baseline-4096": { + "framework": "aegon", + "language": "C++", + "rps": 4231339, + "avg_latency": "973us", + "p99_latency": "1.46ms", + "cpu": "6184.5%", + "memory": "4.2GiB", + "connections": 4096, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "266.26MB/s", + "input_bw": "326.86MB/s", + "reconnects": 0, + "status_2xx": 21156695, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "baseline-h2-1024": { + "framework": "aegon", + "language": "C++", + "rps": 14496356, + "avg_latency": "3.63ms", + "p99_latency": "96.67ms", + "cpu": "4690.4%", + "memory": "4.3GiB", + "connections": 1024, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "363.05MB/s", + "reconnects": 0, + "status_2xx": 73206600, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "baseline-h2-256": { + "framework": "aegon", + "language": "C++", + "rps": 14543836, + "avg_latency": "1.13ms", + "p99_latency": "7.29ms", + "cpu": "4512.5%", + "memory": "4.2GiB", + "connections": 256, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "362.79MB/s", + "reconnects": 0, + "status_2xx": 73155500, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "baseline-h2c-1024": { + "framework": "aegon", + "language": "C++", + "rps": 15706739, + "avg_latency": "3.37ms", + "p99_latency": "15.29ms", + "cpu": "4308.3%", + "memory": "4.2GiB", + "connections": 1024, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "378.98MB/s", + "reconnects": 0, + "status_2xx": 79476100, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "baseline-h2c-256": { + "framework": "aegon", + "language": "C++", + "rps": 14653976, + "avg_latency": "1.04ms", + "p99_latency": "6.88ms", + "cpu": "3988.5%", + "memory": "4.2GiB", + "connections": 256, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "351.48MB/s", + "reconnects": 0, + "status_2xx": 73709500, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "baseline-h2c-4096": { + "framework": "aegon", + "language": "C++", + "rps": 14766424, + "avg_latency": "14.34ms", + "p99_latency": "45.60ms", + "cpu": "4250.3%", + "memory": "4.4GiB", + "connections": 4096, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "358.43MB/s", + "reconnects": 0, + "status_2xx": 75161100, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "baseline-h3-64": { + "framework": "aegon", + "language": "C++", + "rps": 3342752, + "avg_latency": "1.46ms", + "p99_latency": "3.24ms", + "cpu": "3763.2%", + "memory": "4.2GiB", + "connections": 64, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "51.06MB/s", + "reconnects": 0, + "status_2xx": 16747192, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "echo-ws-16384": { + "framework": "aegon", + "language": "C++", + "rps": 4039162, + "avg_latency": "4.04ms", + "p99_latency": "5.33ms", + "cpu": "6134.6%", + "memory": "4.6GiB", + "connections": 16384, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "27.36MB/s", + "reconnects": 0, + "status_2xx": 20195810, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "echo-ws-4096": { + "framework": "aegon", + "language": "C++", + "rps": 4371217, + "avg_latency": "936us", + "p99_latency": "1.25ms", + "cpu": "6191.1%", + "memory": "4.2GiB", + "connections": 4096, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "29.18MB/s", + "reconnects": 0, + "status_2xx": 21856089, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "echo-ws-512": { + "framework": "aegon", + "language": "C++", + "rps": 4102815, + "avg_latency": "124us", + "p99_latency": "214us", + "cpu": "6428.3%", + "memory": "4.1GiB", + "connections": 512, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "27.39MB/s", + "reconnects": 0, + "status_2xx": 20514079, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "echo-ws-limited-4096": { + "framework": "aegon", + "language": "C++", + "rps": 2529153, + "avg_latency": "1.06ms", + "p99_latency": "1.78ms", + "cpu": "6098.3%", + "memory": "4.3GiB", + "connections": 4096, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "48.00MB/s", + "reconnects": 1264505, + "status_2xx": 12645769, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "echo-ws-limited-512": { + "framework": "aegon", + "language": "C++", + "rps": 2171092, + "avg_latency": "126us", + "p99_latency": "374us", + "cpu": "5526.2%", + "memory": "4.2GiB", + "connections": 512, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "41.19MB/s", + "reconnects": 1085597, + "status_2xx": 10855461, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "echo-ws-pipeline-16384": { + "framework": "aegon", + "language": "C++", + "rps": 61827241, + "avg_latency": "4.22ms", + "p99_latency": "5.19ms", + "cpu": "6421.7%", + "memory": "4.6GiB", + "connections": 16384, + "threads": 64, + "duration": "5s", + "pipeline": 16, + "bandwidth": "412.97MB/s", + "reconnects": 0, + "status_2xx": 309136208, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "echo-ws-pipeline-4096": { + "framework": "aegon", + "language": "C++", + "rps": 67059395, + "avg_latency": "977us", + "p99_latency": "1.30ms", + "cpu": "6441.9%", + "memory": "4.2GiB", + "connections": 4096, + "threads": 64, + "duration": "5s", + "pipeline": 16, + "bandwidth": "447.49MB/s", + "reconnects": 0, + "status_2xx": 335296976, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "echo-ws-pipeline-512": { + "framework": "aegon", + "language": "C++", + "rps": 62172707, + "avg_latency": "131us", + "p99_latency": "261us", + "cpu": "6280.6%", + "memory": "4.1GiB", + "connections": 512, + "threads": 64, + "duration": "5s", + "pipeline": 16, + "bandwidth": "414.83MB/s", + "reconnects": 0, + "status_2xx": 310863535, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "json-comp-16384": { + "framework": "aegon", + "language": "C++", + "rps": 954659, + "avg_latency": "17.05ms", + "p99_latency": "24.20ms", + "cpu": "6777.0%", + "memory": "4.5GiB", + "connections": 16384, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "1.33GB/s", + "input_bw": "71.01MB/s", + "reconnects": 183039, + "status_2xx": 4773296, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "json-comp-4096": { + "framework": "aegon", + "language": "C++", + "rps": 985154, + "avg_latency": "4.11ms", + "p99_latency": "8.81ms", + "cpu": "6787.7%", + "memory": "4.2GiB", + "connections": 4096, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "1.38GB/s", + "input_bw": "73.28MB/s", + "reconnects": 195503, + "status_2xx": 4925773, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "json-h2c-1024": { + "framework": "aegon", + "language": "C++", + "rps": 3680638, + "avg_latency": "8.56ms", + "p99_latency": "22.21ms", + "cpu": "6492.8%", + "memory": "4.4GiB", + "connections": 1024, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "12.32GB/s", + "reconnects": 0, + "status_2xx": 18660838, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "json-h2c-4096": { + "framework": "aegon", + "language": "C++", + "rps": 3109662, + "avg_latency": "40.78ms", + "p99_latency": "87.74ms", + "cpu": "6335.4%", + "memory": "5.3GiB", + "connections": 4096, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "10.42GB/s", + "reconnects": 0, + "status_2xx": 15797088, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "json-tls-4096": { + "framework": "aegon", + "language": "C++", + "rps": 1334245, + "avg_latency": "3.02ms", + "p99_latency": "67.12ms", + "cpu": "6589.2%", + "memory": "4.8GiB", + "connections": 4096, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "4.53GB", + "reconnects": 0, + "status_2xx": 6805719, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "latency-10k-1024": { + "framework": "aegon", + "language": "C++", + "rps": 9983, + "avg_latency": "68.1us", + "p99_latency": "98.0us", + "cpu": "28.7%", + "memory": "4.1GiB", + "connections": 1024, + "threads": 64, + "duration": "20s", + "pipeline": 1, + "bandwidth": "0.65MB/s", + "reconnects": 0, + "status_2xx": 199674, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0, + "cpu_usec": 6011326, + "cpu_per_req_us": 30.1057, + "target_rate": 10000, + "rate_ratio": 0.9983, + "p99_9_latency": "252.0us" + }, + "latency-1m-1024": { + "framework": "aegon", + "language": "C++", + "rps": 997803, + "avg_latency": "89.8us", + "p99_latency": "163.0us", + "cpu": "2350.1%", + "memory": "4.1GiB", + "connections": 1024, + "threads": 64, + "duration": "20s", + "pipeline": 1, + "bandwidth": "64.86MB/s", + "reconnects": 0, + "status_2xx": 19959195, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0, + "cpu_usec": 426630871, + "cpu_per_req_us": 21.3752, + "target_rate": 1000000, + "rate_ratio": 0.9978, + "p99_9_latency": "1132.0us" + }, + "latency-500k-8cpu-1024": { + "framework": "aegon", + "language": "C++", + "rps": 495918, + "avg_latency": "58087.6us", + "p99_latency": "780032.0us", + "cpu": "833.7%", + "memory": "555MiB", + "connections": 1024, + "threads": 64, + "duration": "20s", + "pipeline": 1, + "bandwidth": "32.23MB/s", + "reconnects": 0, + "status_2xx": 9920240, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0, + "cpu_usec": 158461452, + "cpu_per_req_us": 15.9736, + "target_rate": 500000, + "rate_ratio": 0.9918, + "p99_9_latency": "837376.0us" + }, + "limited-conn-4096": { + "framework": "aegon", + "language": "C++", + "rps": 2661047, + "avg_latency": "1.40ms", + "p99_latency": "1.93ms", + "cpu": "6078.0%", + "memory": "4.2GiB", + "connections": 4096, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "167.43MB/s", + "input_bw": "205.56MB/s", + "reconnects": 1330051, + "status_2xx": 13305239, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "pipelined-4096": { + "framework": "aegon", + "language": "C++", + "rps": 43291308, + "avg_latency": "1.51ms", + "p99_latency": "1.99ms", + "cpu": "6640.6%", + "memory": "4.2GiB", + "connections": 4096, + "threads": 64, + "duration": "5s", + "pipeline": 16, + "bandwidth": "2.66GB/s", + "reconnects": 0, + "status_2xx": 216456544, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "static-h2-1024": { + "framework": "aegon", + "language": "C++", + "rps": 487518, + "avg_latency": "64.09ms", + "p99_latency": "158.49ms", + "cpu": "6502.3%", + "memory": "5.0GiB", + "connections": 1024, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "7.51GB/s", + "reconnects": 0, + "status_2xx": 2471720, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "static-h2-256": { + "framework": "aegon", + "language": "C++", + "rps": 555333, + "avg_latency": "15.76ms", + "p99_latency": "43.37ms", + "cpu": "6699.8%", + "memory": "4.4GiB", + "connections": 256, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "8.48GB/s", + "reconnects": 0, + "status_2xx": 2793327, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "static-h3-64": { + "framework": "aegon", + "language": "C++", + "rps": 304544, + "avg_latency": "15.70ms", + "p99_latency": "33.63ms", + "cpu": "4315.8%", + "memory": "4.3GiB", + "connections": 64, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "4.63GB/s", + "reconnects": 0, + "status_2xx": 1525769, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "static-tls-1024": { + "framework": "aegon", + "language": "C++", + "rps": 529259, + "avg_latency": "2.17ms", + "p99_latency": "36.06ms", + "cpu": "6713.5%", + "memory": "4.5GiB", + "connections": 1024, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "8.09GB", + "reconnects": 0, + "status_2xx": 2699242, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + } + } +} diff --git a/site/data/tls/aegon.json b/site/data/tls/aegon.json new file mode 100644 index 000000000..99d985481 --- /dev/null +++ b/site/data/tls/aegon.json @@ -0,0 +1,5 @@ +{ + "framework": "aegon", + "tls": "pass", + "check": "none" +} diff --git a/site/static/logs/8gbit/512/aegon.log b/site/static/logs/8gbit/512/aegon.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/async/32000/aegon.log b/site/static/logs/async/32000/aegon.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/baseline-h2/1024/aegon.log b/site/static/logs/baseline-h2/1024/aegon.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/baseline-h2/256/aegon.log b/site/static/logs/baseline-h2/256/aegon.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/baseline-h2c/1024/aegon.log b/site/static/logs/baseline-h2c/1024/aegon.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/baseline-h2c/256/aegon.log b/site/static/logs/baseline-h2c/256/aegon.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/baseline-h2c/4096/aegon.log b/site/static/logs/baseline-h2c/4096/aegon.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/baseline-h3/64/aegon.log b/site/static/logs/baseline-h3/64/aegon.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/baseline/4096/aegon.log b/site/static/logs/baseline/4096/aegon.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/echo-ws-limited/4096/aegon.log b/site/static/logs/echo-ws-limited/4096/aegon.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/echo-ws-limited/512/aegon.log b/site/static/logs/echo-ws-limited/512/aegon.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/echo-ws-pipeline/16384/aegon.log b/site/static/logs/echo-ws-pipeline/16384/aegon.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/echo-ws-pipeline/4096/aegon.log b/site/static/logs/echo-ws-pipeline/4096/aegon.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/echo-ws-pipeline/512/aegon.log b/site/static/logs/echo-ws-pipeline/512/aegon.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/echo-ws/16384/aegon.log b/site/static/logs/echo-ws/16384/aegon.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/echo-ws/4096/aegon.log b/site/static/logs/echo-ws/4096/aegon.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/echo-ws/512/aegon.log b/site/static/logs/echo-ws/512/aegon.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/json-comp/16384/aegon.log b/site/static/logs/json-comp/16384/aegon.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/json-comp/4096/aegon.log b/site/static/logs/json-comp/4096/aegon.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/json-h2c/1024/aegon.log b/site/static/logs/json-h2c/1024/aegon.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/json-h2c/4096/aegon.log b/site/static/logs/json-h2c/4096/aegon.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/json-tls/4096/aegon.log b/site/static/logs/json-tls/4096/aegon.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/latency-10k/1024/aegon.log b/site/static/logs/latency-10k/1024/aegon.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/latency-1m/1024/aegon.log b/site/static/logs/latency-1m/1024/aegon.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/latency-500k-8cpu/1024/aegon.log b/site/static/logs/latency-500k-8cpu/1024/aegon.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/limited-conn/4096/aegon.log b/site/static/logs/limited-conn/4096/aegon.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/pipelined/4096/aegon.log b/site/static/logs/pipelined/4096/aegon.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/static-h2/1024/aegon.log b/site/static/logs/static-h2/1024/aegon.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/static-h2/256/aegon.log b/site/static/logs/static-h2/256/aegon.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/static-h3/64/aegon.log b/site/static/logs/static-h3/64/aegon.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/static-tls/1024/aegon.log b/site/static/logs/static-tls/1024/aegon.log new file mode 100644 index 000000000..e69de29bb