e0e362d700
SDK Tests / changes (push) Successful in 2m29s
Real E2E Tests / changes (push) Successful in 2m29s
Deploy Docs Pages / build (push) Has been cancelled
Deploy Docs Pages / deploy (push) Has been cancelled
Real E2E Tests / JavaScript E2E (docker bridge) (push) Has been cancelled
Real E2E Tests / Python E2E (docker bridge) (push) Has been cancelled
Real E2E Tests / Java E2E (docker bridge) (push) Has been cancelled
Real E2E Tests / C# E2E (docker bridge) (push) Has been cancelled
Real E2E Tests / Go E2E (docker bridge) (push) Has been cancelled
Real E2E Tests / Real E2E CI (push) Has been cancelled
SDK Tests / SDK CI (push) Has been cancelled
SDK Tests / CLI Tests (push) Has been cancelled
SDK Tests / Python SDK Quality (code-interpreter) (push) Has been cancelled
SDK Tests / Python SDK Quality (sandbox) (push) Has been cancelled
SDK Tests / Python SDK Tests (code-interpreter) (push) Has been cancelled
SDK Tests / JavaScript SDK Quality And Tests (code-interpreter) (push) Has been cancelled
SDK Tests / JavaScript SDK Quality And Tests (sandbox) (push) Has been cancelled
SDK Tests / Python SDK Tests (sandbox) (push) Has been cancelled
SDK Tests / CLI Quality (push) Has been cancelled
SDK Tests / Kotlin SDK Quality And Tests (sandbox) (push) Has been cancelled
SDK Tests / Kotlin SDK Quality And Tests (code-interpreter) (push) Has been cancelled
SDK Tests / C# SDK Quality And Tests (code-interpreter) (push) Has been cancelled
SDK Tests / C# SDK Quality And Tests (sandbox) (push) Has been cancelled
SDK Tests / Go SDK Quality And Tests (push) Has been cancelled
85 lines
3.9 KiB
Markdown
85 lines
3.9 KiB
Markdown
# Egress benchmark
|
||
|
||
**Prerequisites**: Docker, `curl` on the host. Domains: [`tests/hostname.txt`](../tests/hostname.txt) (one hostname per line; `#` and blank lines ignored). Run from `components/egress` or adjust paths.
|
||
|
||
---
|
||
|
||
## 1. `bench-dns-nft.sh`
|
||
|
||
**Compares**: plain **`curl`** container (**baseline**) → egress **`dns`** → egress **`dns+nft`**. Prints **Req/s**, **Avg**, **P50**, **P99**; percentages are vs **baseline**.
|
||
|
||
### Run
|
||
|
||
```bash
|
||
cd components/egress
|
||
./tests/bench-dns-nft.sh
|
||
```
|
||
|
||
Builds `opensandbox/egress:local` unless you set **`IMG=...`**. Optional: **`BENCH_SAMPLE_SIZE=n`** to use `n` random domains.
|
||
|
||
### View results
|
||
|
||
- **Terminal**: summary table at end.
|
||
- **Host `/tmp`**: `bench-e2e-baseline-total.txt`, `bench-e2e-dns-total.txt`, `bench-e2e-dns+nft-total.txt` (one **`time_total`** per line); `bench-e2e-{mode}-namelookup.txt`, `bench-e2e-{mode}-wall.txt`.
|
||
|
||
---
|
||
|
||
## 2. `bench-mitm-overhead.sh`
|
||
|
||
**Compares**: **`dns+nft`** without MITM vs **`dns+nft` + transparent mitmproxy**. Default **`BENCH_SCENARIOS=short,download`** — **`short`** = many HTTPS **HEAD**s; **`download`** = parallel **GET** to **`BENCH_DOWNLOAD_URL`** (default Cloudflare `__down` ~20 MiB).
|
||
|
||
### Run
|
||
|
||
```bash
|
||
cd components/egress
|
||
./tests/bench-mitm-overhead.sh
|
||
```
|
||
|
||
**`SKIP_BUILD=1`** skips image build; **`IMG`** is at the top of the script. One scenario only, e.g. **`BENCH_SCENARIOS=short`** or **`=download`**.
|
||
|
||
### View results
|
||
|
||
- **Terminal**: tables per scenario (latency / throughput vs no-MITM), plus **`E2E latency loss (avg time_total)`** in **ms/request** and **%**.
|
||
- **Host `/tmp`**:
|
||
- Latency artifacts: `bench-mitm-*-short-*.txt`, `*-download-*.tsv`, `*-wall.txt`, etc.
|
||
- **Container metrics** (always written): `bench-mitm-docker-stats-dns_nft.tsv`, `bench-mitm-docker-stats-dns_nft_mitm.tsv` — `unix_ts`, **`/proc/loadavg`** (load1/5/15, …), **`docker stats`** (CPUPerc, MemUsage, …). *`loadavg` inside the container often tracks the host; use for relative trends.*
|
||
|
||
---
|
||
|
||
## 3. Reference baselines (example runs)
|
||
|
||
Illustrative only — **same machine, same script**, not a SLA. **MITM** row = **`dns+nft` + transparent mitm**.
|
||
|
||
### `BENCH_SCENARIOS=download` (parallel GET, ~20 MiB, 4 streams, 1 round, 1 s sampling)
|
||
|
||
| Metric | `dns+nft` | + mitm |
|
||
|--------|-----------|--------|
|
||
| **CPUPerc** (docker) | Mostly **~2–5%**, max **~5.6%** | Often **~5–11%**, max **~10.9%** |
|
||
| **MemUsage** | **~9–18 MiB** | **~68–91 MiB** |
|
||
| **load1** | Up to **~0.23** | Spike **~0.66**, then **~0.4–0.6** |
|
||
|
||
**Takeaway**: ~**2×** peak CPU% and ~**5×** RSS vs no MITM in this trace.
|
||
|
||
### `BENCH_SCENARIOS=short` (HEAD storm; **sparse** rows if the phase is short)
|
||
|
||
Run profile (sample): `10 rounds × 40 URLs × 1 inflight = 400 requests`.
|
||
|
||
| Metric | `dns+nft` | + mitm |
|
||
|--------|-----------|--------|
|
||
| **Req/s** | **3.64** | **1.90** (**-47.6%**) |
|
||
| **Avg latency (time_total)** | **0.315 s** | **0.605 s** (**+91.9%**) |
|
||
| **P50 latency** | **0.136 s** | **0.143 s** (**+5.2%**) |
|
||
| **P99 latency** | **1.439 s** | **10.006 s** (**+595.2%**) |
|
||
| **E2E latency loss (avg)** | baseline | **+289.88 ms/request (+91.95%)** |
|
||
|
||
| Metric | `dns+nft` | + mitm |
|
||
|--------|-----------|--------|
|
||
| **CPUPerc** | Hot sample **~132%** | Hot sample **~232%** |
|
||
| **MemUsage** | **~6–10 MiB** | **~58–88 MiB** |
|
||
|
||
**`CPUPerc` > 100%** on multi-core is normal (container can use more than one core-equivalent per Docker’s metric).
|
||
|
||
**Takeaway**: this sample shows clear request-side overhead from transparent MITM, about **+289.88 ms/request** on average with throughput dropping to about half. `P50` is close to baseline while `P99` grows sharply, indicating tail-latency amplification. With only **40 requests**, tail metrics are timing-sensitive; use more rounds or more domains for stable P99.
|
||
|
||
CPU/memory trend remains consistent: peak CPU sample **~1.8×** (**232/132**), and RSS is much higher with mitmdump. For denser host/container telemetry, use longer runs or **`BENCH_DOCKER_STATS_INTERVAL=0.5`**.
|