第 6 章 · 系统与性能工程

“前 5 章我们造了很多东西。这一章解决一个问题:怎么知道它们跑得好不好,怎么让它们跑得更快。“


本章覆盖的课程

编号课程本章的产出
105容器实战高手课手写容器运行时(namespace + cgroup)
017Linux 性能优化实战性能方法论 + eBPF 观测工具链

章节结构

文档内容
00-设计推演:从零造一个容器.md★ 必读开篇:从裸进程的七宗罪出发,逐条推导出 chroot→namespace→cgroup v1→v2→capabilities/seccomp→OverlayFS
01-容器原理:namespace、cgroup 与手写运行时.md隔离的四个维度、cgroup v2、手写 mini-docker
02-性能工程:从观测到调优.mdUSE 方法、火焰图、eBPF、Go 特有的调优

★ 先读 00-设计推演。 它不讲”容器有哪些特性”,而是从”三个进程直接跑会出什么事”开始, 列一张七条的失败清单,然后逐条消灭——每消灭一条,就对应一个内核特性。

你会特别记住其中一条:chroot 不是安全特性,它能被逃逸。 这就是为什么必须有 pivot_root + user namespace。


学完这一章,你应该能

  1. 解释容器和虚拟机的本质区别(不是”轻量级 VM”)
  2. 用 Go 手写一个容器运行时(能跑 /bin/sh,有资源限制)
  3. 解释 cgroup v1 和 v2 的差异,以及 memory.oom 的常见坑
  4. 用 USE 方法系统性地排查性能问题
  5. 读懂火焰图,定位真正的热点
  6. 用 eBPF 做无侵入的观测
  7. 建立一套自己的性能调优流程

贯穿全章的核心思想

思想 1:没有测量就没有优化

这句话被说滥了,但真正做到的人很少。

反面教材:第 1 章的小林,查了一周的 P0 事故,因为他假设瓶颈在应用层。

正确的流程:

① 明确目标(P99 < 50ms?吞吐 > 10万 QPS?)
② 建立基线(现在是多少?)
③ 测量(到底哪里慢?)
④ 定位(瓶颈在哪个组件、哪个函数、哪行代码)
⑤ 优化
⑥ 验证(真的改善了吗?改善了具体多少?)
⑦ 回到 ②(瓶颈会转移)

跳过 ③ 和 ④ 直接做 ⑤,90% 的情况下你在优化一个不是瓶颈的东西。

思想 2:容器的本质不是”轻量虚拟化”

容器 = 一组 Linux 内核特性的组合:

namespace  → 隔离"看到什么"(视图隔离)
cgroup     → 限制"能用多少"(资源限制)
chroot/pivot_root → 隔离"文件系统"
capabilities → 限制"能做什么"(权限)
seccomp    → 限制"能调哪些系统调用"

容器里的进程就是宿主机上的普通进程,没有虚拟化层,没有额外的内核。

这就是为什么”容器比虚拟机轻”——不是因为”更少的资源”,而是因为根本没有第二层内核。


开始阅读:00-设计推演:从零造一个容器