考点:
- CPU 基础
- CPU 由哪些部分组成
- 指令执行过程
- 用户态/内核态
- 上下文切换
- 多核与并行
- 高速缓存
- L1/L2/L3 Cache 的作用
- Cache 命中/失效
- 局部性原理
- 伪共享
- 内存体系
- 虚拟内存与物理内存
- 页表、TLB
- 缺页异常
- 内存对齐
- HugePage
- I/O 与中断
- 中断和轮询的区别
- DMA 的作用
- 磁盘/网卡 I/O 基本链路
- 总线与数据传输
- CPU、内存、外设之间如何协同
- 带宽、延迟、吞吐量的区别
- 存储基础
- 顺序 I/O 与随机 I/O
- SSD 与 HDD 的差异
- 页缓存 Page Cache
- 和运维场景结合
- 为什么容器 CPU 打满但机器不一定打满
- 为什么 Pod 明明有空闲内存却 OOM
- 为什么高并发时延抖动变大
- NUMA 对性能的影响
Q1:CPU 的基本组成有哪些?指令大致是如何执行的?
核心要点
- CPU 常见组成包括:
- 运算器(ALU)
- 控制器
- 寄存器组
- 高速缓存
- 指令执行通常可以概括为:
- 取指
- 译码
- 执行
- 访存
- 写回
- 寄存器速度最快,离计算核心最近。
- 程序真正运行时,CPU 并不是“直接从磁盘执行”,而是先装入内存,再被 CPU 取指执行。
- CPU 常见组成包括:
易错点
- 把“内存”和“寄存器”混为一谈。
- 以为 CPU 直接处理磁盘上的程序。
- 只会背“冯诺依曼结构”,却说不清楚执行流程。
深挖点
- 为什么寄存器比内存快?
- 为什么现代 CPU 要做流水线?
- 为什么 K8s 运维也要懂这个?
- 因为性能分析时,经常要判断瓶颈是在算力、访存还是 I/O。
Q2:什么是缓存层次结构?为什么需要 L1/L2/L3 Cache?
核心要点
- CPU 速度远高于内存速度,所以需要多级缓存缓冲“速度鸿沟”。
- 常见缓存层次:
- L1:最小、最快
- L2:更大、稍慢
- L3:更大、通常多核共享
- 缓存利用的是 局部性原理:
- 时间局部性
- 空间局部性
- 命中缓存时延低,未命中则要访问更下层存储,性能会明显下降。
易错点
- 认为缓存越大一定越快。
- 不区分“容量、延迟、命中率”之间的权衡。
- 只知道缓存存在,不知道它和程序访问模式强相关。
深挖点
- 什么样的代码访问模式更容易 cache miss?
- 为什么数组连续访问通常比链表随机访问更快?
- 多核环境下缓存一致性为什么重要?
Q3:什么是虚拟内存?页表、TLB、缺页异常分别是什么?
核心要点
- 虚拟内存是操作系统给每个进程提供的独立地址空间抽象。
- CPU 实际访问的是虚拟地址,需要通过页表映射到物理地址。
- TLB 是页表项的高速缓存,用来加速地址转换。
- 如果访问的页不在内存中,可能触发 缺页异常。
- 这套机制带来:
- 进程隔离
- 更灵活的内存管理
- 按需加载
易错点
- 把“虚拟内存”理解成“磁盘空间”。
- 认为缺页异常一定是错误。
- 不清楚 TLB 缓存的对象是“地址映射关系”。
深挖点
- 缺页异常分哪几类?
- TLB miss 会带来什么性能影响?
- 在 K8s 场景下,为什么内存访问抖动可能和页表、TLB、HugePage 有关?
Q4:用户态和内核态有什么区别?为什么系统调用比普通函数调用更重?
核心要点
- 用户态权限低,不能直接执行特权操作。
- 内核态权限高,可以操作硬件、管理内存、中断、进程调度等。
- 应用访问文件、网络、设备时,往往要通过 系统调用 进入内核态。
- 系统调用更重,是因为涉及:
- 特权级切换
- 保存/恢复上下文
- 内核路径执行
易错点
- 以为所有函数调用成本差不多。
- 把“用户态/内核态”与“用户进程/内核进程”混淆。
- 认为 CPU 使用率高就一定是用户态高。
深挖点
top里的 user/system CPU 分别反映什么?- 为什么频繁 syscall 会影响高并发服务性能?
- 容器里的系统调用本质上最终是谁在执行?
Q5:什么是上下文切换?为什么上下文切换多会导致系统变慢?
核心要点
- 上下文切换指 CPU 从一个执行单元切到另一个执行单元时,需要保存和恢复运行现场。
- 可能发生在:
- 进程切换
- 线程切换
- 中断处理
- 上下文切换会带来额外开销:
- 调度开销
- 寄存器保存恢复
- cache/TLB 局部性被破坏
- 在高并发场景中,切换过多会让 CPU “忙于切换而不是忙于干活”。
易错点
- 认为线程一定比进程切换便宜很多,忽略实际场景差异。
- 只关注 CPU 使用率,不看切换次数。
- 误以为协程会完全消除切换成本。
深挖点
- 为什么上下文切换会影响 cache 命中率?
- 什么是自愿切换与非自愿切换?
- K8s 中 CPU limit 设置不合理为什么可能增加调度抖动?
Q6:中断、轮询、DMA 分别是什么?它们在 I/O 中起什么作用?
核心要点
- 轮询:CPU 不断主动询问设备是否准备好。
- 中断:设备准备好后通知 CPU 处理。
- DMA:设备可在不大量占用 CPU 搬运数据的情况下,直接与内存交换数据。
- 对高性能 I/O 来说:
- 小量快速事件可考虑中断
- 高频场景下可能结合轮询
- 大块数据搬运依赖 DMA 提升效率
易错点
- 认为 DMA 是“完全不需要 CPU”。
- 认为中断一定优于轮询。
- 把“中断通知”和“数据搬运”混成一件事。
深挖点
- 为什么高包速网络场景下中断太多会导致 CPU 压力大?
- 网卡收包大致链路能不能讲清楚?
- 为什么运维排查网络抖动时会关注软中断?
Q7:什么是顺序 I/O 和随机 I/O?为什么它们的性能差异很大?
核心要点
- 顺序 I/O:数据访问位置连续。
- 随机 I/O:数据访问位置离散。
- 在 HDD 上,随机 I/O 性能差主要因为:
- 寻道
- 旋转延迟
- SSD 没有机械寻址,但随机 I/O 仍通常比顺序 I/O 成本更高。
- 运维场景中,日志、备份、流式读取偏顺序;数据库索引查找更偏随机。
易错点
- 认为 SSD 上顺序和随机 I/O 没区别。
- 只看带宽,不看 IOPS 和延迟。
- 不了解业务类型和 I/O 模式的关系。
深挖点
- 吞吐量、IOPS、时延分别适合描述什么?
- 为什么数据库更关注随机 I/O 性能?
- 为什么容器共享存储时,一个 Pod 的随机写可能影响其他业务?
Q8:什么是 NUMA?为什么它会影响容器和节点性能?
核心要点
- NUMA 指非一致性内存访问架构。
- 多路 CPU 机器中,不同 CPU 访问“本地内存”和“远程内存”的延迟不同。
- 如果线程跑在一个 NUMA 节点,内存却分配在另一个节点,性能可能下降。
- 对高性能业务、低延迟业务、DPDK、数据库、JVM、大内存应用影响更明显。
易错点
- 认为所有服务器都是“统一内存访问成本”。
- 只看 CPU 核数,不关注 CPU 与内存拓扑。
- 认为容器调度只要资源够就行,不用考虑亲和性。
深挖点
- 为什么跨 NUMA 访问会变慢?
- K8s 中 CPU Manager、Topology Manager 是想解决什么问题?
- 哪些业务最怕 NUMA 不友好?
Q9:什么是伪共享?它为什么会让多线程性能变差?
核心要点
- 伪共享是指多个线程虽然操作不同变量,但这些变量恰好落在同一个 cache line 上。
- 一个线程修改变量会导致另一个线程缓存失效,产生额外一致性流量。
- 结果是:
- CPU cache 频繁失效
- 多线程扩展性变差
- 吞吐上不去
易错点
- 只知道“共享变量会竞争”,不知道“不共享变量也可能互相影响”。
- 把锁竞争和伪共享混为一谈。
- 忽略 cache line 粒度这一关键点。
深挖点
- cache line 一般多大?
- 如何从代码结构上减少伪共享?
- 为什么监控采集、高频计数器这类场景容易踩坑?
Q10:为什么会出现“CPU 不高,但程序还是很慢”?
核心要点
- 程序慢不一定是算力不足,可能卡在:
- 内存访问
- cache miss
- 锁竞争
- I/O 等待
- 上下文切换
- 网络延迟
- 从组成原理角度看,CPU 的大部分时间可能在“等数据”,而不是“做计算”。
- 所以性能分析不能只看 CPU 使用率。
- 程序慢不一定是算力不足,可能卡在:
易错点
- 看到 CPU 不高就判断“机器没问题”。
- 不区分 CPU busy 和 CPU stalled。
- 把所有性能问题都归因于代码逻辑。
深挖点
- 如何区分是 CPU 瓶颈、内存瓶颈还是 I/O 瓶颈?
- 为什么高负载不一定代表高 CPU?
- K8s 节点排障时该联想到哪些指标:
- load average
- iowait
- context switch
- page fault
- softirq
速记笔记
- CPU 执行流程:取指 → 译码 → 执行 → 访存 → 写回
- 速度层次:寄存器 > Cache > 内存 > 磁盘
- Cache 核心:利用局部性原理,命中快,miss 慢
- 虚拟内存核心:虚拟地址通过页表映射到物理地址,TLB 用来加速映射
- 缺页异常:不一定是错误,可能是正常的按需调页
- 用户态/内核态:系统调用会触发特权级切换,成本高于普通函数调用
- 上下文切换:切换多会破坏 cache/TLB 局部性,影响吞吐
- I/O 机制:中断负责通知,DMA 负责高效搬运
- 磁盘性能:顺序 I/O 看带宽,随机 I/O 更看 IOPS 和时延
- NUMA:本地内存访问快,跨节点访问慢,影响高性能容器业务
- 伪共享:不同线程改不同变量,也可能因为同一 cache line 互相拖慢
- 面试回答思路:定义 → 原理 → 性能影响 → Linux/K8s 场景落地
临场答题建议
- 回答时尽量带上 “为什么”,不要只背定义。
- 最好能把知识点和这些场景关联:
- Pod CPU 打满
- 节点 load 高
- iowait 高
- 容器延迟抖动
- 大内存应用性能异常
- 如果面试官继续追问,优先往这几个方向展开:
- 性能影响
- Linux 指标
- K8s 场景
- 排障方法