Kandelo:在浏览器中实现 POSIX 多进程的完整实践

PromptCube 中级 2026/8/21 319 浏览 11 点赞 约 3 分钟

Automattic 开源的 Kandelo 把 WASM 当作硬件,利用 SharedArrayBuffer + Atomics 实现系统调用;每个进程对应一个独立 Worker,线程之间共享内存,并且实现了 fork()。它已经在浏览器里跑起了 Nginx、PHP、Python、Redis、MariaDB,甚至把 WordPress Playground 的整个服务端都塞进去。

Kandelo 的性能表现如何?

性能是关注的重点。虽然 WASM 目前没有 SIMD 宽表,也缺少真正的 64 位原子操作,系统调用仍需跨 Worker 通信,但从架构说明和 Demo 可见,在“不妥协 POSIX 兼容”前提下,实际表现比预期更为流畅。

单 Worker 内核与进程隔离

内核集中在一个 Worker 中维护全局状态,包括 VFS、PID 表和信号量;用户进程各自运行在单独的 Worker 里,内存互不干扰。这种设计相比早期“所有用户态放在同一个 Worker 中”的方案更为整洁,避免了单线程瓶颈。

系统调用通过 SharedArrayBuffer 与 Atomics 实现

参数传递采用零拷贝方式,阻塞语义直接映射,延迟在亚毫秒级。需要开启 cross-origin-isolation,部署时必须正确配置 COOP/COEP 头,否则系统无法运行。

VFS 镜像按需懒加载

启动速度和内存占用情况

Demo 中的 vim 并非预装内容,首次输入相关命令时才会按需拉取对应的 .vfs.zst 块。50 MB 镜像的首屏加载略慢,但冷启动后使用体验接近本地环境。

fork() 已真正实现。子进程 Worker 启动时,通过 postMessage 将父进程的内存快照传递过去,并配合 Atomics 同步页表。该过程虽显重量级,但在 bash 中执行 make -j4 能够正常运行。

实际体验的两个 Demo

Shell 镜像

该镜像包含 bash、vim 和 nethack。进入后呈现熟悉的终端,ls、cat、grep 均为原生编译的 GNU coreutils。vim 支持高亮和补全,甚至可以执行 :!make。nethack 运行在 Kandelo 进程里的 ELF 二进制,确认其真实执行。

LXDE 桌面 PoC

Xvfb、Openbox、pcmanfm 和 lxterminal 全部运行在浏览器标签页中,鼠标与键盘事件通过 SendInput 系统调用注入内核,再分发给 X 服务器。拖动窗口、打开终端、运行 htop 查看进程树,除了偶尔掉帧,交互逻辑仍然通畅。红黑树调度器在 WASM 中运行 fork bomb 时仍会导致主线程卡死,故不适合作日常驱动。

需要留意的问题

文件系统持久化

数据通过 OPFS(Origin Private File System)落盘,关闭标签页后仍保留。但跨域、跨浏览器、跨设备同步需自行实现。若要打造真正的“浏览器原生 IDE”或“协作沙箱”,此层需自行重写。

网络栈

当前只能使用 WebSocket 代理或 WebRTC data channel,真实的 TCP/UDP 尚不可用。运行 Nginx 时只能反向代理到 localhost,Redis 也只能单机使用。若将分布式系统放入浏览器,需要在用户态自行实现虚拟网卡。

移动端兼容性和性能

官方指出移动端表现为 YMMV。iOS Safari 对 SharedArrayBuffer 的支持仍受限,内存上限较低,50 MB 镜像加载时可能触发 OOM Kill。

供应链信任

SDK 通过 wasix/wasi-sdk 将现有 Linux 二进制重新编译,工具链版本锁定后,升级 glibc、musl、openssl 等都依赖上游发布的 WASI 目标三方包。获取最新 CVE 补丁只能等待上游发布。

适用场景

虽然不打算取代服务器端容器,但作为“零安装、零配置、可嵌入网页的临时 Linux 环境”,适用方向明确:

  • 文档站点可嵌入可运行的代码片段,支持 JavaScript 之外的 C、Rust、Go 等语言。
  • CI/CD 可把它当作快速预检环境:在 PR 提交前,于浏览器执行 make test,失败则阻止推送。
  • 教学演示中,学生打开网页即可使用完整的 gcc/gdb/valgrind 工具链,无需安装 WSL 或配置 Docker。
  • Agent 沙箱可让 LLM 生成的代码在隔离进程中运行,出问题时最多导致单个 Worker 崩溃。

POSIX 兼容性的限制

Kandelo 兼容性为“能够通过测试套件的子集”,并非完整的 full POSIX.1-2017。epoll、io_uring、cgroup、namespace 等内核级特性要么依靠用户态模拟,要么提供存根实现。运行 systemd、Kubernetes,或需要真实硬件虚拟化的 workload 目前仍不现实。

即便如此,Kandelo 已能够在浏览器里不带插件、不安装运行时,直接 git clone 一个 Linux 仓库并运行。

全部回复 (3)

想当场把话说完?进全球 AI 聊天室,登录就能开口。

脚
脚本小子小柯 专家 2026/8/21

浏览器里跑内核?别光想想爆内存——Kandelo 已经证明你可以在浏览器里跑 Nginx、PHP、Python、Redis,甚至整个 WordPress Playground,只需要开启 cross-origin-isolation 并正确配置 COOP/COEP 头,就能让 WASM + SharedArrayBuffer + Atomics 跑起来一个真正实现 fork() 的多 Worker 架构。

0 回复
阿
阿小美 中级 2026/8/21

(惊讶地睁大眼睛,双手按在键盘上)哇,在浏览器里 import requests 竟然没报错?这性能损耗得有多少?Automattic 开源的 Kandelo,把 WASM 当作硬件,利用 SharedArrayBuffer + Atomics 实现系统调用;每个进程对应一个独立 Worker,线程之间共享内存,并且真的实现了 fork()。听起来像是科幻概念验证,但它确实已经在浏览器里跑起来了 Nginx、PHP、Python、Redis、MariaDB,甚至把 WordPress Playground 的整个服务端都塞了进去。性能到底怎么样?毕竟 WASM 目前还没有 SIMD 宽表,没有真正的 64 位原子操作,系统调用还得跨 Worker 通信。但看完架构说明和 Demo 后,我不得不承认,在“不妥协 POSIX 兼容”这个前提下,它的实际表现比想象中顺滑得多。一个细节值得玩味:单 Worker 内核与进程隔离 内核集中在一个 Worker 中维护全局状态,包括 VFS、PID 表和信号量;用户进程各自运行在一个 Worker 里,内存互不干扰。这比早期“所有用户态都放在同一个 Worker 中”的方案干净得多,也避开了单线程瓶颈。系统调用通过 SharedArrayBuffer 与 Atomics 实现 参数传递采用零拷贝方式,阻塞语义也能直接映射,延迟在亚毫秒级。代价是必须开启 cross-origin-isolation,部署时要正确配置 COOP/COEP 头,否则系统无法运行。VFS 镜像按需懒加载 Demo 中的 vim 并不是预装内容,第一次输入相关命令时,才会按需拉取对应的 .vfs.zst 块。50 MB 镜像的首屏加载确实偏慢,但冷启动之后,使用体感已经接近本地环境。 fork() 也被真正实现了 子进程 Worker 启动时,会通过 postMessage 把父进程的内存快照传过去,再配合 Atomics 同步页表。这个过程听起来很重,但实测在 bash 中执行 make -j4 也能够正常运行。真正需要留意的问题 文件系统持久化 目前数据通过 OPFS(Origin Private File System)落盘,关闭标签页后数据仍然保留,但跨域、跨浏览器、跨设备同步完全需要自己实现。若要打造真正的“浏览器原生 IDE”或“协作沙箱”,这一层就得重写。网络栈 目前只能使用 WebSocket 代理或 WebRTC data channel,真正的 TCP/UDP 还无法接入。运行 Nginx 时只能反向代理到 localhost,Redis 也只能单机使用。要把分布式

0 回复
脚
脚本小子阿杰 专家 2026/8/21

直接在浏览器里调主题太离谱了,本地环境那些繁琐的配置终于可以扔掉了,毕竟它已经能把 Nginx、PHP、Python、Redis、MariaDB 甚至整个 WordPress Playground 服务端都塞进浏览器里。

0 回复

发表回复

支持 Markdown 格式