Technical White Paper
150 million rules. ~70-microsecond decisions.
Enterprise and carrier-grade web filtering increasingly means combining threat-intelligence feeds, category blocklists and regulatory domain lists — aggregated, these reach tens to hundreds of millions of rules. Two questions decide whether a gateway can serve that scale: can it hold the rules at all, and is it still fast?
EnforceGate vX answers both on a single commodity machine. In our in-house benchmark it loaded and enforced 150 million domain-policy rules in under 5 GiB of memory and held its speed flat as the rule set tripled from 50M to 150M. And — measured end to end against a live engine — it adds about 70 µs to a request at the median (p99 under ~210 µs) and sustains ~68,000 policy decisions per second on a single node. The in-memory rule match is ~0.2 µs of that; the rest is the connector⇄engine round-trip — measured here, not omitted.
01 Why this matters to the business
For a CTO, the question behind a web gateway is operational risk: will the box that inspects every outbound request become the bottleneck — or the single point of failure — as policy grows? For a CSO, it is coverage and control: can we enforce the full breadth of threat-intel and category data we are paying for, on our own infrastructure, without shipping every lookup to a vendor cloud?
Most products force a trade-off. Cloud-rated filtering services keep the big database off-box but add a network round-trip — and an external dependency — to decisions they cannot answer from cache. On-box engines that try to hold large custom lists tend to slow down or run out of memory as the lists grow. EnforceGate vX is built to avoid both: the entire policy lives in memory on your node, and the match structure is designed so that lookup time does not grow with rule count.
02 The headline: 3× the rules, same speed
The result that matters is not raw capacity — it is that per-decision latency stays flat as the policy grows. Tripling the rule set from 50 million to 150 million leaves the common-case decision time essentially unchanged at roughly 0.23 µs in high-density mode. Capacity scales; latency does not.
To be precise, this ~0.2 µs is the rule-match step — the in-memory work of testing one URL against the loaded policy ("common case" = a destination not on any blocklist, the dominant pattern). It is the part that scales to 150 million rules without slowing down. But it is not the latency a request actually pays; for that you have to measure the whole decision — which is the next section.
03 The decision an operator actually pays for
The match step is the cheap part. A real request pays for the work around it: the connector reads the request, serializes a query and sends it to the engine over the encrypted defendr channel; the engine parses, matches and returns a verdict. That round-trip is the latency EnforceGate adds to a proxied request, and it is the figure you should size capacity against. We measure it directly — driving the shipping connector binary against a live engine under a concurrency sweep.
Measured end to end against a live engine, a single node sustains ~68,000 policy decisions per second, saturating at around 8 concurrent requests, with a median of ~70 µs and every percentile — up to p99.9 — staying under ~280 µs even at 64-way load.
Reading percentiles. A percentile — p50, p95, p99, p99.9 — is the latency that a given share of requests come in under. p50 is the median: half the decisions are faster, half slower. p95 and p99 describe the slow tail — 95% and 99% of decisions finish below that figure — and p99.9 is the slowest 1 in 1,000. The tail is what a user feels on a bad request, so a tight p99 / p99.9 matters more than a fast average.
What this measures — and what it doesn't. The end-to-end figure is EnforceGate's own overhead: connector read, defendr serialization, the TLS socket hop to the engine and back, engine parse, the policy match, and response build. It does not include the client TLS handshake, payload decryption, or Squid's own processing — those are OpenSSL / Squid / kernel costs, not EnforceGate's, and belong to a separate proxy-level (Gbps, wire-to-wire) benchmark.
The end-to-end sweep ran against a live 9.2M-rule policy; the match component is scale-independent (see §02), so the decision cost is essentially the same at 150 million rules.
04 A 150M-rule policy fits a modest server
High-density mode runs 150 million rules in under 5 GiB of steady-state memory — about 33 bytes per rule — and memory grows linearly and predictably with rule count. Capacity planning is a simple multiplication, with no cliffs or sudden jumps. The whole policy loads well within a 16 GiB budget, comfortably inside a single mid-range VM or appliance.
| Rules | Memory — high-density | Memory — performance | Common-case decision | On-disk policy |
|---|---|---|---|---|
| 50 million | 1.7 GiB | 4.4 GiB | 0.23 µs | 0.86 GiB |
| 100 million | 3.2 GiB | 8.8 GiB | 0.26 µs | 1.72 GiB |
| 150 million | 4.9 GiB | 15.7 GiB | 0.23 µs | 2.58 GiB |
Provisioning a fresh 150M-rule policy takes about two minutes to compile offline and one to two minutes for the engine to cold-load on start or deploy — so a deployment that runs on a small server also provisions within minutes.
05 How the approach compares
The table below contrasts EnforceGate vX with the web-gateway architectures buyers most often weigh it against: cloud-rated secure web gateways (the cloud-delivered URL-filtering services), and the open-source proxy add-ons that teams once assembled themselves — chief among them SquidGuard, a legacy project that has been long dead (its last release was in 2009). The comparison is architectural — it reflects how each approach is designed to work, not a head-to-head lab benchmark of any specific product.
| Dimension | EnforceGate vX | Cloud-rated SWG / proxy appliance (typical commercial) |
SquidGuard (legacy open source) |
|---|---|---|---|
| Where matching happens | On-box, in memory — every request decided locally | Local cache + cloud rating service for category / uncached lookups | On-box, against on-disk blacklist files |
| Large custom rule capacity | 150M rules, lab-measured, in < 5 GiB | Local/custom URL lists are bounded; broad coverage relies on the vendor cloud database | Designed for modest lists; not architected for 100M+ entries |
| Decision latency at scale | ~0.2 µs, flat as rules grow | Cache hits fast; cache/category misses incur a network round-trip to the cloud | Per-request file lookup; slows and grows memory as lists enlarge |
| External dependency at decision time | None | Cloud rating subscription for uncached / category decisions | None (you assemble and maintain the lists yourself) |
| Data residency | Fully self-hosted — traffic, policy and logs never leave your network | URL / category queries are sent to the vendor cloud | Self-hosted |
| Licensing model | By edition (Lite free) — no per-seat, per-Gbps or per-request metering | Appliance / VM tier plus throughput-bound service subscriptions | Free / open source |
| Maintenance status | Actively developed and supported by the engineers who write it | Vendor-maintained | A legacy project that is long dead — last release ~2009; not viable for new deployments |
On this comparison. The "Cloud-rated SWG / proxy appliance" column describes the typical architecture of commercial secure web gateways with cloud-delivered URL filtering, summarised from publicly available product documentation as of 2026 — not an independent benchmark of any specific product, and capabilities vary by model, platform and licence tier. EnforceGate vX figures are from the in-house benchmark described below.
06 How it was measured
So the numbers can be trusted and reproduced, the benchmark exercises the complete production path — author, compile, cold-load, enforce, and decide end to end — using the shipping parser, storage layer, match engine and connector, not a model or simplified stand-in.
- Real product code. The same components that ship in the product produced these figures.
- Realistic corpus. Rules are unique, realistically-shaped domain names, generated deterministically so any run is reproducible.
- Honest memory measurement. Memory is read from the operating system's own accounting of the engine process (resident set size), capturing both steady state and the transient load peak.
- Correctness-gated. Before any figure is accepted, the run verifies that a large random sample of rules resolves correctly and that non-rule traffic correctly does not match. A failure invalidates the run.
- Single node, single core for the match step. Match latencies come from one commodity x86-64 system (specified below) and are single-threaded, so multi-core nodes match proportionally more.
- End-to-end via the real binaries. The decision round-trip figures come from a separate harness that spawns N real connector processes against a live engine over the encrypted defendr wire (TLS on), times each request's full round-trip and reports throughput plus latency percentiles per concurrency level. Warm-up is excluded, so the numbers are steady-state.
Test system
For full transparency, the figures in this paper were produced on a single, off-the-shelf commodity x86-64 machine — no specialised accelerators, no exotic hardware:
| Software under test | EnforceGate vX 2026.35.0 |
|---|---|
| CPU | AMD Ryzen 9 9950X3D — 16 cores / 32 threads, AMD 3D V-Cache, boost up to ~5.76 GHz |
| Memory | 96 GB DDR5 (Socket AM5 platform) |
| Architecture | x86-64, single socket |
| Operating system | Linux (kernel 7.0) |
| Lookup measurement | Single-threaded — one CPU core, the rest idle |
The 150-million-rule policy uses under 5 GiB in high-density mode, so memory capacity was never the limiting factor on this host — the headroom simply confirms the footprint figures. Lookup latencies reflect a single core; a production node serving traffic across all available cores scales throughput proportionally.
07 Scope & caveats
- Figures are lab-measured on a single commodity machine (see Test system) under controlled conditions; production numbers vary with hardware, traffic mix and co-located workloads.
- Two distinct latencies are reported, deliberately. The ~0.2 µs figure is the in-memory rule-match step; the ~70 µs / ~68,000-per-second figures are the end-to-end decision — the full connector⇄engine round-trip EnforceGate adds to a request. Quote the end-to-end number for request-latency and throughput claims; the match number is a component of it, not a substitute.
- The end-to-end figure is EnforceGate's own overhead — it does not include the client TLS handshake, payload decryption or Squid's processing (OpenSSL / Squid / kernel costs). A full proxy-level (Gbps, wire-to-wire) benchmark is a separate, recommended exercise.
- The "flat latency" result is for the common (permitted) path — the dominant case. Decisions for blocked destinations are also sub-3 µs but do rise modestly with scale.
- "Rules" here are domain-policy entries — the dominant high-volume rule type. Regular-expression URL rules have different, lower-cardinality characteristics and are not the subject of this 150M claim.
- The benchmark measures load, lookup, and the end-to-end decision round-trip under a concurrency sweep; it is not yet a multi-hour production-traffic soak. A sustained-load endurance test is a recommended follow-up before publishing hard SLAs.
Sizing a large deployment?
We are happy to walk a CTO or security team through the benchmark methodology and the raw per-run data under NDA for technical due diligence.