考点:
- 磁盘基础与存储介质
- HDD / SSD 区别
- 顺序 I/O 与随机 I/O
- IOPS、吞吐、时延的区别
- Linux 块设备与分区管理
- 块设备、分区、文件系统、挂载点之间的关系
- LVM 的作用
- 文件系统
- ext4 / xfs 特点
- inode / block 的概念
- 硬链接 / 软链接
- 日志型文件系统
- I/O 路径与缓存机制
- Page Cache
- Buffer Cache
- 脏页回写
fsync
- 磁盘性能分析
iostat、vmstat、iotop、df、du%util、await、svctm、avgqu-sz 等指标理解
- 磁盘空间与故障排查
- 磁盘满了但
df和du不一致 - 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 -hdf -i
- 易错点
- 只查
df -h,不查df -i。 - 认为删除大文件一定能解决 inode 不足。
- 不理解“文件内容”和“文件元数据”是分开的。
- 只查
- 深挖点
- 为什么小文件多的业务更容易触发 inode 问题?
- xfs 和 ext4 的 inode 机制是否完全一样?
- 容器日志碎片、临时文件是否可能导致 inode 爆掉?
Q6:为什么删除了一个大文件,磁盘空间还是没有释放?
- 核心要点
- 常见原因:文件虽然被删除,但仍被进程持有打开的文件描述符引用。
- Linux 删除文件本质上是删除目录项;只有当:
- 硬链接数归零
- 且没有进程继续持有文件描述符
才会真正回收空间。
- 常用排查命令:
lsof | grep deleted
- 处理方式:
- 重启相关进程
- 平滑 reload
- 截断文件时谨慎操作
- 易错点
- 看到文件已经
rm就认为空间一定释放。 - 直接暴力重启核心服务,导致业务抖动。
- 不分清日志轮转和手工删除的差异。
- 看到文件已经
- 深挖点
- 为什么日志文件被删了,容器所在节点空间仍持续高占用?
truncate和rm的效果有什么区别?- 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/s、w/s:每秒读写次数rkB/s、wkB/s:每秒读写吞吐avgqu-sz:平均队列长度
- 一般判断思路:
%util高:设备可能接近饱和await高:业务感知会明显变差- 队列长:说明请求堆积
- 不能只看单一指标,要结合业务负载和设备类型。
- 常见关注项:
- 易错点
- 认为
%util=100%就一定是“磁盘坏了”。 - 忽略 SSD、NVMe 设备与老式磁盘指标解释的差异。
- 只看主机指标,不结合进程、容器维度排查。
- 认为
- 深挖点
- 为什么高并发 NVMe 场景下
%util参考意义会下降? - 如何从节点 I/O 高进一步定位到具体 Pod 或进程?
iostat、iotop、pidstat -d、sar -d应该如何配合?
- 为什么高并发 NVMe 场景下
Q9:RAID 常见级别有哪些?面试中通常怎么回答 RAID0、1、5、10?
- 核心要点
- RAID0
- 条带化
- 性能高
- 无冗余
- RAID1
- 镜像
- 冗余好
- 利用率低
- RAID5
- 条带 + 奇偶校验
- 容量利用率较高
- 可坏一块盘
- 写性能一般
- RAID10
- RAID1 + RAID0
- 兼顾性能和可靠性
- 成本较高
- 运维回答时重点讲:
- 性能
- 可用性
- 容量利用率
- 重建风险
- RAID0
- 易错点
- 背概念但说不清应用场景。
- 忽略 RAID 不是备份。
- 认为 RAID5 在大盘时代仍然总是合适。
- 深挖点
- 为什么数据库更偏向 RAID10?
- RAID 重建期间为什么风险高、性能差?
- 云环境下为什么更多人依赖云盘副本而不是自建 RAID?
Q10:K8s 节点出现 DiskPressure,一般从哪些角度排查?
- 核心要点
- DiskPressure 表示节点磁盘资源紧张,Kubelet 可能触发驱逐。
- 常见排查方向:
- 容器日志是否暴涨
- 镜像层是否堆积
/var/lib/containerd或/var/lib/docker占用是否过高- Pod 临时目录、emptyDir、ephemeral-storage 是否超限
- inode 是否耗尽
- 常见命令:
df -hdf -idu -sh *crictl imagesjournalctl --disk-usage
- 易错点
- 只看根分区容量,不看 inode。
- 只删业务文件,不处理容器镜像、日志、runtime 缓存。
- 不理解 K8s 的 ephemeral-storage 限制和 eviction 机制。
- 深挖点
- Kubelet 是依据什么阈值触发磁盘驱逐的?
imagefs和nodefs的区别是什么?- 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 使用率