考点:

  • 磁盘基础与存储介质
    • HDD / SSD 区别
    • 顺序 I/O 与随机 I/O
    • IOPS、吞吐、时延的区别
  • Linux 块设备与分区管理
    • 块设备、分区、文件系统、挂载点之间的关系
    • LVM 的作用
  • 文件系统
    • ext4 / xfs 特点
    • inode / block 的概念
    • 硬链接 / 软链接
    • 日志型文件系统
  • I/O 路径与缓存机制
    • Page Cache
    • Buffer Cache
    • 脏页回写
    • fsync
  • 磁盘性能分析
    • iostatvmstatiotopdfdu
    • %util、await、svctm、avgqu-sz 等指标理解
  • 磁盘空间与故障排查
    • 磁盘满了但 dfdu 不一致
    • inode 耗尽
    • 删除文件后空间不释放
  • RAID / LVM / 挂载
    • RAID0 / 1 / 5 / 10
    • 容量、性能、可靠性的权衡
  • K8s 关联场景
    • 节点磁盘压力(DiskPressure)
    • 容器日志膨胀
    • overlay2 存储
    • ephemeral-storage

Q1:机械硬盘 HDD 和固态硬盘 SSD 有什么区别?为什么 K8s 场景更关注 SSD 的随机 I/O 能力?
  • 核心要点
    • HDD 基于机械寻道,随机 I/O 性能差,顺序 I/O 相对较好。
    • SSD 无机械寻道,随机 I/O 性能显著优于 HDD,时延更低。
    • K8s 场景下大量小文件、容器日志、镜像层、数据库 WAL / redo / binlog 等都偏向随机 I/O。
    • 运维关注的不只是容量,还包括:
      • IOPS
      • 吞吐量
      • 平均时延
      • 稳定性
  • 易错点
    • 只比较“读写速度”,忽略 随机 I/O 和时延。
    • 认为 SSD 一定在所有场景都更快,实际上超大顺序吞吐场景 HDD 也可能够用且更便宜。
    • 忽略 SSD 擦写寿命、写放大、TRIM 等问题。
  • 深挖点
    • 为什么数据库和 etcd 对磁盘时延更敏感,而不是单纯吞吐?
    • SSD 的 GC、磨损均衡对线上抖动有什么影响?
    • NVMe SSD 相比 SATA SSD 的优势体现在哪些指标上?

Q2:什么是 IOPS、吞吐量、时延?三者之间是什么关系?
  • 核心要点
    • IOPS:每秒执行多少次 I/O 操作,适合衡量小块随机读写能力。
    • 吞吐量:每秒传输的数据量,如 MB/s,适合衡量大块顺序读写能力。
    • 时延:单次 I/O 从发起到完成的耗时,通常是最影响业务体验的指标。
    • 三者关系可粗略理解为:
      吞吐量 ≈ IOPS × 单次 I/O 大小
    • 对数据库、etcd、日志系统来说,低时延通常比高吞吐更重要。
  • 易错点
    • 把 IOPS 高等同于吞吐量高。
    • 不区分随机 I/O 和顺序 I/O。
    • 只看平均值,不看 P95 / P99 时延。
  • 深挖点
    • 为什么 4K 随机读写常被用来测试存储性能?
    • 为什么线上存储抖动时,平均时延正常但 P99 很差?
    • K8s 中哪些组件更关注 IOPS,哪些更关注吞吐?

Q3:块设备、分区、文件系统、挂载点分别是什么?它们之间的关系是什么?
  • 核心要点
    • 块设备:如 /dev/sda/dev/nvme0n1,是可按块读写的设备。
    • 分区:如 /dev/sda1,是在块设备上划分出的逻辑区域。
    • 文件系统:如 ext4、xfs,是组织文件和目录的数据结构。
    • 挂载点:把文件系统接入目录树,如挂载到 /data
    • 关系可以理解为:
      磁盘 → 分区/LVM → 文件系统 → 挂载到目录
  • 易错点
    • 误以为“分区就是文件系统”。
    • 误以为挂载目录本身就是存储空间来源。
    • 格式化和挂载概念混淆。
  • 深挖点
    • 为什么有时候不分区,直接把整个块设备做文件系统?
    • LVM 加在这条链路里的位置是什么?
    • K8s 挂载云盘到节点后,落到 Linux 哪一层?

Q4:ext4 和 xfs 有什么区别?生产环境中如何选择?
  • 核心要点
    • 两者都是常见 Linux 日志型文件系统。
    • ext4
      • 通用性强
      • 兼容性好
      • 工具链成熟
    • xfs
      • 对大文件、大容量存储支持较好
      • 并发 I/O 场景表现常较优
      • 在很多云原生场景中使用较多
    • 生产上通常结合:
      • 业务类型
      • 文件大小分布
      • 运维工具兼容性
      • 历史习惯
  • 易错点
    • 直接说“xfs 一定比 ext4 快”。
    • 忽略实际 workload,不同业务差异很大。
    • 不知道 xfs 缩容不方便,扩容更常见。
  • 深挖点
    • 为什么 K8s 节点磁盘、容器存储目录经常推荐 xfs?
    • ext4 和 xfs 在 inode 分配、日志机制上有何差异?
    • 如果是数据库盘、日志盘、镜像盘,选型是否一致?

Q5:inode 是什么?磁盘空间没满但无法创建文件,可能是什么原因?
  • 核心要点
    • inode 存储文件元数据,如权限、属主、时间戳、数据块位置等。
    • 文件名和 inode 号映射由目录项维护。
    • 磁盘“没满”通常指 block 没用完,但 inode 可能耗尽。
    • 大量小文件场景尤其容易 inode 不足。
    • 排查命令常见:
      • df -h
      • df -i
  • 易错点
    • 只查 df -h,不查 df -i
    • 认为删除大文件一定能解决 inode 不足。
    • 不理解“文件内容”和“文件元数据”是分开的。
  • 深挖点
    • 为什么小文件多的业务更容易触发 inode 问题?
    • xfs 和 ext4 的 inode 机制是否完全一样?
    • 容器日志碎片、临时文件是否可能导致 inode 爆掉?

Q6:为什么删除了一个大文件,磁盘空间还是没有释放?
  • 核心要点
    • 常见原因:文件虽然被删除,但仍被进程持有打开的文件描述符引用。
    • Linux 删除文件本质上是删除目录项;只有当:
      • 硬链接数归零
      • 且没有进程继续持有文件描述符
        才会真正回收空间。
    • 常用排查命令:
      • lsof | grep deleted
    • 处理方式:
      • 重启相关进程
      • 平滑 reload
      • 截断文件时谨慎操作
  • 易错点
    • 看到文件已经 rm 就认为空间一定释放。
    • 直接暴力重启核心服务,导致业务抖动。
    • 不分清日志轮转和手工删除的差异。
  • 深挖点
    • 为什么日志文件被删了,容器所在节点空间仍持续高占用?
    • truncaterm 的效果有什么区别?
    • K8s 中容器运行时日志、sidecar 日志采集会怎样影响这个问题?

Q7:Page Cache 是什么?它为什么会影响磁盘性能判断?
  • 核心要点
    • Page Cache 是 Linux 用内存缓存文件数据页的机制。
    • 热数据命中缓存时,应用读文件可能不真正落到磁盘。
    • 写入时常常先写入缓存,之后由内核异步回写到磁盘。
    • 因此看到“写成功”不代表已经真正持久化到物理介质。
    • 对性能测试和故障判断影响很大。
  • 易错点
    • 把内存缓存命中误以为磁盘本身很快。
    • 不理解“脏页回写”造成的瞬时 I/O 峰值。
    • 误以为 free 看到 cache 很大就是内存泄漏。
  • 深挖点
    • fsync 的作用是什么?为什么数据库强调它?
    • Page Cache 对顺序读、随机读分别有什么帮助?
    • K8s 节点内存紧张时,Page Cache 被回收会出现什么现象?

Q8:如何理解磁盘 I/O 排查中常见的 iostat 指标?
  • 核心要点
    • 常见关注项:
      • %util:设备忙碌时间占比
      • await:平均 I/O 等待时间
      • r/sw/s:每秒读写次数
      • rkB/swkB/s:每秒读写吞吐
      • avgqu-sz:平均队列长度
    • 一般判断思路:
      • %util 高:设备可能接近饱和
      • await 高:业务感知会明显变差
      • 队列长:说明请求堆积
    • 不能只看单一指标,要结合业务负载和设备类型。
  • 易错点
    • 认为 %util=100% 就一定是“磁盘坏了”。
    • 忽略 SSD、NVMe 设备与老式磁盘指标解释的差异。
    • 只看主机指标,不结合进程、容器维度排查。
  • 深挖点
    • 为什么高并发 NVMe 场景下 %util 参考意义会下降?
    • 如何从节点 I/O 高进一步定位到具体 Pod 或进程?
    • iostatiotoppidstat -dsar -d 应该如何配合?

Q9:RAID 常见级别有哪些?面试中通常怎么回答 RAID0、1、5、10?
  • 核心要点
    • RAID0
      • 条带化
      • 性能高
      • 无冗余
    • RAID1
      • 镜像
      • 冗余好
      • 利用率低
    • RAID5
      • 条带 + 奇偶校验
      • 容量利用率较高
      • 可坏一块盘
      • 写性能一般
    • RAID10
      • RAID1 + RAID0
      • 兼顾性能和可靠性
      • 成本较高
    • 运维回答时重点讲:
      • 性能
      • 可用性
      • 容量利用率
      • 重建风险
  • 易错点
    • 背概念但说不清应用场景。
    • 忽略 RAID 不是备份。
    • 认为 RAID5 在大盘时代仍然总是合适。
  • 深挖点
    • 为什么数据库更偏向 RAID10?
    • RAID 重建期间为什么风险高、性能差?
    • 云环境下为什么更多人依赖云盘副本而不是自建 RAID?

Q10:K8s 节点出现 DiskPressure,一般从哪些角度排查?
  • 核心要点
    • DiskPressure 表示节点磁盘资源紧张,Kubelet 可能触发驱逐。
    • 常见排查方向:
      • 容器日志是否暴涨
      • 镜像层是否堆积
      • /var/lib/containerd/var/lib/docker 占用是否过高
      • Pod 临时目录、emptyDir、ephemeral-storage 是否超限
      • inode 是否耗尽
    • 常见命令:
      • df -h
      • df -i
      • du -sh *
      • crictl images
      • journalctl --disk-usage
  • 易错点
    • 只看根分区容量,不看 inode。
    • 只删业务文件,不处理容器镜像、日志、runtime 缓存。
    • 不理解 K8s 的 ephemeral-storage 限制和 eviction 机制。
  • 深挖点
    • Kubelet 是依据什么阈值触发磁盘驱逐的?
    • imagefsnodefs 的区别是什么?
    • overlay2 / containerd snapshotter 对磁盘占用有什么影响?

速记笔记

  • 磁盘性能三件套:IOPS、吞吐、时延
  • K8s 更关注:随机 I/O、低时延、稳定性
  • 存储链路:块设备 → 分区/LVM → 文件系统 → 挂载点
  • 常见文件系统:ext4、xfs
  • 空间问题排查:先看 df -h,再看 df -i
  • 删文件不释放空间:大概率是进程还在占用,查 lsof | grep deleted
  • 缓存误区:Page Cache 命中快,不代表磁盘本身快
  • 日志型文件系统:提升恢复能力,不等于数据绝对不丢
  • RAID 不是备份
  • K8s DiskPressure 常查:
    • 容器日志
    • 镜像缓存
    • runtime 数据目录
    • emptyDir / 临时文件
    • inode 使用率