考点:

  • 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 要做流水线?
    • 为什么 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 场景
    • 排障方法