10 min read

The Silicon Shortcut: Scaling Zero-Trust to 100 Million RPS Without Breaking a Sweat

Scaling Zero-Trust to 100 Million RPS via Silicon

Let’s be honest: the traditional service mesh is hitting a wall.

If you’ve ever managed a massive-scale microservices architecture, you know the "Sidecar Tax." You start with a clean architecture, but as you scale to thousands of services, you’re suddenly burning 30% of your fleet’s CPU just to move bytes between containers and encrypt them with mTLS. When you’re aiming for 100 million requests per second (RPS) across a global footprint, that "tax" isn't just an annoyance—it’s a multi-million dollar scalability bottleneck.

At this altitude, the Linux kernel itself becomes a bottleneck. The standard socket layer, the context switching between user-space and kernel-space, and the overhead of software-based cryptographic operations create a latency floor that no amount of vertical scaling can fix.

To break through, we have to stop thinking about networking as a software problem and start treating it as a hardware-integrated systems challenge. In this deep dive, we’re going to tear down the traditional sidecar model and rebuild a Zero-Trust Data Plane using the holy trinity of modern high-performance networking: eBPF, AF_XDP (Kernel-Bypass), and Hardware-Accelerated mTLS.


The Architecture of the 100M RPS Wall

To understand why we need to bypass the kernel, we first need to understand why it’s failing us at scale. In a standard Istio or Linkerd setup, a packet follows a tortuous path:

  1. Packet hits the NIC.
  2. Kernel processes the interrupt, runs the packet through the Netfilter/IPTables stack.
  3. Context switch to the Envoy sidecar (User-space).
  4. Envoy performs mTLS decryption (CPU-intensive).
  5. Envoy parses headers, makes a routing decision.
  6. Context switch back to Kernel to send the packet to the local application container.
  7. Application processes the request and sends it back through the same loop.

At 100M RPS, the CPU spends more time shuffling data between memory buffers and handling syscalls (read, write, sendto) than actually running business logic. We call this Data Copy Fatigue. Every time a packet crosses the boundary from the kernel to a user-space proxy, you lose nanoseconds. Multiply those nanoseconds by 100 million, and your tail latency ($P99.9$) explodes.

The New Paradigm: Sidecarless but Identity-Aware

The industry hype has recently shifted toward "Sidecarless" service meshes (like Istio Ambient or Cilium Mesh). The promise is simple: move the mesh logic out of the pod and into the node's kernel or a dedicated per-node proxy.

But for the 100M RPS use case, even "Ambient" isn't enough if it's still relying on software-based encryption. We need to go deeper. We need to move the Identity and Encryption layers into the Network Interface Card (NIC) itself, while using eBPF as the intelligent traffic cop that directs traffic without ever leaving the fast path.


Phase 1: Bypassing the Kernel with AF_XDP

The first step to 100M RPS is getting the kernel out of the way. Enter AF_XDP (Address Family eXpress Data Path).

Unlike standard sockets, AF_XDP allows us to create a "Zero-copy" memory window between the NIC and our user-space application. When a packet arrives, the NIC places it directly into a memory region that our service mesh controller can see. No buffer copies, no heavy TCP stack overhead.

Why AF_XDP over DPDK?

While DPDK (Data Plane Development Kit) has been the gold standard for kernel-bypass for years, it’s notoriously difficult to integrate with standard Linux environments because it "steals" the NIC from the kernel. AF_XDP gives us the best of both worlds: we get raw performance for our mesh traffic, but the kernel can still handle standard SSH or management traffic on the same interface.

// A simplified eBPF snippet to redirect traffic to an AF_XDP socket
SEC("xdp_sock")
int xdp_redirect_prog(struct xdp_md *ctx) {
    int index = 0; // The index of our AF_XDP socket map

    // Check if the packet matches our service mesh criteria (e.g., specific port)
    if (is_mesh_traffic(ctx)) {
        return bpf_redirect_map(&xsks_map, index, 0);
    }

    return XDP_PASS; // Let the kernel handle non-mesh traffic
}

By implementing this, we eliminate the IPTables overhead. We’ve reduced the "cost per packet" significantly, but we still have a problem: mTLS.


Phase 2: Hardware-Accelerated mTLS (The SmartNIC Revolution)

Encrypting and decrypting 100M RPS using AES-GCM in software is a recipe for a molten CPU. Even with AES-NI instructions, the sheer volume of cryptographic handshakes and symmetric encryption cycles will consume the majority of your compute cycles.

The solution is Inline TLS Offload via SmartNICs (like the Nvidia BlueField-3 or AMD Pensando).

How Inline Offload Works

In a traditional setup, the CPU handles the TLS framing. With hardware acceleration, the NIC hardware handles the encryption/decryption at line rate (200Gbps+).

When our service mesh data plane establishes a connection, it performs the TLS Handshake in software (to maintain flexibility with identity providers like SPIFFE), but then it hands the Symmetric Keys to the NIC's hardware crypto engine.

  1. Handshake: The Control Plane (running SPIRE) provides a short-lived SVID (Identity).
  2. Key Injection: Our eBPF-powered agent negotiates the session keys and "programs" them into the SmartNIC's TLS table.
  3. The Fast Path: As packets flow out, the NIC encrypts them in the silicon before they hit the wire. As packets flow in, the NIC decrypts them before the software even sees the payload.

To the application, it looks like plain text. To the wire, it’s robust, Zero-Trust compliant mTLS. The "Sidecar Tax" effectively drops to zero.


Phase 3: The Identity Layer with SPIFFE and eBPF

Zero-Trust is nothing without identity. In a 100M RPS environment, you cannot rely on IP addresses for security. IPs are ephemeral; identities are permanent.

We use SPIFFE (Secure Production Identity Framework for Everyone) to assign a unique identity to every workload. But how do we enforce this at the packet level without slowing down the world?

We leverage eBPF Maps to store the state of authenticated identities.

The Flow:

  1. Identity Attestation: When a pod starts, a local agent (Cilium or a custom agent) verifies its identity and issues a SPIFFE ID.
  2. Policy Mapping: The control plane pushes "Identity-to-Identity" allow-lists into an eBPF map.
    • Example: Source_ID: Frontend is allowed to talk to Target_ID: Payments.
  3. Enforcement: For every new flow, the eBPF program performs a lookup in the map. If the identity isn't authorized, the packet is dropped at the XDP layer—before it even consumes a single CPU cycle in user-space.
// eBPF Identity Lookup Table
struct {
    __uint(type, BPF_MAP_TYPE_HASH);
    __type(key, struct identity_pair);
    __type(value, struct policy_decision);
    __uint(max_entries, 1000000);
} policy_map SEC(".maps");

// Enforcement logic
if (bpf_map_lookup_elem(&policy_map, &current_pair) == DENY) {
    return XDP_DROP;
}

Resolving the "Hype" vs. Reality: Why Now?

You might be asking: “If this is so much better, why aren't we all doing this already?”

Until recently, the barrier to entry was the Complexity Gap. Writing eBPF code was akin to writing firmware. Managing SmartNICs required specialized kernels and vendor-specific SDKs. However, the ecosystem has reached a tipping point:

  • The "Sidecarless" movement (Cilium, Istio Ambient) has normalized the idea of moving mesh logic into the infrastructure layer.
  • Kernel 5.15+ and 6.x have introduced stable AF_XDP and KTLS (Kernel TLS) features that make hardware offload more accessible.
  • Standardization of SPIFFE has provided a vendor-neutral way to handle identity at scale.

The hype around "Sidecarless" isn't just a trend—it's a response to the physical limits of the sidecar model. At 10M RPS, sidecars are expensive. At 100M RPS, they are an architectural impossibility.


The Engineering Challenges: What Nobody Tells You

While the vision of 100M RPS with zero-latency overhead is beautiful, the implementation is fraught with "engineering curiosities."

1. The Tail-Latency Trap: PCI Express Bus Contention

When you’re moving 100 million packets per second, the bottleneck often shifts from the CPU to the PCI Express (PCIe) bus. If your SmartNIC is in one PCIe slot and your memory is managed by a CPU on a different NUMA node, the "QPI/UPI hop" between CPU sockets will destroy your $P99$.

The Fix: You must use NUMA-aware memory allocation for your AF_XDP buffers. Your application threads and your NIC's memory must live on the same physical silicon die.

2. The "Cold Boot" Problem for mTLS

Hardware offload is great for existing connections. But what about the Handshake Rate? If you have a massive spike in traffic, the sheer number of RSA/ECDSA handshakes can still overwhelm the control plane.

The Fix: We implement TLS Session Resumption and TCP Fast Open at the eBPF layer. By caching session tickets in an eBPF map, we can bypass the full handshake for 95% of returning traffic, keeping the control plane from melting during a DDoS or a sudden scale-up event.

3. Observability at Warp Speed

How do you monitor 100M RPS? You can't log every request to an ELK stack. You’d spend more on logging than on the actual service.

The Fix: We use eBPF-based metrics aggregation. Instead of sending "Request Finished" events to a proxy, we increment atomic counters directly in eBPF maps. Prometheus then scrapes these maps every few seconds. We get 100% visibility with <1% CPU overhead.


The New Gold Standard: A Comparative Look

Let's look at the numbers we're seeing in high-performance environments (approximate values based on current industry benchmarks for a single 128-core node):

Feature Standard Sidecar (Envoy) Sidecarless (eBPF/XDP) HW-Accelerated (eBPF + SmartNIC)
Max RPS (per node) ~150k - 250k ~1M - 2M 10M+
mTLS Latency Penalty 1.5ms - 5ms 0.5ms - 1ms < 10μs (Microseconds)
CPU Overhead 30% - 50% 10% - 15% < 2%
Security Model Pod-level Node-level Silicon-level

The jump from Software-defined everything to Hardware-accelerated zero-trust is the single biggest leap in infrastructure efficiency since the move from VMs to Containers.


Implementing the Future: A Roadmap for Teams

If you’re looking to implement this at your organization, don’t try to boil the ocean. You don’t need 100M RPS on day one.

  1. Start with Cilium: It’s the most mature implementation of eBPF-based networking. Get familiar with how it replaces IPTables and handles identity.
  2. Experiment with Istio Ambient: Understand the separation of the "Ztunnel" (secure overlay) from the "Waypoint Proxy" (L7 processing).
  3. Pilot SmartNICs for Edge Gateways: The edge is where the mTLS burden is heaviest. Implementing hardware offload at your ingress point will provide the fastest ROI.
  4. Adopt SPIFFE/SPIRE early: Identity is the hardest part to change later. Get your service-to-service identity right while you're still at "human" scale.

The Deep Reality of Zero-Trust

The dream of Zero-Trust has always been "security without compromise." For years, we compromised on performance to get the security we needed. We accepted the latency, we paid the sidecar tax, and we over-provisioned our clusters.

But as we push toward the next order of magnitude—where 100M RPS becomes the standard for global platforms—the "tax" is no longer sustainable. By combining the programmability of eBPF, the speed of AF_XDP, and the raw power of SmartNIC silicon, we are finally entering the era of Transparent Zero-Trust.

The network is becoming a self-securing, high-performance fabric where identity is baked into every bit that crosses the wire. And the best part? The application doesn't even know it's happening. It just runs faster.

This is the silicon shortcut. This is how we scale to 100 million and beyond.


More to explore

Keep diving in