关注以下几类考点:
- 进程 / 线程 / 调度
- 内存管理
- 文件系统与磁盘 IO
- 网络协议栈基础
- 容器相关内核机制(namespace / cgroups)
- 系统监控与排障命令
- 负载、上下文切换、僵尸进程、句柄泄漏等常见线上问题
面试题
Q1:进程和线程的区别是什么?在 Linux 运维排障中为什么重要?
核心要点
- 进程是资源分配的基本单位,线程是 CPU 调度的基本单位。
- 同一进程内的线程共享地址空间、文件描述符、信号处理等资源。
- 线程切换成本通常低于进程切换,但线程之间同步复杂度更高。
- 在 K8s 场景里,一个容器里可能只有一个主进程,但这个进程内部可能创建多个线程,因此排障不能只看 PID 数量。
- 常用命令:
ps -eftop -Hpstree -ppidstat -t
易错点
- 把“线程是轻量级进程”当成全部答案,没有讲清 资源共享 和 调度差异。
- 误以为容器里只能有一个线程,实际上限制的通常是主进程模型,不是线程模型。
- 不会结合实际排障场景,比如 CPU 飙高时定位到线程级别。
深挖点
- 线程 CPU 100% 如何定位到具体代码?
- 为什么
top -H能看到线程? - Java / Go 进程线程数过多会带来哪些问题?
- 线程上下文切换过高会如何影响系统性能?
Q2:什么是用户态和内核态?系统调用为什么会影响性能?
核心要点
- 用户态权限低,不能直接访问硬件;内核态权限高,可执行系统级操作。
- 应用程序访问文件、网络、内存映射等通常需要通过系统调用陷入内核。
- 用户态和内核态切换有成本,频繁系统调用会增加开销。
- K8s 节点上高并发网络、磁盘 IO、容器运行时调用都会涉及大量系统调用。
易错点
- 只回答“内核态权限更高”,但说不清切换过程和性能影响。
- 分不清“函数调用”和“系统调用”。
- 误以为所有操作都需要系统调用,例如部分用户态缓存命中并不一定立即触发内核操作。
深挖点
- 常见系统调用有哪些?如
read、write、open、epoll_wait。 - 为什么零拷贝可以减少性能损耗?
strace在排障中如何使用?- 高频系统调用场景下如何优化?
- 常见系统调用有哪些?如
Q3:说一下 Linux 内存管理,什么是虚拟内存?
核心要点
- 每个进程看到的是独立的虚拟地址空间,操作系统负责虚拟地址到物理地址的映射。
- 虚拟内存带来隔离、按需分配、共享库映射、内存扩展等能力。
- 关键概念包括:页、页表、缺页异常、Swap、匿名页、文件页。
- 在 K8s 中,容器内存限制、本机 OOM、Page Cache 抖动都和内存机制有关。
易错点
- 把虚拟内存简单理解为“磁盘当内存用”。
- 不区分 物理内存不足 和 进程虚拟内存大。
- 不知道 RSS、VIRT、RES 的区别。
深挖点
- Page Cache 是什么?为什么会“吃掉很多内存”但不一定有问题?
- 什么是缺页中断?
- Swap 对数据库、K8s 节点有什么影响?
- NUMA 对性能有什么影响?
Q4:什么情况下会发生 OOM?容器 OOM 和节点 OOM 有什么区别?
核心要点
- OOM 是内存不足时内核触发的保护机制,通常由 OOM Killer 选择进程杀掉。
- 容器 OOM:通常是进程超过 cgroup 限制,被容器级内存控制机制杀掉。
- 节点 OOM:整机内存不足,内核在节点范围内挑选进程杀掉,影响面更大。
- 排查思路:
- 看 Pod 事件
- 看
dmesg - 看
journalctl -k - 看容器 limits / requests 是否合理
- 看是否有内存泄漏、缓存异常、突发流量
易错点
- 认为只要 Pod 被杀就是节点 OOM。
- 不知道
OOMKilled是容器级信号,不等于整机挂掉。 - 忽视
requests和limits配置不合理带来的调度与稳定性问题。
深挖点
- OOM Killer 挑进程的依据是什么?
oom_score和oom_score_adj有什么作用?- 为什么某些关键进程不容易被杀?
- K8s 如何降低节点 OOM 风险?
Q5:什么是 cgroup 和 namespace?它们和容器的关系是什么?
核心要点
- namespace 提供“隔离视图”,常见有:
- PID
- NET
- MNT
- UTS
- IPC
- USER
- cgroup 提供资源限制与统计,常见控制:
- CPU
- 内存
- IO
- PIDs
- 容器本质上不是虚拟机,而是基于 Linux 内核能力实现的进程隔离与资源控制。
- K8s 最底层依赖容器运行时,而容器运行时依赖内核的 namespace 和 cgroup。
- namespace 提供“隔离视图”,常见有:
易错点
- 把 namespace 和 cgroup 混为一谈。
- 认为容器有独立内核,这是虚拟机的特征,不是容器的典型特征。
- 只会背名字,不会说它们分别解决什么问题。
深挖点
- PID namespace 下容器里的 1 号进程有什么特殊性?
- cgroup v1 和 v2 有什么区别?
- 为什么容器内看到的 CPU 和宿主机可能不完全一致?
- 容器 CPU 限流是怎么实现的?
Q6:Linux 文件系统中 inode 是什么?磁盘没满但不能写文件,可能是什么原因?
核心要点
- inode 保存文件元数据,如权限、属主、大小、时间戳、数据块位置等。
- 文件名和 inode 是映射关系。
- 磁盘空间没满但不能创建文件,常见原因:
- inode 用尽
- 文件描述符耗尽
- 挂载只读
- 权限不足
- 配额限制
- 排查命令:
df -hdf -imountulimit -nlsof
易错点
- 只会查
df -h,不会查df -i。 - 误以为“磁盘可用空间足够”就一定能写。
- 不清楚“已删除但仍被进程占用的文件”也会占空间。
- 只会查
深挖点
- 为什么日志删除后磁盘空间没释放?
lsof | grep deleted的作用是什么?- ext4、xfs 在生产环境中的常见特点是什么?
- overlayfs 在容器场景下有什么特点?
Q7:什么是负载(load average)?负载高一定代表 CPU 忙吗?
核心要点
- Load average 表示一段时间内处于 可运行状态 和 不可中断睡眠状态 的平均任务数。
- 它不只包含 CPU 正在运行的进程,还可能包含等待 IO 的任务。
- 负载高不一定是 CPU 打满,也可能是磁盘 IO、锁竞争、网络阻塞导致。
- 排查要结合:
uptimetopvmstatiostatpidstat
易错点
- 把 load average 等同于 CPU 使用率。
- 只看 load,不结合 CPU 核数判断。
- 不知道 D 状态(不可中断睡眠)会推高负载。
深挖点
- 1 分钟、5 分钟、15 分钟负载分别怎么看?
- 单核 4 的机器,load 到多少算异常?
- 高负载但 CPU 不高,如何排查?
- 什么是上下文切换,为什么会导致性能下降?
Q8:什么是僵尸进程和孤儿进程?如何处理?
核心要点
- 僵尸进程:子进程已经退出,但父进程没有调用
wait()回收,仍保留进程表项。 - 孤儿进程:父进程先退出,子进程被
init/systemd接管。 - 僵尸进程本身不占大量内存,但会占用 PID 表项,过多会影响系统。
- 处理方式通常是让父进程回收,或重启异常父进程。
- 僵尸进程:子进程已经退出,但父进程没有调用
易错点
- 把僵尸进程和孤儿进程混淆。
- 认为僵尸进程会持续消耗大量 CPU 或内存。
- 只会
kill -9僵尸进程,但僵尸进程本身通常无法直接杀掉,关键是处理父进程。
深挖点
- 为什么容器里的 PID 1 处理信号和子进程回收很重要?
- 如果容器主进程不会回收子进程,会导致什么问题?
tini/dumb-init解决了什么问题?
Q9:什么是文件描述符?线上服务为什么会出现 “too many open files”?
核心要点
- 文件描述符是进程访问文件、socket、管道等内核对象的索引。
- 网络服务高并发时,socket 连接会消耗大量文件描述符。
- 常见原因:
ulimit -n太小- 连接泄漏
- 日志文件句柄泄漏
- 短连接风暴
- 排查命令:
ulimit -ncat /proc/<pid>/limitslsof -p <pid>ss -anp
易错点
- 以为文件描述符只和“文件”有关,不包括 socket。
- 调大
ulimit就算解决,忽略根本泄漏问题。 - 不知道系统级和进程级限制都可能生效。
深挖点
select、poll、epoll和文件描述符有什么关系?- 为什么高并发服务更偏向
epoll? - FD 泄漏如何长期监控?
- K8s 节点上 kubelet / container runtime FD 爆满会有什么后果?
Q10:线上一台 K8s 节点变慢了,你从操作系统角度如何排查?
核心要点
- 建议按资源维度快速拆解:
- CPU:
top、mpstat、pidstat - 内存:
free -h、vmstat、dmesg - 磁盘 IO:
iostat -x、iotop - 网络:
sar -n DEV、ss -s - 进程状态:
ps、top -H - 系统日志:
journalctl、dmesg
- CPU:
- 结合 K8s 视角再看:
- 是否有 Pod 重启
- 是否存在 OOMKilled
- 是否磁盘压力高
- kubelet / containerd 是否异常
- 先判断是单进程问题、单 Pod 问题、整机问题,还是存储/网络链路问题。
- 建议按资源维度快速拆解:
易错点
- 一上来就重启节点,没有先定位。
- 只看 K8s 层,不看宿主机层。
- 只看 CPU、内存,不看 IO 和内核日志。
- 不会区分“症状”和“根因”。
深挖点
- 如果
wa很高说明什么? - 如果 CPU 不高但请求延迟很高,可能有哪些方向?
- 如何判断是 cgroup 限流还是进程真实跑满?
- 如何做一套标准化节点巡检和故障处理 SOP?
- 如果
速记笔记
- 进程是资源分配单位,线程是调度单位
- 用户态做业务,内核态做系统管理;系统调用切换有成本
- 虚拟内存核心是地址映射,不只是“拿磁盘当内存”
- 容器 OOM 看 cgroup,节点 OOM 看整机内存与内核日志
- namespace 管隔离,cgroup 管限制
- 磁盘没满写不进去,优先查 inode、FD、只读挂载、权限
- load 高不一定 CPU 高,也可能是 IO 阻塞
- 僵尸进程要找父进程回收
- 文件描述符不仅是文件,也包括 socket
- 排障顺序:CPU → 内存 → IO → 网络 → 日志 → K8s 事件
- 高频命令要熟:
topvmstatiostatpidstatsslsofdmesgjournalctl - 面试回答要尽量贴近 K8s:容器、节点、cgroup、namespace、OOM、overlayfs