测量内容与方法
三个应用均运行在同一台 Mac 上:Apple M5 Max,36 GiB 内存,macOS 27.2。每个应用均配置为 8 个 CPU 和 12 GiB,使用各自的命令重新启动,且单独运行;其他应用已退出,并已确认没有残留进程。空闲数据来自等待 45 秒稳定后的一段 60 秒测量窗口,计入产品运行的所有进程:应用本身、辅助进程以及包含 Linux 系统的引擎。容器数据取预热后五次采样的中位数,差距在 10 % 以内视为持平。
Oxcart 0.1.2 于 2026-10-10 使用随附的 docker 29.9 客户端测量。OrbStack 2.2.3 和 Docker Desktop 4.94.0 于同一天较早时段,在同一台 Mac 上使用相同测量工具和 docker 29.4 测量。各产品运行各自的 Linux 内核。这是在一台机器上对每个产品进行的一轮测试,不是一项研究;所有产品采用相同方法。
无容器时的内存占用
| 应用 | 空闲时内存占用 |
|---|---|
| Oxcart 0.1.2 | 776 MiB |
| OrbStack 2.2.3 | 792 MiB |
| Docker Desktop 4.94.0 | 1,745 MiB |
这是容器应用仅为随时待命而占用的内存:两次工作之间、开会期间,或在整天开着应用的笔记本电脑上。Oxcart 与 OrbStack 在这一项持平;Docker Desktop 保留的内存超过两倍。
监控容器的开销
仪表盘、终端监控工具和编程智能体会不断轮询容器统计数据,因此读取这些数据的开销比看起来更重要。
| 指标 | Oxcart | OrbStack | Docker Desktop |
|---|---|---|---|
一个持续输出的 docker stats 客户端的 CPU 占用 | 1.29% | 3.81% | 5.45% |
docker stats --no-stream | 1,038 ms | 2,050 ms | 2,054 ms |
CPU 占用以单个核心的百分比表示。Oxcart 0.1.2 于 2026-10-10 使用随附的 docker 29.9 客户端测量;OrbStack 2.2.3 和 Docker Desktop 4.94.0 于同一天较早时段,在同一台 Mac 上使用相同测量工具和 docker 29.4 测量。
运行 20 个容器时,Oxcart 自身的菜单栏项目占用一个核心的 0.0004%,每秒产生 0.033 次唤醒。该数据仅涵盖应用本身,不包含引擎。
负载运行时:持平
容器开始执行实际工作后,各应用的结果趋于一致,因为主要开销来自工作本身。以下为同一轮测试中的两项数据:
| 指标 | Oxcart | OrbStack | Docker Desktop |
|---|---|---|---|
| 容器内每 CPU 秒对应的 Mac CPU 用量 | 1.10× | 1.11× | 1.09× |
| 每个访问 256 MiB 内存的容器对应的 Mac 内存占用 | 235 MiB | 266 MiB | 236 MiB |
实际意义是:受 CPU 限制的构建或测试在这三个应用中消耗的 Mac CPU 大致相同;一个使用 256 MiB 的容器,在 Mac 上也大约占用这么多内存。差别在于工作前后的操作:每次 docker run、stop 和清理需要多久,这正是 Oxcart 领先的地方(对比 Docker Desktop、对比 OrbStack)。
工作结束后:内存归还 macOS
从 Oxcart 0.1.3 起,在最后一个容器停止约 30 s 后,Oxcart 会重启 Linux 端,将内存归还给 macOS:最后一个容器停止 32 s 后,从 3,319 MiB 降至 570 MiB(第二轮:从 3,352 降至 579 MiB)。只有在没有容器运行时才会执行此操作。重启在后台进行;此时到来的 Docker 命令只需等待重启完成。
使用 Oxcart 0.1.3 测量。
在自己的 Mac 上测量容器应用的内存
- 从空闲的 Mac 开始。 退出其他容器应用,停止容器,并在应用启动后等待一分钟,让启动工作完成。
- 找到应用运行的所有进程。 在“活动监视器”中打开“内存”标签页,搜索应用名称;运行 Linux 端的进程通常最大。在终端中,
ps -axo pid,rss,comm | grep -i <app>可列出这些进程。 - 读取 macOS 计入的内存。 使用“活动监视器”的“内存”列,或对每个进程运行
footprint <pid>,然后相加。仅看常驻内存大小(RSS)可能高估或低估共享内存和压缩内存。 - 在工作负载运行时测量。 启动平时使用的 Compose 服务栈,使用几分钟,然后再次读取相同数据。
docker stats --no-stream会显示 Linux 端每个容器的用量。 - 停止后再次测量。 停止所有工作,一分钟后再次读取数据。这就是应用在两次工作之间空闲时保留的内存。
值得关注的设置
- 应用限制。 每个应用都会限制 Linux 端可使用的 CPU 和内存。在 Oxcart 中:Settings › Resources,或使用
oxcart config set cpus=6和oxcart config get;设置在下次启动时生效。把上限设得远高于服务栈需求没有额外收益。 - 每容器限制。
docker run的--memory、--cpus和--pids-limit,或 Compose 的mem_limit、cpus和pids_limit,可以防止一个失控服务占满所有资源。 - 停止不用的服务。 之后还会使用的服务栈用
docker compose stop,不再需要的用docker compose down。在 Oxcart 中,停止最后一个容器也会让内存得以归还给 macOS。 - 降低监控开销。 在脚本中优先使用
docker stats --no-stream,并给编程智能体提供摘要工具,而非原始统计数据(面向 AI 编程智能体的 Docker)。
常见问题
Docker 在 Mac 上使用多少内存?
这取决于应用以及容器执行的工作。在一台配置为 12 GiB 的 Apple 芯片 Mac 上,没有容器运行时,计入各产品的所有进程后,我们测得 Oxcart 为 776 MiB,OrbStack 为 792 MiB,Docker Desktop 为 1,745 MiB。容器开始运行后,内存用量随工作负载而变化。
为什么 Docker Desktop 占用这么多内存?
Mac 上的每个容器应用都运行一个 Linux 系统,工作负载访问的内存会在 Mac 上显示为一个大进程。在我们的测量中,Docker Desktop 的空闲占用也是三个应用中最高的:没有容器时为 1,745 MiB。可以在设置中降低内存上限、停止不用的容器,并对比 Oxcart 等替代方案;它在同一台 Mac 上的空闲占用为 776 MiB。
Oxcart 会把内存归还给 macOS 吗?
会,只要没有容器运行。从 Oxcart 0.1.3 起,在最后一个容器停止约 30 s 后,Oxcart 会重启 Linux 端,将内存归还给 macOS:在发布前版本的一次测量中,最后一个容器停止 32 s 后,内存从 3,319 MiB 降至 570 MiB。只有在没有容器运行时才会执行此操作。
如何限制容器的内存和 CPU?
对单个容器使用 docker run --memory 512m --cpus 1.5 …,或在 Compose 服务中设置 mem_limit 和 cpus。Oxcart 通过 docker update 应用内存、CPU 和进程数量限制的更新,即使容器因重启而重新创建,这些设置也会保留。
如何设置 Oxcart 可使用的 CPU 数量和内存?
在 Settings › Resources 中设置,或在终端使用 oxcart config set cpus=4,并用 oxcart config get 查看实际生效值和 Mac 的上限。新设置在下次启动时生效。
docker stats 会拖慢 Mac 吗?
持续运行的 docker stats 数据流在每个应用中都会消耗 CPU。我们测得 Oxcart 占用一个核心的 1.3 %,OrbStack 为 3.8 %,Docker Desktop 为 5.5 %;Oxcart 是三者中最低的。对 20 个容器执行一次 docker stats --no-stream,Oxcart 用时 1.0 s,约为另外两个应用的一半。
来源与方法
- Oxcart 0.1.2、OrbStack 2.2.3 和 Docker Desktop 4.94.0,于 2026-10-10 在同一台 Mac(Apple M5 Max、36 GiB、macOS 27.2)上测量,每个应用均配置为 8 个 CPU 和 12 GiB,每次只运行一个产品。
- 最后一个容器停止后的内存归还:Oxcart 0.1.3。
- 菜单栏开销:于 2026-10-09 使用 Oxcart 测量。