硬件 内核 虚拟化 容器化
下面是从硬件 -> 内核 -> 虚拟化 -> 容器化的一体化认知框架,不是零散知识点,而是一条完整技术演进链。
用 NUMA / Namespace / cgroups / overlay2 / systemd 串起来。
┌───────────────────────────────┐
│ 硬 件 (Hardware) │
│ CPU / 内存 / 磁盘 / 网卡 / NUMA │
└──────────────┬────────────────┘
↓
┌───────────────────────────────┐
│ Linux 内核 (Kernel) │
│ 调度 / 内存 / 网络 / IO / 中断 │
└──────────────┬────────────────┘
↓
┌───────────────────────────────┐
│ 虚拟化 (Virtualization) │
│ KVM / QEMU / vCPU / vNUMA │
└──────────────┬────────────────┘
↓
┌───────────────────────────────┐
│ 容器化 (Containers) │
│ Namespace + cgroups + FS │
└───────────────────────────────┘
核心:
- 虚拟化 是 “造一台假机器”
- 容器化 是 “在同一个内核里分世界”
关键点
- Core / Thread(HT)
- Cache(L1/L2/L3)
- NUMA(多路服务器)
Linux 视角
lscpu
numactl --hardware
📌 内核调度器必须感知 NUMA,否则性能直接腰斩
- DRAM
- NUMA Node
- HugePage
- Swap
Linux 抽象:
- 虚拟内存
- Page Cache
- Slab
📌 数据库 / JVM 最怕:
- 跨 NUMA 访问
- THP 不受控
- HDD / SSD / NVMe
- 队列深度
- 中断 & 软中断
Linux:
- VFS
- Block Layer
- IO Scheduler(mq-deadline / none)
- RSS
- 多队列
- NUMA 亲和
Linux:
- NAPI
- softirq
- RPS / XPS
| 子系统 | 作用 |
|---|---|
| Scheduler | CPU 调度 |
| Memory | 内存管理 |
| VFS | 文件系统 |
| Networking | 网络栈 |
- 把硬件变成抽象资源
- 把资源公平或可控地分给进程
📌 一切隔离、限制都发生在内核
多操作系统并存
- 不同内核
- 不同 OS
- 强隔离
KVM = Linux 内核模块
QEMU = 用户态设备模拟
- CPU:硬件虚拟化(VT-x / AMD-V)
- 内存:EPT / NPT
- IO:virtio
- vCPU 映射到 pCPU
- vNUMA 对齐物理 NUMA
📌 数据库虚拟机必须开 vNUMA
| 项 | 成本 |
|---|---|
| CPU | 低 |
| 内存 | 中 |
| IO | 高 |
- 共享宿主内核
- 共享驱动
- 共享调度器
📌 这就是快的原因
| 技术 | 作用 |
|---|---|
| Namespace | 隔离 |
| cgroups | 限制 |
| RootFS | 文件视图 |
- PID
- NET
- MOUNT
- UTS
- USER
- CPU
- Memory
- IO
- PIDs
lowerdir(镜像)
upperdir(写层)
merged
📌 copy-on-write
| 维度 | 虚拟机 | 容器 |
|---|---|---|
| 内核 | 独立 | 共享 |
| 启动 | 慢 | 极快 |
| 隔离 | 强 | 中 |
| 性能 | 有损 | 近乎裸机 |
| 安全 | 更强 | 依赖内核 |
- CPU ↔ 内存亲和
- vNUMA ↔ pNUMA
- cpuset.cpus
- cpuset.mems
📌 忽略 NUMA = 高负载必翻车
- 所有 service 都是 cgroup
- slice = 资源域
- service = 进程集合
CPUQuota=200%
MemoryMax=4G
📌 systemd = cgroups v2 管理器
K8S 做了什么?
- 调度(CPU / 内存 / NUMA)
- 网络(CNI)
- 存储(CSI)
- 生命周期
📌 K8S = 大规模容器资源调度系统
物理机
└─ KVM
└─ VM
└─ Docker
物理机
└─ K8S
└─ Pod
裸机 / VM
+ NUMA 绑定
+ HugePage
- 内核是核心
- 容器不是 VM
- NUMA 影响一切
- systemd 就是 cgroup
- 容器当 VM 用
- 不设资源上限
- 忽略 IO
- 在容器里调内核参数
- 硬件决定上限
- 内核决定规则
- 虚拟化决定边界
- 容器化决定效率