One job, every sandbox

The Mandelbrot set is a mathematical picture whose intricate patterns reveal more detail as you zoom in. It is drawn by repeating a simple calculation at every pixel. We split the picture into 256 tiles and used fan-out to send the pieces across 9 kinds of sandboxes working at once. Each tile was computed twice, by two different kinds of sandboxes running the same JavaScript program. The two answers were compared byte for byte: 256 of 256 tiles agree. 57 of those pairs compared two different JavaScript engines, and 107 included a run in the cloud. Every run is signed into one bundle that anyone can check offline.

Fan out, fan in: one job split across nine kinds of sandboxes through one plimsoll API. The 256 tiles go out to a WebAssembly engine, Docker locked down, Docker with gVisor, NVIDIA OpenShell, Kubernetes with runc, gVisor and Kata, a Docker Cloud microVM and an E2B microVM, and come back as one picture; every tile ran twice and both answers matched.
Signed runs
512
one fresh sandbox each
Kinds of sandbox
9
each its own daemon, one pool
Isolation tiers
4 of 4
process, container, kernel, vm
Tiles that agree
256 of 256
two sandboxes, same bytes
Wall time
1 min 57 s
start to last answer, operator's clock
Cloud cost
$0.0076
estimated: signed run time × list price

1. Where the work ran

tile 0,0; run 1: WebAssembly engine, 503 ms; run 2: Docker, locked down, 884 mstile 1,0; run 1: Docker, locked down, 1047 ms; run 2: Docker with gVisor, 1122 mstile 2,0; run 1: Docker with gVisor, 1043 ms; run 2: NVIDIA OpenShell, 1679 mstile 3,0; run 1: Kubernetes agent-sandbox, runc, 236 ms; run 2: NVIDIA OpenShell, 1794 mstile 4,0; run 1: Kubernetes agent-sandbox, runc, 235 ms; run 2: Kubernetes agent-sandbox, gVisor, 439 mstile 5,0; run 1: Kubernetes agent-sandbox, gVisor, 356 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 977 mstile 6,0; run 1: E2B microVM, 1080 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 1163 mstile 7,0; run 1: E2B microVM, 1269 ms; run 2: Docker Cloud Sandboxes microVM, 6123 mstile 8,0; run 1: WebAssembly engine, 515 ms; run 2: Docker Cloud Sandboxes microVM, 2442 mstile 9,0; run 1: WebAssembly engine, 25 ms; run 2: Docker with gVisor, 1045 mstile 10,0; run 1: Docker, locked down, 796 ms; run 2: NVIDIA OpenShell, 1567 mstile 11,0; run 1: Docker with gVisor, 859 ms; run 2: Kubernetes agent-sandbox, runc, 223 mstile 12,0; run 1: NVIDIA OpenShell, 1449 ms; run 2: Kubernetes agent-sandbox, gVisor, 289 mstile 13,0; run 1: Kubernetes agent-sandbox, runc, 173 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 2238 mstile 14,0; run 1: E2B microVM, 984 ms; run 2: Kubernetes agent-sandbox, gVisor, 265 mstile 15,0; run 1: Docker Cloud Sandboxes microVM, 2239 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 1720 mstile 0,1; run 1: WebAssembly engine, 23 ms; run 2: E2B microVM, 1302 mstile 1,1; run 1: Docker, locked down, 627 ms; run 2: Docker Cloud Sandboxes microVM, 4405 mstile 2,1; run 1: WebAssembly engine, 21 ms; run 2: NVIDIA OpenShell, 1809 mstile 3,1; run 1: Kubernetes agent-sandbox, runc, 1118 ms; run 2: Docker, locked down, 666 mstile 4,1; run 1: Docker with gVisor, 843 ms; run 2: Kubernetes agent-sandbox, gVisor, 9900 mstile 5,1; run 1: NVIDIA OpenShell, 1686 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 7003 mstile 6,1; run 1: E2B microVM, 1179 ms; run 2: Kubernetes agent-sandbox, runc, 117 mstile 7,1; run 1: Docker Cloud Sandboxes microVM, 4016 ms; run 2: Kubernetes agent-sandbox, gVisor, 4127 mstile 8,1; run 1: WebAssembly engine, 455 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 1727 mstile 9,1; run 1: E2B microVM, 1286 ms; run 2: Docker, locked down, 611 mstile 10,1; run 1: Docker with gVisor, 873 ms; run 2: Docker Cloud Sandboxes microVM, 4147 mstile 11,1; run 1: WebAssembly engine, 20 ms; run 2: Kubernetes agent-sandbox, runc, 4919 mstile 12,1; run 1: Docker, locked down, 748 ms; run 2: Kubernetes agent-sandbox, gVisor, 1266 mstile 13,1; run 1: Docker with gVisor, 1046 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 28245 mstile 14,1; run 1: E2B microVM, 1249 ms; run 2: NVIDIA OpenShell, 1621 mstile 15,1; run 1: Kubernetes agent-sandbox, runc, 4034 ms; run 2: Docker Cloud Sandboxes microVM, 2414 mstile 0,2; run 1: WebAssembly engine, 464 ms; run 2: Kubernetes agent-sandbox, gVisor, 3992 mstile 1,2; run 1: Docker, locked down, 716 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 27204 mstile 2,2; run 1: E2B microVM, 1522 ms; run 2: Docker with gVisor, 873 mstile 3,2; run 1: NVIDIA OpenShell, 1718 ms; run 2: Docker Cloud Sandboxes microVM, 3415 mstile 4,2; run 1: WebAssembly engine, 498 ms; run 2: Kubernetes agent-sandbox, gVisor, 1281 mstile 5,2; run 1: Docker, locked down, 956 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 1860 mstile 6,2; run 1: E2B microVM, 1041 ms; run 2: Docker with gVisor, 720 mstile 7,2; run 1: NVIDIA OpenShell, 1665 ms; run 2: Docker Cloud Sandboxes microVM, 3613 mstile 8,2; run 1: WebAssembly engine, 459 ms; run 2: Kubernetes agent-sandbox, runc, 3054 mstile 9,2; run 1: Docker, locked down, 738 ms; run 2: Kubernetes agent-sandbox, gVisor, 253 mstile 10,2; run 1: Docker with gVisor, 892 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 990 mstile 11,2; run 1: E2B microVM, 1716 ms; run 2: NVIDIA OpenShell, 1402 mstile 12,2; run 1: Kubernetes agent-sandbox, runc, 2956 ms; run 2: Docker Cloud Sandboxes microVM, 3573 mstile 13,2; run 1: WebAssembly engine, 424 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 1021 mstile 14,2; run 1: Docker, locked down, 652 ms; run 2: E2B microVM, 1092 mstile 15,2; run 1: Docker with gVisor, 689 ms; run 2: Docker Cloud Sandboxes microVM, 3383 mstile 0,3; run 1: WebAssembly engine, 461 ms; run 2: NVIDIA OpenShell, 1460 mstile 1,3; run 1: Docker, locked down, 712 ms; run 2: Kubernetes agent-sandbox, runc, 208 mstile 2,3; run 1: Docker with gVisor, 749 ms; run 2: Kubernetes agent-sandbox, gVisor, 284 mstile 3,3; run 1: NVIDIA OpenShell, 1527 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 1992 mstile 4,3; run 1: E2B microVM, 1058 ms; run 2: Kubernetes agent-sandbox, runc, 122 mstile 5,3; run 1: Kubernetes agent-sandbox, gVisor, 674 ms; run 2: Docker Cloud Sandboxes microVM, 3259 mstile 6,3; run 1: WebAssembly engine, 453 ms; run 2: E2B microVM, 1396 mstile 7,3; run 1: Docker, locked down, 566 ms; run 2: Docker Cloud Sandboxes microVM, 3138 mstile 8,3; run 1: WebAssembly engine, 506 ms; run 2: Docker with gVisor, 753 mstile 9,3; run 1: Docker, locked down, 514 ms; run 2: NVIDIA OpenShell, 1267 mstile 10,3; run 1: Docker with gVisor, 790 ms; run 2: Kubernetes agent-sandbox, runc, 181 mstile 11,3; run 1: NVIDIA OpenShell, 1260 ms; run 2: Kubernetes agent-sandbox, gVisor, 281 mstile 12,3; run 1: Kubernetes agent-sandbox, runc, 3305 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 1061 mstile 13,3; run 1: E2B microVM, 904 ms; run 2: Kubernetes agent-sandbox, gVisor, 887 mstile 14,3; run 1: Docker Cloud Sandboxes microVM, 2251 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 1052 mstile 15,3; run 1: WebAssembly engine, 419 ms; run 2: Docker Cloud Sandboxes microVM, 3275 mstile 0,4; run 1: WebAssembly engine, 434 ms; run 2: Docker, locked down, 494 mstile 1,4; run 1: Docker, locked down, 544 ms; run 2: Docker with gVisor, 726 mstile 2,4; run 1: Docker with gVisor, 824 ms; run 2: NVIDIA OpenShell, 1049 mstile 3,4; run 1: NVIDIA OpenShell, 918 ms; run 2: Kubernetes agent-sandbox, runc, 101 mstile 4,4; run 1: Kubernetes agent-sandbox, gVisor, 996 ms; run 2: Kubernetes agent-sandbox, runc, 3744 mstile 5,4; run 1: Kubernetes agent-sandbox, gVisor, 339 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 6047 mstile 6,4; run 1: E2B microVM, 1296 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 863 mstile 7,4; run 1: E2B microVM, 1486 ms; run 2: Docker Cloud Sandboxes microVM, 3220 mstile 8,4; run 1: WebAssembly engine, 456 ms; run 2: Docker, locked down, 551 mstile 9,4; run 1: Docker, locked down, 823 ms; run 2: Docker with gVisor, 982 mstile 10,4; run 1: Docker with gVisor, 731 ms; run 2: NVIDIA OpenShell, 876 mstile 11,4; run 1: NVIDIA OpenShell, 883 ms; run 2: Kubernetes agent-sandbox, runc, 140 mstile 12,4; run 1: Kubernetes agent-sandbox, runc, 955 ms; run 2: Kubernetes agent-sandbox, gVisor, 1834 mstile 13,4; run 1: Kubernetes agent-sandbox, gVisor, 246 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 2428 mstile 14,4; run 1: E2B microVM, 1551 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 1612 mstile 15,4; run 1: E2B microVM, 1165 ms; run 2: Docker Cloud Sandboxes microVM, 3305 mstile 0,5; run 1: WebAssembly engine, 451 ms; run 2: Docker Cloud Sandboxes microVM, 3531 mstile 1,5; run 1: WebAssembly engine, 463 ms; run 2: Docker with gVisor, 826 mstile 2,5; run 1: Docker, locked down, 525 ms; run 2: NVIDIA OpenShell, 1099 mstile 3,5; run 1: Docker with gVisor, 716 ms; run 2: Kubernetes agent-sandbox, runc, 3148 mstile 4,5; run 1: NVIDIA OpenShell, 876 ms; run 2: Kubernetes agent-sandbox, gVisor, 1163 mstile 5,5; run 1: Kubernetes agent-sandbox, runc, 125 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 1994 mstile 6,5; run 1: E2B microVM, 2841 ms; run 2: Kubernetes agent-sandbox, gVisor, 1698 mstile 7,5; run 1: Docker Cloud Sandboxes microVM, 3457 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 2004 mstile 8,5; run 1: WebAssembly engine, 505 ms; run 2: E2B microVM, 1215 mstile 9,5; run 1: Docker, locked down, 540 ms; run 2: Docker Cloud Sandboxes microVM, 4293 mstile 10,5; run 1: WebAssembly engine, 441 ms; run 2: NVIDIA OpenShell, 943 mstile 11,5; run 1: Docker, locked down, 639 ms; run 2: Kubernetes agent-sandbox, runc, 116 mstile 12,5; run 1: Docker with gVisor, 704 ms; run 2: Kubernetes agent-sandbox, gVisor, 255 mstile 13,5; run 1: NVIDIA OpenShell, 1039 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 2077 mstile 14,5; run 1: E2B microVM, 1043 ms; run 2: Kubernetes agent-sandbox, runc, 553 mstile 15,5; run 1: Docker Cloud Sandboxes microVM, 3282 ms; run 2: Kubernetes agent-sandbox, gVisor, 3114 mstile 0,6; run 1: WebAssembly engine, 18 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 2016 mstile 1,6; run 1: Docker, locked down, 635 ms; run 2: E2B microVM, 1346 mstile 2,6; run 1: Docker with gVisor, 768 ms; run 2: Docker Cloud Sandboxes microVM, 3290 mstile 3,6; run 1: WebAssembly engine, 450 ms; run 2: Kubernetes agent-sandbox, runc, 1162 mstile 4,6; run 1: Docker, locked down, 598 ms; run 2: Kubernetes agent-sandbox, gVisor, 348 mstile 5,6; run 1: Docker with gVisor, 1040 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 1004 mstile 6,6; run 1: E2B microVM, 1215 ms; run 2: NVIDIA OpenShell, 934 mstile 7,6; run 1: Kubernetes agent-sandbox, runc, 196 ms; run 2: Docker Cloud Sandboxes microVM, 3523 mstile 8,6; run 1: WebAssembly engine, 745 ms; run 2: Kubernetes agent-sandbox, gVisor, 2007 mstile 9,6; run 1: Docker, locked down, 723 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 6082 mstile 10,6; run 1: E2B microVM, 1224 ms; run 2: Docker with gVisor, 707 mstile 11,6; run 1: NVIDIA OpenShell, 1038 ms; run 2: Docker Cloud Sandboxes microVM, 2536 mstile 12,6; run 1: WebAssembly engine, 843 ms; run 2: Kubernetes agent-sandbox, gVisor, 2444 mstile 13,6; run 1: Docker, locked down, 701 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 1097 mstile 14,6; run 1: E2B microVM, 1659 ms; run 2: Docker with gVisor, 913 mstile 15,6; run 1: NVIDIA OpenShell, 978 ms; run 2: Docker Cloud Sandboxes microVM, 3208 mstile 0,7; run 1: WebAssembly engine, 418 ms; run 2: Kubernetes agent-sandbox, runc, 109 mstile 1,7; run 1: Docker, locked down, 694 ms; run 2: Kubernetes agent-sandbox, gVisor, 219 mstile 2,7; run 1: Docker with gVisor, 694 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 855 mstile 3,7; run 1: E2B microVM, 1452 ms; run 2: NVIDIA OpenShell, 1029 mstile 4,7; run 1: Docker Cloud Sandboxes microVM, 3531 ms; run 2: Kubernetes agent-sandbox, runc, 335 mstile 5,7; run 1: WebAssembly engine, 285 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 2240 mstile 6,7; run 1: E2B microVM, 1247 ms; run 2: Docker, locked down, 715 mstile 7,7; run 1: Docker with gVisor, 860 ms; run 2: Docker Cloud Sandboxes microVM, 3365 mstile 8,7; run 1: WebAssembly engine, 436 ms; run 2: NVIDIA OpenShell, 1240 mstile 9,7; run 1: Docker, locked down, 587 ms; run 2: Kubernetes agent-sandbox, runc, 2510 mstile 10,7; run 1: Docker with gVisor, 857 ms; run 2: Kubernetes agent-sandbox, gVisor, 718 mstile 11,7; run 1: NVIDIA OpenShell, 1135 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 2033 mstile 12,7; run 1: E2B microVM, 1445 ms; run 2: Kubernetes agent-sandbox, runc, 832 mstile 13,7; run 1: Docker Cloud Sandboxes microVM, 3223 ms; run 2: Kubernetes agent-sandbox, gVisor, 3539 mstile 14,7; run 1: WebAssembly engine, 32 ms; run 2: E2B microVM, 960 mstile 15,7; run 1: Docker, locked down, 567 ms; run 2: Docker Cloud Sandboxes microVM, 3229 mstile 0,8; run 1: WebAssembly engine, 20 ms; run 2: Docker with gVisor, 853 mstile 1,8; run 1: Docker, locked down, 496 ms; run 2: NVIDIA OpenShell, 1082 mstile 2,8; run 1: Docker with gVisor, 652 ms; run 2: Kubernetes agent-sandbox, runc, 113 mstile 3,8; run 1: NVIDIA OpenShell, 1091 ms; run 2: Kubernetes agent-sandbox, gVisor, 1467 mstile 4,8; run 1: Kubernetes agent-sandbox, runc, 799 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 943 mstile 5,8; run 1: E2B microVM, 1468 ms; run 2: Kubernetes agent-sandbox, gVisor, 497 mstile 6,8; run 1: Docker Cloud Sandboxes microVM, 3323 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 6146 mstile 7,8; run 1: WebAssembly engine, 394 ms; run 2: Docker Cloud Sandboxes microVM, 3431 mstile 8,8; run 1: WebAssembly engine, 413 ms; run 2: Docker, locked down, 577 mstile 9,8; run 1: Docker, locked down, 534 ms; run 2: Docker with gVisor, 913 mstile 10,8; run 1: Docker with gVisor, 976 ms; run 2: NVIDIA OpenShell, 1140 mstile 11,8; run 1: NVIDIA OpenShell, 1094 ms; run 2: Kubernetes agent-sandbox, runc, 1234 mstile 12,8; run 1: Kubernetes agent-sandbox, gVisor, 500 ms; run 2: Kubernetes agent-sandbox, runc, 4093 mstile 13,8; run 1: Kubernetes agent-sandbox, gVisor, 3224 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 2022 mstile 14,8; run 1: E2B microVM, 1066 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 945 mstile 15,8; run 1: E2B microVM, 1076 ms; run 2: Docker Cloud Sandboxes microVM, 3307 mstile 0,9; run 1: WebAssembly engine, 19 ms; run 2: Docker, locked down, 664 mstile 1,9; run 1: Docker, locked down, 495 ms; run 2: Docker with gVisor, 681 mstile 2,9; run 1: Docker with gVisor, 699 ms; run 2: NVIDIA OpenShell, 1230 mstile 3,9; run 1: NVIDIA OpenShell, 937 ms; run 2: Kubernetes agent-sandbox, runc, 299 mstile 4,9; run 1: Kubernetes agent-sandbox, runc, 274 ms; run 2: Kubernetes agent-sandbox, gVisor, 3665 mstile 5,9; run 1: Kubernetes agent-sandbox, gVisor, 1760 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 985 mstile 6,9; run 1: E2B microVM, 1175 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 2001 mstile 7,9; run 1: E2B microVM, 2579 ms; run 2: Docker Cloud Sandboxes microVM, 4777 mstile 8,9; run 1: WebAssembly engine, 327 ms; run 2: Docker Cloud Sandboxes microVM, 2380 mstile 9,9; run 1: WebAssembly engine, 437 ms; run 2: Docker with gVisor, 756 mstile 10,9; run 1: Docker, locked down, 673 ms; run 2: NVIDIA OpenShell, 1194 mstile 11,9; run 1: Docker with gVisor, 724 ms; run 2: Kubernetes agent-sandbox, runc, 137 mstile 12,9; run 1: NVIDIA OpenShell, 898 ms; run 2: Kubernetes agent-sandbox, gVisor, 1019 mstile 13,9; run 1: Kubernetes agent-sandbox, runc, 122 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 3203 mstile 14,9; run 1: E2B microVM, 1502 ms; run 2: Kubernetes agent-sandbox, gVisor, 784 mstile 15,9; run 1: Docker Cloud Sandboxes microVM, 4322 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 2008 mstile 0,10; run 1: WebAssembly engine, 16 ms; run 2: E2B microVM, 1109 mstile 1,10; run 1: Docker, locked down, 500 ms; run 2: Docker Cloud Sandboxes microVM, 4217 mstile 2,10; run 1: WebAssembly engine, 21 ms; run 2: NVIDIA OpenShell, 1183 mstile 3,10; run 1: Docker, locked down, 566 ms; run 2: Kubernetes agent-sandbox, runc, 1526 mstile 4,10; run 1: Docker with gVisor, 784 ms; run 2: Kubernetes agent-sandbox, gVisor, 2630 mstile 5,10; run 1: NVIDIA OpenShell, 1291 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 941 mstile 6,10; run 1: E2B microVM, 2503 ms; run 2: Kubernetes agent-sandbox, runc, 1142 mstile 7,10; run 1: Docker Cloud Sandboxes microVM, 4358 ms; run 2: Kubernetes agent-sandbox, gVisor, 1995 mstile 8,10; run 1: WebAssembly engine, 110 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 2039 mstile 9,10; run 1: Docker, locked down, 566 ms; run 2: E2B microVM, 2101 mstile 10,10; run 1: Docker with gVisor, 623 ms; run 2: Docker Cloud Sandboxes microVM, 4316 mstile 11,10; run 1: WebAssembly engine, 395 ms; run 2: Kubernetes agent-sandbox, runc, 966 mstile 12,10; run 1: Docker, locked down, 630 ms; run 2: Kubernetes agent-sandbox, gVisor, 221 mstile 13,10; run 1: Docker with gVisor, 680 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 1980 mstile 14,10; run 1: E2B microVM, 2547 ms; run 2: NVIDIA OpenShell, 2130 mstile 15,10; run 1: Kubernetes agent-sandbox, runc, 1003 ms; run 2: Docker Cloud Sandboxes microVM, 3459 mstile 0,11; run 1: WebAssembly engine, 17 ms; run 2: Kubernetes agent-sandbox, gVisor, 235 mstile 1,11; run 1: Docker, locked down, 642 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 1027 mstile 2,11; run 1: Docker with gVisor, 590 ms; run 2: E2B microVM, 2383 mstile 3,11; run 1: NVIDIA OpenShell, 1332 ms; run 2: Docker Cloud Sandboxes microVM, 2495 mstile 4,11; run 1: WebAssembly engine, 26 ms; run 2: Kubernetes agent-sandbox, gVisor, 496 mstile 5,11; run 1: Docker, locked down, 612 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 379 mstile 6,11; run 1: Docker with gVisor, 587 ms; run 2: E2B microVM, 1083 mstile 7,11; run 1: NVIDIA OpenShell, 2172 ms; run 2: Docker Cloud Sandboxes microVM, 2058 mstile 8,11; run 1: WebAssembly engine, 39 ms; run 2: Kubernetes agent-sandbox, runc, 2009 mstile 9,11; run 1: Docker, locked down, 539 ms; run 2: Kubernetes agent-sandbox, gVisor, 214 mstile 10,11; run 1: Docker with gVisor, 603 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 6455 mstile 11,11; run 1: E2B microVM, 1392 ms; run 2: NVIDIA OpenShell, 1796 mstile 12,11; run 1: Docker Cloud Sandboxes microVM, 2156 ms; run 2: Kubernetes agent-sandbox, runc, 105 mstile 13,11; run 1: WebAssembly engine, 50 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 1763 mstile 14,11; run 1: Docker, locked down, 577 ms; run 2: E2B microVM, 1444 mstile 15,11; run 1: Docker with gVisor, 698 ms; run 2: Docker Cloud Sandboxes microVM, 3609 mstile 0,12; run 1: WebAssembly engine, 18 ms; run 2: NVIDIA OpenShell, 1237 mstile 1,12; run 1: Docker, locked down, 516 ms; run 2: Kubernetes agent-sandbox, runc, 249 mstile 2,12; run 1: Docker with gVisor, 814 ms; run 2: Kubernetes agent-sandbox, gVisor, 485 mstile 3,12; run 1: NVIDIA OpenShell, 1140 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 830 mstile 4,12; run 1: E2B microVM, 1395 ms; run 2: Kubernetes agent-sandbox, runc, 321 mstile 5,12; run 1: Docker Cloud Sandboxes microVM, 4059 ms; run 2: Kubernetes agent-sandbox, gVisor, 371 mstile 6,12; run 1: WebAssembly engine, 25 ms; run 2: E2B microVM, 950 mstile 7,12; run 1: Docker, locked down, 756 ms; run 2: Docker Cloud Sandboxes microVM, 3115 mstile 8,12; run 1: WebAssembly engine, 23 ms; run 2: Docker with gVisor, 721 mstile 9,12; run 1: Docker, locked down, 675 ms; run 2: NVIDIA OpenShell, 1153 mstile 10,12; run 1: Docker with gVisor, 844 ms; run 2: Kubernetes agent-sandbox, runc, 778 mstile 11,12; run 1: NVIDIA OpenShell, 1086 ms; run 2: Kubernetes agent-sandbox, gVisor, 369 mstile 12,12; run 1: Kubernetes agent-sandbox, runc, 2597 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 6107 mstile 13,12; run 1: E2B microVM, 1096 ms; run 2: Kubernetes agent-sandbox, gVisor, 447 mstile 14,12; run 1: Docker Cloud Sandboxes microVM, 3243 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 6151 mstile 15,12; run 1: WebAssembly engine, 21 ms; run 2: Docker Cloud Sandboxes microVM, 3178 mstile 0,13; run 1: WebAssembly engine, 20 ms; run 2: Docker, locked down, 370 mstile 1,13; run 1: Docker, locked down, 662 ms; run 2: Docker with gVisor, 643 mstile 2,13; run 1: Docker with gVisor, 757 ms; run 2: NVIDIA OpenShell, 1672 mstile 3,13; run 1: Kubernetes agent-sandbox, runc, 309 ms; run 2: NVIDIA OpenShell, 1667 mstile 4,13; run 1: Kubernetes agent-sandbox, runc, 3836 ms; run 2: Kubernetes agent-sandbox, gVisor, 553 mstile 5,13; run 1: Kubernetes agent-sandbox, gVisor, 192 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 371 mstile 6,13; run 1: E2B microVM, 1378 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 677 mstile 7,13; run 1: E2B microVM, 2365 ms; run 2: Docker Cloud Sandboxes microVM, 2372 mstile 8,13; run 1: WebAssembly engine, 23 ms; run 2: Docker, locked down, 466 mstile 9,13; run 1: Docker, locked down, 783 ms; run 2: Docker with gVisor, 691 mstile 10,13; run 1: Docker with gVisor, 553 ms; run 2: NVIDIA OpenShell, 1716 mstile 11,13; run 1: NVIDIA OpenShell, 1679 ms; run 2: Kubernetes agent-sandbox, runc, 3062 mstile 12,13; run 1: Kubernetes agent-sandbox, runc, 391 ms; run 2: Kubernetes agent-sandbox, gVisor, 1210 mstile 13,13; run 1: Kubernetes agent-sandbox, gVisor, 233 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 4139 mstile 14,13; run 1: E2B microVM, 2019 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 4054 mstile 15,13; run 1: E2B microVM, 2275 ms; run 2: Docker Cloud Sandboxes microVM, 2118 mstile 0,14; run 1: WebAssembly engine, 20 ms; run 2: Docker Cloud Sandboxes microVM, 2355 mstile 1,14; run 1: WebAssembly engine, 18 ms; run 2: Docker with gVisor, 539 mstile 2,14; run 1: Docker, locked down, 618 ms; run 2: NVIDIA OpenShell, 1972 mstile 3,14; run 1: Docker with gVisor, 521 ms; run 2: Kubernetes agent-sandbox, runc, 200 mstile 4,14; run 1: NVIDIA OpenShell, 1710 ms; run 2: Kubernetes agent-sandbox, gVisor, 848 mstile 5,14; run 1: Kubernetes agent-sandbox, runc, 1940 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 384 mstile 6,14; run 1: E2B microVM, 2364 ms; run 2: Kubernetes agent-sandbox, gVisor, 1046 mstile 7,14; run 1: Docker Cloud Sandboxes microVM, 2216 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 1940 mstile 8,14; run 1: WebAssembly engine, 26 ms; run 2: E2B microVM, 1355 mstile 9,14; run 1: Docker, locked down, 440 ms; run 2: Docker Cloud Sandboxes microVM, 4386 mstile 10,14; run 1: WebAssembly engine, 22 ms; run 2: NVIDIA OpenShell, 2064 mstile 11,14; run 1: Docker, locked down, 490 ms; run 2: Kubernetes agent-sandbox, runc, 1338 mstile 12,14; run 1: Docker with gVisor, 553 ms; run 2: Kubernetes agent-sandbox, gVisor, 213 mstile 13,14; run 1: NVIDIA OpenShell, 2167 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 980 mstile 14,14; run 1: E2B microVM, 2176 ms; run 2: Kubernetes agent-sandbox, runc, 736 mstile 15,14; run 1: Docker Cloud Sandboxes microVM, 4141 ms; run 2: Kubernetes agent-sandbox, gVisor, 226 mstile 0,15; run 1: WebAssembly engine, 23 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 1978 mstile 1,15; run 1: Docker, locked down, 450 ms; run 2: E2B microVM, 912 mstile 2,15; run 1: Docker with gVisor, 624 ms; run 2: Docker Cloud Sandboxes microVM, 2248 mstile 3,15; run 1: WebAssembly engine, 20 ms; run 2: Kubernetes agent-sandbox, runc, 148 mstile 4,15; run 1: Docker, locked down, 750 ms; run 2: Kubernetes agent-sandbox, gVisor, 229 mstile 5,15; run 1: Docker with gVisor, 713 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 886 mstile 6,15; run 1: E2B microVM, 2136 ms; run 2: NVIDIA OpenShell, 1796 mstile 7,15; run 1: Docker Cloud Sandboxes microVM, 4287 ms; run 2: Kubernetes agent-sandbox, runc, 130 mstile 8,15; run 1: WebAssembly engine, 24 ms; run 2: Kubernetes agent-sandbox, gVisor, 987 mstile 9,15; run 1: Docker, locked down, 706 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 783 mstile 10,15; run 1: Docker with gVisor, 620 ms; run 2: E2B microVM, 2143 mstile 11,15; run 1: NVIDIA OpenShell, 1924 ms; run 2: Docker Cloud Sandboxes microVM, 2093 mstile 12,15; run 1: WebAssembly engine, 21 ms; run 2: Kubernetes agent-sandbox, gVisor, 247 mstile 13,15; run 1: Docker, locked down, 459 ms; run 2: Kubernetes agent-sandbox, Kata Containers, 5975 mstile 14,15; run 1: Docker with gVisor, 554 ms; run 2: E2B microVM, 1123 mstile 15,15; run 1: NVIDIA OpenShell, 1863 ms; run 2: Docker Cloud Sandboxes microVM, 4300 ms
Each square matches a tile in the middle picture. Its upper triangle shows the first run's sandbox and its lower triangle the second's, shaded by isolation tier. Hover a square for the sandboxes and times, or a row of the table below to light up that sandbox's tiles.
processcontainerkernelvm

2. Split into 256 tiles

The Mandelbrot picture divided into a 16 by 16 grid of tiles
The picture cut into its 16 by 16 tile grid. Each square is one piece of work sent to two different kinds of sandboxes.

3. The finished picture

The Mandelbrot set, assembled from the tiles the sandboxes computed
The picture, assembled from the tiles whose two answers agreed. 512 by 512 pixels. Colours show how many repetitions each pixel's calculation took.

The sandboxes

SandboxProviderTierWhereRunsMedian runEst. cost
WebAssembly enginewasmprocessinside the daemon, on one laptop570.11 sfree
Docker, locked downdockercontainerone laptop570.62 sfree
Docker with gVisordockerkernelone laptop570.73 sfree
NVIDIA OpenShellopenshellcontainera local OpenShell gateway, one laptop571.27 sfree
Kubernetes agent-sandbox, runcagentsandboxcontainera kind cluster, one laptop560.55 sfree
Kubernetes agent-sandbox, gVisoragentsandboxkernela kind cluster, one laptop570.55 sfree
Kubernetes agent-sandbox, Kata Containersagentsandboxvma kind cluster, one laptop571.94 sfree
E2B microVMe2bvmE2B's cloud571.35 s$0.0039
Docker Cloud Sandboxes microVMdockercloudvmDocker's cloud573.31 s$0.0037

These times describe this run. The rooms used different concurrency, locations and assigned work, so the median column is not a controlled provider-speed comparison.

A median run is the time from dispatch to answer that the run's signed record states, sandbox start included. Cost is that time multiplied by each cloud's list price per second; the provider's bill is the real figure. Where a sandbox is, is the operator's statement; the record states the provider and the tier.

Why the two answers should agree

The tile program uses only floating-point operations whose rounding the JavaScript standard specifies exactly (addition, subtraction, multiplication, division and comparison on 64-bit numbers), so every conforming engine should print the same bytes for a tile: node in most rooms, QuickJS in the WebAssembly engine. A tile whose two answers differ is painted red and needs investigating: a sandbox that ran something other than it was given, a defect in an engine, or damaged output. Agreement shows the answers match; it does not prove either one correct or any sandbox secure.

What is signed, and what is stated

Signed by the harness key made for this run, after the client checked each run's record: every request (with the room it was sent to) and every answer, including the provider and the isolation tier the daemon reported and the run's start and end. A changed, missing or moved line fails the check below. Stated by the operator, in unsigned files beside the bundle: what each room is and where (rooms.json, with the engine and the list price), and when the run started and ended, which rooms sat out and why (run.json). A tier is the daemon's report: plimsoll's configuration and the provider's evidence plus a startup smoke test, never runtime attestation, and nothing here independently proves which machine ran the code.

Check it yourself

From a checkout of the repository:

go run ./examples/fanout -verify

It checks every signature in bundle.jsonl under harness.pub (key f9c9aaaeca5f77710d41587308b8f52fcc02f95c8306b751a7f0723e7dba530d), the chain that catches a line added, removed or moved, each signed record against the request and answer stored beside it, that each run's record states the provider and tier of the room it was sent to, and that this page and the picture are what the bundle and the two stated files render. It then reports the result separately: a run with tiles that disagree still verifies, and says so. It starts no sandbox.

Words on this page

Sandbox
A place to run code someone else wrote without letting it reach the machine around it. Here each run gets a fresh one.
Isolation tier
How strong the wall is, weakest to strongest: process (a WebAssembly engine inside plimsoll's own process), container (Linux namespaces and a filter on system calls), kernel (gVisor, a separate kernel that answers the code's system calls), vm (a virtual machine with its own kernel). A tier is plimsoll's configuration and the provider's evidence plus a startup smoke test, never runtime attestation.
Fan-out, fan-in
Sending pieces of one job to many workers at once, then gathering the answers into one result.
Signed bundle
One file holding every run's request, answer and record, each signed by a key made for this run, linked in order so a missing or moved line is caught.
Placement
plimsoll's library that holds several daemons as one pool and sends each request to one of them.

Run 2026-10-23 20:00 UTC. Grid 16 by 16 tiles of 32 by 32 pixels. Rendered from the signed bundle by go run ./examples/fanout.