关注以下几类考点:

  • 进程 / 线程 / 调度
  • 内存管理
  • 文件系统与磁盘 IO
  • 网络协议栈基础
  • 容器相关内核机制(namespace / cgroups)
  • 系统监控与排障命令
  • 负载、上下文切换、僵尸进程、句柄泄漏等常见线上问题

面试题

Q1:进程和线程的区别是什么?在 Linux 运维排障中为什么重要?
  • 核心要点

    • 进程是资源分配的基本单位,线程是 CPU 调度的基本单位。
    • 同一进程内的线程共享地址空间、文件描述符、信号处理等资源。
    • 线程切换成本通常低于进程切换,但线程之间同步复杂度更高。
    • 在 K8s 场景里,一个容器里可能只有一个主进程,但这个进程内部可能创建多个线程,因此排障不能只看 PID 数量。
    • 常用命令:
      • ps -ef
      • top -H
      • pstree -p
      • pidstat -t
  • 易错点

    • 把“线程是轻量级进程”当成全部答案,没有讲清 资源共享 和 调度差异。
    • 误以为容器里只能有一个线程,实际上限制的通常是主进程模型,不是线程模型。
    • 不会结合实际排障场景,比如 CPU 飙高时定位到线程级别。
  • 深挖点

    • 线程 CPU 100% 如何定位到具体代码?
    • 为什么 top -H 能看到线程?
    • Java / Go 进程线程数过多会带来哪些问题?
    • 线程上下文切换过高会如何影响系统性能?
Q2:什么是用户态和内核态?系统调用为什么会影响性能?
  • 核心要点

    • 用户态权限低,不能直接访问硬件;内核态权限高,可执行系统级操作。
    • 应用程序访问文件、网络、内存映射等通常需要通过系统调用陷入内核。
    • 用户态和内核态切换有成本,频繁系统调用会增加开销。
    • K8s 节点上高并发网络、磁盘 IO、容器运行时调用都会涉及大量系统调用。
  • 易错点

    • 只回答“内核态权限更高”,但说不清切换过程和性能影响。
    • 分不清“函数调用”和“系统调用”。
    • 误以为所有操作都需要系统调用,例如部分用户态缓存命中并不一定立即触发内核操作。
  • 深挖点

    • 常见系统调用有哪些?如 readwriteopenepoll_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 是容器级信号,不等于整机挂掉。
    • 忽视 requestslimits 配置不合理带来的调度与稳定性问题。
  • 深挖点

    • OOM Killer 挑进程的依据是什么?
    • oom_scoreoom_score_adj 有什么作用?
    • 为什么某些关键进程不容易被杀?
    • K8s 如何降低节点 OOM 风险?
Q5:什么是 cgroup 和 namespace?它们和容器的关系是什么?
  • 核心要点

    • namespace 提供“隔离视图”,常见有:
      • PID
      • NET
      • MNT
      • UTS
      • IPC
      • USER
    • cgroup 提供资源限制与统计,常见控制:
      • CPU
      • 内存
      • IO
      • PIDs
    • 容器本质上不是虚拟机,而是基于 Linux 内核能力实现的进程隔离与资源控制。
    • K8s 最底层依赖容器运行时,而容器运行时依赖内核的 namespace 和 cgroup。
  • 易错点

    • 把 namespace 和 cgroup 混为一谈。
    • 认为容器有独立内核,这是虚拟机的特征,不是容器的典型特征。
    • 只会背名字,不会说它们分别解决什么问题。
  • 深挖点

    • PID namespace 下容器里的 1 号进程有什么特殊性?
    • cgroup v1 和 v2 有什么区别?
    • 为什么容器内看到的 CPU 和宿主机可能不完全一致?
    • 容器 CPU 限流是怎么实现的?
Q6:Linux 文件系统中 inode 是什么?磁盘没满但不能写文件,可能是什么原因?
  • 核心要点

    • inode 保存文件元数据,如权限、属主、大小、时间戳、数据块位置等。
    • 文件名和 inode 是映射关系。
    • 磁盘空间没满但不能创建文件,常见原因:
      • inode 用尽
      • 文件描述符耗尽
      • 挂载只读
      • 权限不足
      • 配额限制
    • 排查命令:
      • df -h
      • df -i
      • mount
      • ulimit -n
      • lsof
  • 易错点

    • 只会查 df -h,不会查 df -i
    • 误以为“磁盘可用空间足够”就一定能写。
    • 不清楚“已删除但仍被进程占用的文件”也会占空间。
  • 深挖点

    • 为什么日志删除后磁盘空间没释放?
    • lsof | grep deleted 的作用是什么?
    • ext4、xfs 在生产环境中的常见特点是什么?
    • overlayfs 在容器场景下有什么特点?
Q7:什么是负载(load average)?负载高一定代表 CPU 忙吗?
  • 核心要点

    • Load average 表示一段时间内处于 可运行状态 和 不可中断睡眠状态 的平均任务数。
    • 它不只包含 CPU 正在运行的进程,还可能包含等待 IO 的任务。
    • 负载高不一定是 CPU 打满,也可能是磁盘 IO、锁竞争、网络阻塞导致。
    • 排查要结合:
      • uptime
      • top
      • vmstat
      • iostat
      • pidstat
  • 易错点

    • 把 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 -n
      • cat /proc/<pid>/limits
      • lsof -p <pid>
      • ss -anp
  • 易错点

    • 以为文件描述符只和“文件”有关,不包括 socket。
    • 调大 ulimit 就算解决,忽略根本泄漏问题。
    • 不知道系统级和进程级限制都可能生效。
  • 深挖点

    • selectpollepoll 和文件描述符有什么关系?
    • 为什么高并发服务更偏向 epoll
    • FD 泄漏如何长期监控?
    • K8s 节点上 kubelet / container runtime FD 爆满会有什么后果?
Q10:线上一台 K8s 节点变慢了,你从操作系统角度如何排查?
  • 核心要点

    • 建议按资源维度快速拆解:
      • CPU:topmpstatpidstat
      • 内存:free -hvmstatdmesg
      • 磁盘 IO:iostat -xiotop
      • 网络:sar -n DEVss -s
      • 进程状态:pstop -H
      • 系统日志:journalctldmesg
    • 结合 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 事件
  • 高频命令要熟:top vmstat iostat pidstat ss lsof dmesg journalctl
  • 面试回答要尽量贴近 K8s:容器、节点、cgroup、namespace、OOM、overlayfs