跳转到内容

Soltesz 2007 — 容器:比虚拟机轻一档的隔离方案

待复核

这篇论文给”容器”这个词写下了一份系统的工程对照:让一台机器假装自己是几十台机器,但所有租户共用一个 Linux 内核

日常类比:

  • 虚拟机像在一栋楼里给每户人家盖独立的房子——每户都有自己的地基、墙、屋顶(独立操作系统)。
  • 容器像在一栋大楼里隔出独立公寓——共享地基和承重墙(共享内核),但门、窗、水电表各自独立(命名空间、配额)。

作者实现的系统叫 Linux-VServer,2001 年起以补丁形式给 Linux 内核打增强。论文用它对比 Xen 这种 hypervisor,证明在多数服务器工作负载下容器密度更高、开销更低。

不读这篇,下面这些事讲不清根:

  • Docker 不是凭空冒出来的——2013 年 Docker 火爆时,内核里 namespace(命名空间)和 cgroups(资源配额)已有多年准备,这篇是 Linux 容器路线的上游证据
  • “为什么有了虚拟机还要容器”——这篇是 Linux 容器相对 Xen 的一次系统 benchmark 对照,用数据回答取舍
  • PlanetLab 全球研究网络当时已经用 VServer 在几百个节点上跑上千 slice,说明这套思路在工业上已被验证
  • 现在云厂商谈”裸金属 vs 虚拟机 vs 容器”三档隔离,第三档的工程定义就在这里

容器要做的事可以拆成 三层隔离

  1. 命名空间隔离(视图层):每个容器看到自己的 PID 列表、文件树、网络接口、用户 ID。类比:每户公寓有自己的门牌和信箱,互不串门。两个容器都能有 PID 1,谁也看不到对方。
  2. 资源隔离(量级层):CPU 时间、内存上限、磁盘 IO、网络带宽——每个容器一份配额,调度器按配额分。类比:每户水电表独立计费,不能无限偷邻居的电。
  3. 安全隔离(权限层):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

逐部分解释

  1. 测什么:同一硬件、同一类服务器负载,只换隔离方案
  2. 读数字:VServer 接近 native;Xen 在租户变多时先掉吞吐,再掉密度
  3. 结论:对相互信任的多租户(同组织、研究网络),容器密度优势压倒虚拟机

案例 2:用一条命令感受”视图隔离”

Section titled “案例 2:用一条命令感受”视图隔离””

今天不必装 VServer,用 Docker 就能摸到同一类效果(主线用 namespace/cgroups 实现,思路同源、API 不同):

Terminal window
docker run --rm -it ubuntu bash
ps -ef
# 容器里几乎只看到自己的进程;宿主上其实还有很多别的进程

逐部分解释

  • docker run ... ubuntu bash:起一个隔离环境,进交互 shell
  • ps -ef:看进程列表——你以为”整台机器只有这些”,其实只是 PID 命名空间把视图裁掉了
  • 这就是论文里 context 的”视图层”:不是删掉别人的进程,是让你看不见
Terminal window
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+ 户。密度差直接变成单位成本差。

  1. 共享内核是双刃剑:内核漏洞(如 Dirty COW 2016)能让容器内 root 变成宿主 root——论文已预警,至今仍是容器与虚拟机的根本差别。
  2. 资源核算不全:早期 VServer 主要管 CPU/内存,page cache、文件描述符等”灰色资源”能被租户互抢;后来 cgroups v2 才把核算面铺满。
  3. 不是所有负载都该上容器:要跑不同内核版本、硬隔离合规、或 Windows——虚拟机仍是答案。
  4. PlanetLab 经验有偏:benchmark 偏服务器场景;桌面、GPU、有状态库当年覆盖不足,工业界后来补了很久。

适用

  • 多租户 Web/API(同组织、相互信任)
  • CI/CD 沙箱、构建机
  • 微服务 / Serverless 底座;一台机器要装很多轻量进程组

不适用

  • 不同操作系统共存(Linux + Windows 共主机)
  • 强对抗多租户(公有云客户互不信任)→ Firecracker / Kata 等轻量 VM
  • 需要独立内核版本或深度改调度器的应用 → 共享内核容器不够用
  • 1979–2004chroot → FreeBSD jails → Solaris Zones,文件系统/进程/配额隔离逐步加厚
  • 2001:Linux-VServer 起步,给 Linux 加 context;PlanetLab 用它在全球节点上跑上千 slice
  • 2007:Soltesz 等(合著者含 PlanetLab 发起人 Larry Peterson)写下相对 Xen 的系统对照
  • 2008–2013:cgroups / LXC 进主线生态;Docker 加上镜像与分层文件系统后大流行。VServer 未进主线,但同一思路被主线以不同 API 吸收
  1. 隔离是分级的——共享内核 / 共享硬件 / 完全独立,每一档都有甜蜜点
  2. 密度是真问题——“一台机能装多少租户”直接决定云的单位经济
  3. 学术系统的命运不在论文本身——VServer 没进主线,却推动主线吸收同类概念
  4. 对照实验可以很朴素——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 里的早期讨论

(暂无反向链接)