Soltesz 2007 — 容器:比虚拟机轻一档的隔离方案
待复核这篇论文给”容器”这个词写下了一份系统的工程对照:让一台机器假装自己是几十台机器,但所有租户共用一个 Linux 内核。
日常类比:
- 虚拟机像在一栋楼里给每户人家盖独立的房子——每户都有自己的地基、墙、屋顶(独立操作系统)。
- 容器像在一栋大楼里隔出独立公寓——共享地基和承重墙(共享内核),但门、窗、水电表各自独立(命名空间、配额)。
作者实现的系统叫 Linux-VServer,2001 年起以补丁形式给 Linux 内核打增强。论文用它对比 Xen 这种 hypervisor,证明在多数服务器工作负载下容器密度更高、开销更低。
不读这篇,下面这些事讲不清根:
- Docker 不是凭空冒出来的——2013 年 Docker 火爆时,内核里 namespace(命名空间)和 cgroups(资源配额)已有多年准备,这篇是 Linux 容器路线的上游证据
- “为什么有了虚拟机还要容器”——这篇是 Linux 容器相对 Xen 的一次系统 benchmark 对照,用数据回答取舍
- PlanetLab 全球研究网络当时已经用 VServer 在几百个节点上跑上千 slice,说明这套思路在工业上已被验证
- 现在云厂商谈”裸金属 vs 虚拟机 vs 容器”三档隔离,第三档的工程定义就在这里
容器要做的事可以拆成 三层隔离:
- 命名空间隔离(视图层):每个容器看到自己的 PID 列表、文件树、网络接口、用户 ID。类比:每户公寓有自己的门牌和信箱,互不串门。两个容器都能有 PID 1,谁也看不到对方。
- 资源隔离(量级层):CPU 时间、内存上限、磁盘 IO、网络带宽——每个容器一份配额,调度器按配额分。类比:每户水电表独立计费,不能无限偷邻居的电。
- 安全隔离(权限层):root 在容器里仍是 root,但限定在容器自己的命名空间内;不能改宿主内核、不能看宿主进程。类比:你是自家的户主,但管不了整栋楼的总闸。
VServer 把这三层加进 Linux 内核,叫做 context(上下文)。一个 context 就是一个容器。
| 维度 | 虚拟机(Xen) | 容器(VServer) |
|---|---|---|
| 隔离强度 | 强(独立内核) | 弱(共享内核) |
| 启动时间 | 秒到几十秒 | 毫秒级 |
| 内存开销 | 每 VM 一份完整 OS | 共享 page cache,单租户几 MB |
| 密度(同机几租户) | 几十 | 几百到上千 |
| 跨内核版本 | 可以 | 不行 |
案例 1:读懂论文的核心对照实验
Section titled “案例 1:读懂论文的核心对照实验”作者在同一台双核 Xeon 上分别跑 Xen 3.0 和 VServer,逐步加租户。可以把它想成一张对照表:
负载 | VServer | Xen 3.0--------------|------------------|------------------OLTP 数据库 | 接近裸机 | 4 个 VM 吞吐约 -30%内核编译 | 几乎无损耗 | 约 -25%(内存隔离代价)同机最大租户 | 100+ | 内存吃紧后 < 10逐部分解释:
- 测什么:同一硬件、同一类服务器负载,只换隔离方案
- 读数字:VServer 接近 native;Xen 在租户变多时先掉吞吐,再掉密度
- 结论:对相互信任的多租户(同组织、研究网络),容器密度优势压倒虚拟机
案例 2:用一条命令感受”视图隔离”
Section titled “案例 2:用一条命令感受”视图隔离””今天不必装 VServer,用 Docker 就能摸到同一类效果(主线用 namespace/cgroups 实现,思路同源、API 不同):
docker run --rm -it ubuntu bashps -ef# 容器里几乎只看到自己的进程;宿主上其实还有很多别的进程逐部分解释:
docker run ... ubuntu bash:起一个隔离环境,进交互 shellps -ef:看进程列表——你以为”整台机器只有这些”,其实只是 PID 命名空间把视图裁掉了- 这就是论文里 context 的”视图层”:不是删掉别人的进程,是让你看不见
案例 3:配额怎么落到具体数字
Section titled “案例 3:配额怎么落到具体数字”docker run --rm -m 512m --cpus=1 ubuntu bash -c 'cat /sys/fs/cgroup/memory.max 2>/dev/null || cat /sys/fs/cgroup/memory/memory.limit_in_bytes'逐部分解释:
-m 512m:内存上限 512MB,走 cgroup memory controller(资源配额控制器)--cpus=1:最多用满 1 个 CPU,走 cpu controller- 读到的数字就是”水电表上限”——论文资源隔离层的现代主线写法
密度含义:64GB 机器上,Xen 每 VM 常要 ≥1GB OS 开销 → 约 30 户;容器元数据仅几十 MB → 200+ 户。密度差直接变成单位成本差。
- 共享内核是双刃剑:内核漏洞(如 Dirty COW 2016)能让容器内 root 变成宿主 root——论文已预警,至今仍是容器与虚拟机的根本差别。
- 资源核算不全:早期 VServer 主要管 CPU/内存,page cache、文件描述符等”灰色资源”能被租户互抢;后来 cgroups v2 才把核算面铺满。
- 不是所有负载都该上容器:要跑不同内核版本、硬隔离合规、或 Windows——虚拟机仍是答案。
- PlanetLab 经验有偏:benchmark 偏服务器场景;桌面、GPU、有状态库当年覆盖不足,工业界后来补了很久。
适用 vs 不适用场景
Section titled “适用 vs 不适用场景”适用:
- 多租户 Web/API(同组织、相互信任)
- CI/CD 沙箱、构建机
- 微服务 / Serverless 底座;一台机器要装很多轻量进程组
不适用:
- 不同操作系统共存(Linux + Windows 共主机)
- 强对抗多租户(公有云客户互不信任)→ Firecracker / Kata 等轻量 VM
- 需要独立内核版本或深度改调度器的应用 → 共享内核容器不够用
历史小故事(可跳过)
Section titled “历史小故事(可跳过)”- 1979–2004:
chroot→ FreeBSD jails → Solaris Zones,文件系统/进程/配额隔离逐步加厚 - 2001:Linux-VServer 起步,给 Linux 加 context;PlanetLab 用它在全球节点上跑上千 slice
- 2007:Soltesz 等(合著者含 PlanetLab 发起人 Larry Peterson)写下相对 Xen 的系统对照
- 2008–2013:cgroups / LXC 进主线生态;Docker 加上镜像与分层文件系统后大流行。VServer 未进主线,但同一思路被主线以不同 API 吸收
- 隔离是分级的——共享内核 / 共享硬件 / 完全独立,每一档都有甜蜜点
- 密度是真问题——“一台机能装多少租户”直接决定云的单位经济
- 学术系统的命运不在论文本身——VServer 没进主线,却推动主线吸收同类概念
- 对照实验可以很朴素——PostgreSQL / 内核编译就够把”容器 vs VM 的甜蜜点”讲清
- 论文 PDF:Soltesz et al. 2007(benchmark 部分必看)
- xen-2003 —— 同时代 hypervisor 代表作,本论文的对照组
- kvm-2007 —— Linux 把虚拟化作为内核模块的另一条路
- borg —— Google 内部容器调度,同期工业界另一条线
- 维基百科:Linux-VServer
- xen-2003 —— 强隔离路线代表,本论文的直接 benchmark 对手
- kvm-2007 —— 同年另一思路:把虚拟化做成 Linux 模块
- borg —— Google 同期已用容器调度
- borg-omega-kube-2016 —— 容器调度推向开源主流的演进
- exokernel-1995 —— 另一种 OS 隔离哲学:策略交给应用
- the-os-1968 —— 隔离/多任务在 OS 里的早期讨论
(暂无反向链接)