The Best Multi-Tenant Isolation Platforms in 2026
Most people arrive at this question having already mis-stated it. They search for 'best sandbox platform,' compare five products on cold-start and price, pick one, and ship. But you are not shopping for a sandbox. You are shopping for an isolation boundary between one paying customer and the next — a line in your architecture that, when a tenant does something hostile or merely catastrophic on the far side of it, holds. The product is downstream of the boundary. Choose the boundary first, or you will end up with a very fast, very cheap, very well-documented thing that does not stop what you actually need stopped.
This is a buyer's guide organized as five decisions rather than a leaderboard, because the ranking genuinely inverts depending on which decision is forcing your hand. The decisions are: what your tenants are actually running, which boundary that implies, what tenants still share once you have the boundary, how long each tenant's compute lives, and who operates the thing. Work them in that order. If you work them in the other order — starting from a vendor comparison — you will optimize the last decision and guess at the first, which is exactly the failure mode this post exists to prevent.
Decision 1: what are your tenants actually running?
Write this down as a sentence before you look at a single product page. Not 'user content' — a precise description of the most powerful thing a tenant can cause your infrastructure to execute. Almost every team I talk to has either over-built or under-built here, and in both cases the root cause is the same: nobody ever wrote the sentence, so the requirement was inferred from vibes.
The requirement escalates sharply, and it is not a smooth curve. There are four rungs and the jump between the second and third is a different kind of jump than the others:
- Data you parse. CSVs, JSON, images, PDFs, uploaded video. The tenant supplies bytes; your code decides what happens. Your exposure is your parsers — and parsers are where memory-safety bugs live, so this is not nothing, but the answer is a hardened process, a memory-safe library, resource limits, and a fuzzing budget. Not a hypervisor.
- A query language or expression you evaluate. SQL against their own schema, a JMESPath filter, a spreadsheet formula, a rules-engine predicate. The tenant supplies structure, and the evaluator's job is to be total: no I/O, no unbounded recursion, no arbitrary syscalls. If your evaluator is sound, this is a permissions and resource-limits problem. If your evaluator is a thin wrapper over an eval(), you are actually on rung three and have not noticed.
- Arbitrary code a human tenant wrote. A build step, a webhook handler, a plugin, a notebook cell, a custom integration. Now the tenant chooses the syscalls. Everything your process can reach, their code can reach: your environment variables, your mounted secrets, your instance metadata endpoint, your internal network. The boundary is no longer a library choice. It is infrastructure.
- Arbitrary code an LLM wrote on a tenant's behalf. Rung three, except no human read it before it ran — not even the person who asked for it. The failure mode is less often a deliberate exploit and more often confident nonsense executed at speed: a cleanup script that walks up one directory too far, a dependency install that pulls a hallucinated package name someone helpfully registered last week, a retry loop that discovers your egress bill. Same boundary requirement as rung three, with a much higher event rate and a much lower bar for triggering it.
The reason this decision comes first is that rungs one and two are solved with software you already own, and rungs three and four are solved with an isolation boundary you have to buy or build. Teams on rung two who think they are on rung four spend a quarter standing up microVM infrastructure to run SQL. Teams on rung four who think they are on rung two run model-generated shell in a container next to their production credentials and describe it, in the design doc, as 'sandboxed.'
Decision 2: which boundary
Here is the ladder, from cheapest to strongest, with what each one actually stops and what it honestly costs. The full mechanics of each rung are in /blog/code-isolation-hierarchy; this is the buyer's-guide version, written so you can eliminate rungs quickly.
- Process + user + seccomp + rlimits — stops accidents and casual mischief: a runaway loop, a fork bomb, a script writing where it shouldn't. Does not stop a kernel exploit, does not stop reading anything the process can legitimately read, and does not stop a tenant enumerating your environment. Cost: essentially zero, which is why it's the right answer for rungs one and two and a dangerous default for rungs three and four.
- Shared-kernel container — stops namespace-level mistakes: separate PID and mount views, a filesystem the tenant can't wander out of, cgroup limits that hold. Does not stop anything that reaches the one host kernel every tenant shares. Cost: near-zero, excellent tooling, and a boundary whose enforcement depends on the thing being escaped. A container is a boundary the kernel enforces on behalf of code that is asking the same kernel for favours.
- User-space kernel (gVisor) — a second kernel written in Go that intercepts the guest's syscalls and services most of them itself, so the host kernel's syscall surface is dramatically reduced rather than shared wholesale. A real rung, not marketing. Costs: syscall-heavy and I/O-heavy workloads pay for the interception, and application compatibility is good but not total — verify your actual workload against gVisor's own compatibility documentation rather than assuming.
- Hardware-virtualized microVM (Firecracker, Cloud Hypervisor, Kata, QEMU) — each tenant gets its own guest kernel, and the boundary is enforced by the CPU's virtualization extensions through a small, purpose-built VMM rather than by the kernel the tenant is attacking. A guest kernel exploit gets the tenant root in a kernel that is theirs and empty. Costs: real memory per guest, a boot you now have to make fast, an image/template pipeline, and a device model deliberately too spartan for some workloads (GPU passthrough being the usual wall).
- Separate physical host per tenant — the only rung that meaningfully addresses CPU-level cross-tenant side channels and noisy-neighbour contention at the silicon level, and the one your largest regulated customer will eventually ask for by name. Costs: the economics of multi-tenancy, which is to say all of them. Fine as a paid tier for a handful of tenants; ruinous as a default.
Two honest caveats on that ladder. First, a microVM is not immunity. VMMs have had bugs and KVM has had bugs; the correct claim is 'a much smaller, much better-audited attack surface than the full Linux syscall interface,' not 'unbreakable.' Second, no rung below 'separate host' fully addresses microarchitectural side channels — shared caches and shared cores are shared regardless of what the software boundary says (/blog/side-channel-attacks-multi-tenant-compute-explained). If your threat model genuinely includes a motivated attacker reading another tenant's memory through the cache hierarchy, the answer is dedicated hardware, and you should price that tier accordingly rather than pretend a hypervisor closes it.
# What "sandboxed" often means in practice. Run this as the tenant's code
# inside your container-based "sandbox" and read the output as an attacker would.
uname -r # the HOST kernel — the same one every other tenant is on
grep Seccomp /proc/self/status
# None of the following is an escape. All of it is ordinary, permitted behaviour:
env | grep -iE 'key|token|secret|password'
ls -la /var/run/secrets/ 2>/dev/null
curl -s --max-time 2 http://169.254.169.254/latest/meta-data/ | head
getent hosts postgres.internal
# The boundary held perfectly. The credentials were already inside it.That is the point most container-based multi-tenancy gets wrong. The interesting question is rarely 'can the tenant escape,' because usually they don't need to. The interesting question is what was in scope on their side of the line — and the honest answer for a shared-kernel container on a busy node is: your service account, your mounted caches, your metadata endpoint, and DNS for your internal network.
Two cases where I'd talk you out of a microVM
I sell microVMs, so treat this section as the part where I'm arguing against my own interest, and weight it accordingly.
The first case: if your tenants only submit SQL against their own schema, you do not have a hypervisor problem. You have a database permissions problem. The correct fix is a role per tenant with grants scoped to their objects, row-level security if they share tables, a statement timeout, a connection cap, and a read replica for analytics. Putting each tenant's query in a microVM does not stop a query that reads the wrong rows — the query runs in the database, which you did not move. Spending a quarter on microVM infrastructure to feel safe about SQL is the most expensive way I know to not fix an authorization bug. (What is worth doing here is a database per tenant, which is a data-isolation decision rather than a compute-isolation one: /blog/per-tenant-database-isolation.)
The second case: if your tenants write small, pure, hot-path plugins — a scoring function, a routing rule, a field transformation, a webhook filter — that run thousands of times a second and need no filesystem, no processes, and no network, a WebAssembly runtime is a better fit than a VM. The module is denied capabilities by construction rather than by policy: it gets linear memory and the imports you hand it, and nothing else exists. Instantiation is measured in microseconds, so per-invocation isolation is affordable in a way per-invocation VMs never will be. The honest limits are the mirror image: WASM is a poor fit the moment a tenant expects to run their existing toolchain, spawn a process, open a socket, or use a library that assumes a real OS — at which point WASI compatibility becomes the project, and you have chosen a much harder porting job than a VM would have been. Verify what your target runtime supports today against its own docs; this area moves fast. There's a longer treatment at /blog/microvm-webassembly-plugin-host-isolation.
Decision 3: blast radius — what does one tenant still share with the next?
This is the decision that separates teams who have thought about multi-tenancy from teams who have thought about hypervisors. The boundary is one axis. The other is everything that stays shared behind it — and the shared thing that hurts you is almost never the one you spent the money on. The canonical version of this mistake: a team argues for six weeks about the kernel boundary, ships hardware-virtualized per-tenant compute, and points all of it at one Postgres with a tenant_id column and an ORM that occasionally forgets the WHERE clause. That is a lot of hypervisor guarding a scoping bug.
Enumerate the shared resources explicitly and decide, for each one, whether sharing is acceptable:
- The kernel — the one everyone argues about. Shared on containers, replaced per-tenant by a microVM, mediated by gVisor.
- CPU cores, caches, and memory bandwidth — shared on every rung except dedicated hardware. Governs both side-channel exposure and noisy-neighbour behaviour. Scheduler weights bound the second problem; only separate silicon bounds the first.
- The page cache and the host filesystem — a shared image layer or a shared build cache is a shared mutable surface between tenants. Copy-on-write clones give you the sharing benefit without the mutation risk; a writable shared cache mount does not.
- The database — the most commonly under-isolated resource in the entire stack. A tenant_id column is an isolation boundary enforced by every developer remembering it in every query, forever. A schema per tenant is better; a role with row-level security is better; a database per tenant is strongest and now cheap enough to be routine.
- The egress IP and outbound reputation — badly underrated. If every tenant shares one NAT address, one tenant's scraping, spam, or mining gets that address blocked, rate-limited, or listed, and the blast radius is your entire customer base. We have had customers try to mine cryptocurrency inside sandboxes; the platform-level answer is per-tenant egress policy and outbound filtering, not a stern email.
- The control plane itself — quotas, rate limits, the scheduler, the queue. A tenant who can exhaust your VM slots, your worker pool, or your build queue has denied service to everyone else without touching a single boundary. Quotas are an isolation feature, not a billing feature (/blog/quota-design-for-multi-tenant-platforms).
Score each candidate platform on this list, not just on the kernel row. A platform that gives you strong compute isolation but no per-tenant network policy has handed you half a boundary, and the missing half is the one that shows up in your abuse queue.
Decision 4: lifetime — long-lived per tenant, or disposable per request?
Once you have a boundary, you have to decide how long each instance of it lives, and the two answers have completely different failure modes. A long-lived per-tenant instance is simple to reason about, keeps warm caches and installed dependencies, and holds state where the tenant expects it. It also accumulates: whatever a tenant's code did on Tuesday is still there on Friday, you now own patching every tenant's environment, and you are paying for idle capacity for every tenant who logs in monthly. A disposable per-request machine has none of those problems — every request starts from a known-good image, compromise has a lifetime measured in seconds, and there is no idle cost — but it pays a creation cost on the hot path, every single time.
Which is why cold-start is an isolation decision and not just a performance one, and this is the single most useful thing in this post. If creating a fresh isolated machine costs 179ms at p50, you can afford to make it disposable: per request, per job, per agent step. Contamination becomes structurally impossible rather than something you clean up. If creating one costs 30 seconds, you cannot — you will keep instances warm and reuse them across requests, which means you have quietly chosen the weaker lifetime model, and you chose it because of a latency number rather than a threat model. The boundary you can afford to recreate is the boundary you actually get.
The numbers I can stand behind are ours. PandaStack has no warm pool of idle VMs; every create restores a baked Firecracker snapshot that already contains a booted kernel, a running guest agent, and an initialized network stack, so 'start' means 'map memory and resume.' That lands at ~179ms p50 and ~203ms p99. The one slow path is the first-ever spawn of a brand-new template, which cold-boots in roughly 3s and bakes the snapshot; everything after is on the restore path. Forking a warm machine — copy-on-write guest memory plus a reflinked rootfs — runs 400–750ms same-host and 1.2–3.5s cross-host, which is what makes 'set the environment up once, then branch it per tenant request' practical. For every other platform in this post, measure the equivalent yourself in your region on your own image; cold-start is the single easiest metric to mis-quote across vendors, and that includes how you read ours.
from pandastack import Sandbox
# Per-request isolation: a fresh guest kernel per tenant invocation, not a
# long-lived box you hope stayed clean. TTL is a backstop, not the plan.
def run_for_tenant(tenant, source: str):
sbx = Sandbox.create(
template="code-interpreter",
ttl_seconds=300,
metadata={"tenant": tenant.id},
)
try:
sbx.filesystem.write("/app/main.py", source)
r = sbx.exec("python /app/main.py", timeout=60)
return r.stdout, r.exit_code
finally:
sbx.delete() # the boundary is destroyed, not sanitized
# Whatever the tenant's code did to that machine — installed, wrote, corrupted,
# left running — went away with the machine. Nothing carries into the next call.The middle path is worth naming, because most real products end up there: long-lived per-tenant environments that scale to zero when idle. The tenant keeps their state and their installed dependencies; you stop paying for the ones who aren't logged in. On PandaStack that's auto-hibernate — the machine is snapshotted and released, and the next request restores it. It gets you most of the disposability economics without throwing away tenant state, and the cost is that a hibernated environment is still an environment: it still accumulates, and you still have to patch it.
Decision 5: operational reality — self-host, managed, or BYOC
The last decision is the one people make first, and it is genuinely a decision rather than a technicality, because the honest weight of each model is very different. Be precise about which of these three you mean, since 'self-hosted' is the most overloaded word in this market.
- Self-hosted on your own hardware — you run the VMM or the platform on your own KVM hosts. Maximum control, minimum trust surface, best economics at steady scale, and a compliance story you can hand an auditor without a subprocessor conversation. The honest weight: a VMM is roughly 10% of a platform. The other 90% is per-tenant networking, a snapshot store, a template pipeline, cross-host scheduling, lifecycle reapers, and an SDK — and once it's live, someone on your team carries a pager for it. Choose this on purpose, not because it looked cheaper on a spreadsheet.
- Managed API — you call create() and never see a host. Least operational work by a wide margin, fastest to a working product, and the right default for most teams below serious scale. The honest weight: your tenants' compute runs on someone else's infrastructure, which is a real trust and compliance question you should answer before your largest customer's security review asks it for you, plus the usual lock-in exposure if the API isn't backed by software you could run yourself.
- Bring-your-own-cloud (BYOC) — a vendor's control plane orchestrates compute inside your cloud account. Genuine data-locality and residency benefits, and it satisfies a lot of procurement checklists. The honest weight: it is not open-source software you can run detached from the vendor, so don't let 'runs in your account' read as 'we could keep this running without them.' Verify what happens to your workloads if the control plane is unreachable.
- Open-source platform you can self-host — the middle that actually exists: you get the API and the SDKs, but the software is yours, so 'managed today, self-hosted later' is a migration rather than a rewrite. This is where PandaStack sits; the same binaries run on our hosts or on any Linux box with /dev/kvm. The honest weight is unchanged the day you exercise it: self-hosting is still real operational work, the open licence just means you're allowed to.
The field, at a glance
With the five decisions made, here is the field sorted by what it is, with a 'pick this when' for each. Everything below except PandaStack is qualitative by design — no numbers, no pricing, no feature claims I can't source from public documentation, and a standing instruction to verify against their current docs, because this market re-shuffles quarterly.
- Raw VMMs — Firecracker (minimal, Rust, the substrate under much of this market), Cloud Hypervisor (a richer device model, same Rust-VMM lineage), QEMU (maximal device and architecture coverage, larger surface to harden). Pick when you want the strongest boundary with nothing between you and it, and the platform layer is something your team intends to own.
- Kata Containers — VM-backed isolation wearing a container's clothes, commonly on Firecracker or Cloud Hypervisor underneath. Pick when you already run Kubernetes and want per-pod VM isolation without changing how your team ships.
- gVisor — Google's user-space kernel; a real rung above a shared-kernel container, and a different bet from a full VM. Pick when container ergonomics matter more than the last increment of boundary strength and your workloads aren't syscall-bound. Verify compatibility for your specific runtime against their docs; there's a landscape post at /blog/best-gvisor-alternatives-2026.
- WebAssembly runtimes — Wasmtime, WasmEdge, and the platforms built on them. Pick for small, pure, hot-path tenant plugins where per-invocation isolation must be nearly free and the module genuinely doesn't need an OS. Don't pick it to run somebody's existing repo.
- Hardened container platforms — Kubernetes with a hardened runtime, seccomp and AppArmor profiles, and strict network policy. Pick when your tenants are on rung one or two of decision 1, or when the tenants are internal teams rather than the public internet. Be honest that the kernel is still shared.
- PandaStack — open-source Firecracker platform, self-hostable on any Linux KVM host: a microVM with its own guest kernel per sandbox, snapshot-restore on every create (~179ms p50, ~203ms p99), copy-on-write forking (400–750ms same-host), per-sandbox network namespaces from a pool of 16,384 pre-allocated /30 subnets per agent, managed PostgreSQL 16 as a per-tenant database, and scale-to-zero auto-hibernate. Pick when you want compute and data isolation on one substrate and the option to run it yourself.
- E2B — a focused, mature Firecracker-based sandbox platform with an open-source core. Pick when you want a proven microVM API with little to operate; verify current licensing and self-host support in their repo.
- Modal — hosted serverless compute oriented around AI/ML workloads, with a sandbox primitive; their security documentation describes gVisor. Pick when the scale-out batch or GPU workload is the product and the sandbox is a component of it.
- Daytona and Runloop — managed environments aimed at coding agents and developer workspaces. Pick when that shape maps directly onto your product and you'd rather buy the whole workflow than assemble it; verify each one's isolation model and lifetime semantics against their current docs.
- Fly.io — a hosted app platform whose Machines are Firecracker-based, durable by default, and able to stop when idle. Pick when persistent per-tenant state and global placement matter more than disposable per-request compute.
- Northflank — a managed platform documenting a choice of isolation runtimes plus a BYOC deployment option. Pick when you want a broad platform, possibly in your own cloud account, and don't require the software itself to be open-source.
- Vercel Sandbox and Cloudflare — the platform-native options. Vercel's sandbox primitive is aimed at running untrusted or model-generated code alongside their app platform; Cloudflare's model centres on V8 isolates at the edge with container-based offerings alongside. Pick either when you are already deep in that platform and the tenancy requirement is a feature of an app you host there; verify the isolation model for the specific product you'd use, since these are the fastest-moving entries on this list.
Where PandaStack fits, specifically
The honest positioning: PandaStack is for teams on rungs three and four of decision 1 who want the kernel boundary and the data boundary from the same system, and want the option to run it on their own hardware. Every sandbox is a Firecracker microVM with its own guest kernel (5.10, Ubuntu 24.04 guest) isolated by KVM, under a jailer that drops privileges and exposes a minimal virtio device model. Networking is per-sandbox — its own Linux network namespace, veth pair, and tap device drawn from 16,384 pre-allocated /30 subnets per agent — so per-tenant egress policy is a property of the machine rather than a rule someone has to remember to write. A managed PostgreSQL 16 instance is itself a microVM with a durable volume, ready in 30–90s, which makes a database per tenant an ordinary object instead of an architecture project.
{
"boot-source": {
"kernel_image_path": "/var/lib/pandastack/kernels/vmlinux-5.10",
"boot_args": "console=ttyS0 reboot=k panic=1 pci=off"
},
"machine-config": { "vcpu_count": 8, "mem_size_mib": 4096 },
"drives": [
{
"drive_id": "rootfs",
"path_on_host": "/var/lib/pandastack/vms/<sandbox-id>/clone.ext4",
"is_root_device": true,
"is_read_only": false
}
],
"network-interfaces": [
{ "iface_id": "eth0", "host_dev_name": "tap0", "guest_mac": "<baked>" }
]
}That is the whole boundary, written down: a kernel image that belongs to this tenant and nobody else, a rootfs that is a reflinked clone rather than a shared mount, and a tap device that lives inside this sandbox's own network namespace. The tenant's code can do whatever it likes to that kernel. It is theirs, it is empty, and in 179ms there will be a fresh one.
The bottom line
There is no best multi-tenant isolation platform, only a best boundary for what your tenants are allowed to do — and once you've written that sentence down, the shortlist usually writes itself. If tenants submit data you parse, harden the parser. If they submit queries, fix the permissions. If they submit code, the shared host kernel stops being a boundary you should trust, and you're choosing between gVisor's user-space kernel and a hardware-virtualized microVM. If they submit code an LLM wrote, assume it will run and assume nobody read it first, and make the environment disposable enough that this is fine. Then check the resources that stayed shared behind whatever boundary you bought, because that is where the incident will actually come from: the database, the egress IP, the quota. PandaStack's bet is that per-tenant compute isolation and per-tenant data isolation belong on one substrate you can own — a Firecracker microVM per sandbox, restored in ~179ms so disposability is affordable, forked in 400–750ms so branching is, and a managed Postgres per tenant on the same system. If that matches your five decisions, benchmark it against the field and keep me honest.
Frequently asked questions
What is the best multi-tenant isolation platform in 2026?
There isn't one, and any roundup that names a single winner is selling something. The correct answer falls out of five decisions taken in order: what your tenants actually run (data you parse, a query language you evaluate, arbitrary code a human wrote, or arbitrary code an LLM wrote), which boundary that implies, what tenants still share behind the boundary, how long each isolated instance lives, and who operates it. Rungs one and two are solved with software you already own — hardened parsers, database roles, resource limits. Rungs three and four need infrastructure: a user-space kernel like gVisor, or a hardware-virtualized microVM built on Firecracker, Cloud Hypervisor, Kata, or QEMU, either self-run or bought as a managed API from platforms including PandaStack, E2B, Modal, Daytona, Fly.io, Runloop, Northflank, Vercel, and Cloudflare. Decide which of the five decisions is non-negotiable for you, shortlist the two options that clear it, and prototype both against your real workload.
Is a container enough isolation for multi-tenant code execution?
It depends entirely on what the tenant can execute, and the honest framing is that a container is a boundary the kernel enforces on behalf of code that is asking the same kernel for favours. For internal teams, or for tenants who only supply data you parse or queries you evaluate, containers plus seccomp, AppArmor, cgroup limits, and strict network policy are a reasonable answer. For arbitrary tenant-supplied or model-generated code from the public internet, the problem usually isn't even escape — it's what was already inside the boundary with the tenant. Ordinary permitted behaviour inside a container can read your environment variables, your mounted service-account tokens, your build caches, your cloud instance metadata endpoint, and DNS for your internal network. If your answer to 'what does a compromised tenant get' is a list rather than 'an empty machine,' the container isn't the boundary you thought it was.
When is a microVM overkill for multi-tenancy?
Two clear cases, and I sell microVMs so take these seriously. First: if tenants only submit SQL against their own schema, you have a database permissions problem, not a hypervisor problem. The query executes in the database, which a microVM does not move, so the fix is a role per tenant, grants scoped to their objects, row-level security where they share tables, statement timeouts, and connection caps — plus a database per tenant if you want a hard boundary. Second: if tenants write small, pure, hot-path plugins — a scoring function, a routing rule, a field transform — that need no filesystem, no processes, and no network, a WebAssembly runtime is the better fit. A WASM module is denied capabilities by construction rather than by policy, and instantiation is cheap enough to isolate per invocation in a way VMs never will be. WASM stops being the right answer the moment a tenant expects to run their existing toolchain, spawn a process, or open a socket.
Why is cold-start an isolation decision and not just a performance one?
Because the lifetime of your boundary is capped by how cheaply you can recreate it. If creating a fresh isolated machine costs 179ms at p50, you can afford to destroy and recreate it per request, per job, or per agent step — cross-request contamination becomes structurally impossible rather than something you clean up, and a compromise has a lifetime measured in seconds. If creation costs 30 seconds, you will keep environments warm and reuse them across requests, because no product survives a 30-second wait on the hot path. That means you have chosen the weaker lifetime model, and you chose it for a latency reason rather than a security reason. This is why PandaStack has no warm pool and restores a baked snapshot on every create: the fast path exists so that disposability stays affordable. When you evaluate any platform, measure creation latency on your own image in your own region and then ask what lifetime model that number lets you afford.
What do tenants still share after I add a strong isolation boundary?
More than most teams check, and the shared resource that causes the incident is rarely the one they spent the money on. Enumerate them explicitly: the kernel (replaced per-tenant by a microVM, mediated by gVisor, shared by containers); CPU cores, caches, and memory bandwidth, which govern both noisy-neighbour behaviour and microarchitectural side-channel exposure and are only truly unshared on dedicated hardware; the host page cache and any writable shared build cache or image layer; the database, which is the most commonly under-isolated resource in the entire stack — a tenant_id column is a boundary enforced by every developer remembering it in every query, forever; the shared egress IP, where one tenant's scraping or mining can get an address blocked and take your whole customer base's outbound reputation with it; and the control plane's quotas and queues, where a tenant who exhausts your capacity has denied service to everyone without touching a single kernel.
Keep reading
- The code isolation hierarchy — The full mechanics of each rung, from seccomp up to hardware virtualization.
- Multi-tenant code execution, in practice — What running other people's code actually demands of a platform.
- Per-tenant database isolation — The other half of the boundary — the one the tenant_id column doesn't give you.
- Quota design for multi-tenant platforms — Why quotas are an isolation feature and not a billing feature.
- Best microVM platforms in 2026 — The companion guide for when you've already settled on microVM-grade isolation.
49ms p50 cold start. Fork, snapshot, and scale to zero.