简介:运维工程师面试题集 PDF 面向初中级运维、系统管理员及准备跳槽的求职者,围绕 Linux、Shell、Python、MySQL、Docker、Kubernetes 与网络等常见面试方向组织内容,题目按技术栈分块,内容围绕高频考点编排,便于定位薄弱环节。题目从进程查看与 nginx 进程统计、du 与 df 差异、根分区占满排查,延伸到 Shell 变量含义、批量建用户、在线 IP 探测与 URL 可用性检查;同时覆盖 Python 数据类型、深浅拷贝、生成器与迭代器,MySQL 事务隔离级别、主从延迟与优化备份,Docker 镜像容器区别、Dockerfile 指令,K8s 组件对象、Pod 健康监测与持久化,以及 OSI 七层、TCP/UDP、三次握手和 HTTP 状态码等,并补充 Linux 系统优化中的问题排查思路。压缩包仅含 1 个 PDF 文件,约 890KB,可按知识模块快速检索与背诵。已有 677 人学习,适合面试前系统梳理考点、查漏补缺,并借助题目中的排查思路与命令示例强化实操表达。
1. 运维面试里最容易掉分的,是那些你以为背熟的命令
运维工程师面试题的分布其实很稳定:Linux 与 Shell 是底盘,MySQL、Docker、Kubernetes、网络各出一到两道,Python 通常作为脚本能力的加分项出现。真正拉开差距的不是“知不知道这个命令”,而是“能不能把一条命令讲成一条排查链路”。du和df的区别谁都会背,但面试官问“根分区满了怎么排查”,答完区别就停住的人,和能顺着df -h定位、du -sh /*下钻、lsof +L1找回已删除文件的人,分档立刻不同。这份笔记按模块把高频考点、真题答法和失分点拆开,适合已经能敲命令、但答不全因果链的备考者,照着练能把答案补到面试官愿意继续追问的深度。
2. Linux 与 Shell:命令答一半,等于没答
Linux 和 Shell 在运维面试里属于“默认你会”的部分,面试官不会给提示,也不会铺垫场景,张口就是“根分区满了怎么办”“统计一下 nginx 进程数”。这类题的特点是答案有明确终点,答到哪一步停住,水平就停在哪一档。下面三组题——磁盘、统计、脚本——几乎每场都出现,而且都能用固定模板覆盖,练熟之后遇到变体也只是换参数。
2.1 du 与 df:根分区满了的四步排查
定义上的区别要先说准:df读取的是文件系统超级块里的元数据,统计整个挂载点的已用和可用块,速度快,但存在延迟——文件被删除后如果进程还持有句柄,df依然显示占用;du是遍历目录树逐个累加文件大小,慢,但能精确到某个目录。两者数字对不上,最常见的场景就是“文件删了空间没回来”。
排查顺序要背成条件反射:先定位挂载点,再逐层下钻,再找已删除但被占用的文件,最后查 inode。少了第三步,遇到日志被rm掉但进程没重启的情况就会卡住;少了第四步,遇到小文件把 inode 耗光的情况会得出“磁盘没满但写不进去”的矛盾结论。
# 1. 先看哪个挂载点满了,重点看 Use% 和 Mounted on df -h # 2. 从根开始逐层下钻,-s 汇总、-h 人类可读、sort -rh 按数值逆序 du -sh /* 2>/dev/null | sort -rh | head -10 # 3. 锁定大目录后继续下钻,比如 /var du -sh /var/* 2>/dev/null | sort -rh | head -10 # 4. 找出已删除但仍被进程打开的文件,link count 小于 1 lsof +L1 2>/dev/null | head -20 # 5. 小文件太多时,inode 也会被耗尽 df -i参数和逻辑说明:-s只输出汇总值不展开子目录,-h转成 K/M/G 可读单位,2>/dev/null屏蔽无权限目录的报错噪音,sort -rh里的-h让 sort 能正确比较 1K 和 2M 这种单位。lsof +L1列出 link count 小于 1 的文件,这类文件在目录里已经看不见,但磁盘块没释放,处理方式是重启对应进程或: > /proc/<pid>/fd/<fd>清空。df -i看的是 inode 使用率,和块使用率是两套指标。
提示:面试时把“四步”说成一条链,比背五个命令更有说服力。结尾补一句“如果 du 和 df 差得很大,优先怀疑已删除句柄,其次怀疑挂载点被覆盖”,面试官基本会顺着问下一题。
2.2 进程、日志、连接:三个统计命令的写法
进程统计考的是细节意识。ps -ef | grep nginx | wc -l这个答案会被追问“grep 自己算不算”,所以必须加grep -v grep。原文的写法是ps -ef | grep nginx | grep -v grep | wc -l,这是标准答法。第二问“如果是 root 用户,打印第一列和最后一列”,本质是考 awk 的字段引用。
# 统计 nginx 进程数,排除 grep 自身那一行 ps -ef | grep nginx | grep -v grep | wc -l # 只打印 root 启动的进程,输出用户和最后一列 ps -ef | grep nginx | grep -v grep | awk '$1=="root"{print $1","$NF}'$1是第一列即用户名,$NF是最后一列。这里有个容易翻车的点:ps -ef的最后一列是完整命令行,如果进程带启动参数,$NF拿到的是参数而不是进程名。想稳一点可以用$8,因为ps -ef的第八列是 CMD 的起始位置。面试官如果追问这个差异,说明他在试探你是背答案还是真用过。
nginx 日志统计 top10 IP,是运维面试出现频率最高的日志题。核心是sort | uniq -c这个组合:uniq只能合并相邻的重复行,不先排序,同一个 IP 分散在日志各处就会统计成多条。
# 取第一列 IP,排序后去重计数,再按次数逆序取前十 awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10 # 常被追问的状态码分布,第九列是 status awk '{print $9}' access.log | sort | uniq -c | sort -rn | headuniq -c在每行前面加上出现次数,sort -rn按数字逆序。如果面试官问“访问页面数量前十”而不是“请求数前十”,就要先按 URL 去重再按 IP 计数,思路是先awk '{print $1" "$7}'拼出 IP 加 URL,再sort -u去重,最后回到 IP 维度统计。这一层追问能答出来,说明你理解的是统计口径而不是命令拼接。
TCP 连接状态统计考的是 awk 数组用法:
# $NF 是每行最后一列即连接状态,用状态做数组下标累加 netstat -n | awk '/^tcp/ {++S[$NF]} END {for (a in S) print a, S[a]}'/^tcp/过滤出 TCP 连接行,S[$NF]++以状态为键计数,END块在全部输入处理完后遍历输出。用ss的话写法是ss -ant | awk 'NR>1{++S[$1]} END{for(a in S) print a,S[a]}',注意ss第一行是表头要跳过。
tcpdump 抓包找访问最高的来源,原文用-F"."切分,实际会出问题:抓包输出里 IP 后面跟着端口,按点切分时第四段会变成端口,同一 IP 的不同端口会被拆成不同条目。更稳的写法是同时以空格和点作为分隔符。
# -i 指定网卡,-tnn 不打印时间戳、不做域名和端口解析,-c 抓够 1000 个包停止 tcpdump -i eth0 -tnn dst port 80 -c 1000 \ | awk -F'[ .]' '{print $1"."$2"."$3"."$4}' \ | sort | uniq -c | sort -nr | head -20-F'[ .]'让 awk 把空格和点都当分隔符,前四段正好拼回源 IP。这个细节在面试里说出来,比背完整命令更有分量。
2.3 Shell 变量与四个必写脚本
位置参数和特殊变量是 Shell 题的入口,答错一个就会连带后面的脚本题失分。
| 变量 | 含义 | 注意点 |
|---|---|---|
$0 | 当前脚本文件名 | 不等于执行路径,取决于调用方式 |
$n | 第 n 个参数 | n 大于 10 要用${10} |
$# | 参数个数 | 不含$0 |
$* | 所有参数 | 加双引号时合成一个整体 |
$@ | 所有参数 | 加双引号时仍是独立多个 |
$? | 上一条命令退出状态 | 0 表示成功,非 0 是失败 |
$$ | 当前 Shell 进程 PID | 脚本里就是脚本自身进程号 |
$*和$@的区别要能用一句话讲清:不加引号时两者等价,加双引号时"$*"把参数拼成一整串,"$@"保持参数边界。面试官常追问“遍历参数用哪个”,答案是for i in "$@"。
批量建用户的脚本,重点在密码设置方式:
#!/bin/bash # $1 作为统一初始密码,生产环境应改成随机密码并强制首次登录修改 for i in $(seq 1 10); do useradd "user$i" echo "$1" | passwd --stdin "user$i" >/dev/null 2>&1 doneseq 1 10生成序列,--stdin让 passwd 从标准输入读密码。这里有个踩坑点必须知道:--stdin是部分发行版 passwd 的扩展参数,换到另一类系统上会报错,通用写法是echo "user$i:$1" | chpasswd。面试里主动提这句,等于告诉对方你踩过。
探测网段在线 IP,朴素写法是顺序 ping,254 个地址最坏要等四分多钟。加并发才是能过生产的答案:
#!/bin/bash # -c 1 只发一个包,-W 1 超时 1 秒,& 放后台并发,wait 收敛全部子进程 for ip in $(seq 1 254); do ( ping -c 1 -W 1 "192.168.1.$ip" >/dev/null 2>&1 && echo "192.168.1.$ip UP" ) & done wait判断依据是ping的退出状态,&&只在成功时输出。wait不能省,否则主脚本先退出,终端上看不到完整结果。
检查 URL 可用性,考的是 curl 的输出控制:
#!/bin/bash # -o /dev/null 丢弃响应体,-s 静默进度,-w 只打印状态码,--connect-timeout 防长时间卡住 code=$(curl -o /dev/null -s -w "%{http_code}" --connect-timeout 3 "http://www.example.com") if [ "$code" -ne 200 ]; then echo "access failure, code=$code" fi%{http_code}是 curl 的格式化输出变量。判断条件用-ne做数值比较,因为状态码是数字不是字符串。生产脚本里通常还会判断000,那是连接失败而不是 HTTP 返回。
日志打包加定时任务,考的是时间格式和 find 条件:
#!/bin/bash # crontab 配置:0 0 * * 1 /bin/bash /path/backup_log.sh DATE=$(date +%F) find /var/log -type f -name "*.log" -mtime +7 -print0 \ | xargs -0 tar -zcf "/tmp/log_${DATE}.tar.gz"%F输出年-月-日,满足“文件名带当天日期”;-mtime +7表示修改时间在七天以前;-print0配合xargs -0处理带空格的文件名,这是很多人翻车的地方。crontab 五个字段依次是分、时、日、月、周,0 0 * * 1就是每周一零点。
3. Python 与 MySQL:原理题拼的是因果链
Python 和 MySQL 在运维面试里不会考到开发岗的深度,但要求你能把概念讲出层次。Python 侧的问题集中在数据模型和内存,MySQL 侧集中在存储引擎、事务和复制。这两块的共同点是:只答结论会被追问,答出“为什么这样设计”才算过关。下面把高频题拆成可以直接背的因果链。
3.1 Python 数据类型:可变与不可变决定一半答案
数据类型本身不难,难在面试官要你把“特性”说出来。稳妥的答法是先分类,再说影响。
| 类别 | 类型 | 关键特性 |
|---|---|---|
| 不可变 | Number、String、Tuple | 值变则对象变,可作为字典的键 |
| 可变 | List、Dictionary、Set | 原地修改,引用传递时会影响所有指向它的变量 |
把这张表讲出来,后面深拷贝、函数传参、字典键合法性三个追问都能顺下去。字符串常用方法记replace、strip、split、upper、lower;列表记append、pop、insert、count、remove;元组只有index和count两个主要方法,因为不可变;字典记keys、values、items、get、update、pop。字典这块有个历史遗留问题:has_key在新版本已移除,判断键存在要用in,答题时用旧方法会直接暴露版本认知停留。
内置函数列举时不要贪多,挑有区分度的说:map、filter、zip、enumerate、sorted、isinstance、len、range。常用模块举os、sys、json、re、time、datetime、random、logging,并且每个配一句用途,比如“subprocess用来在脚本里调外部命令,比os.system能拿到返回码和输出”。
3.2 深浅拷贝、生成器与迭代器:三层递进答法
浅拷贝只复制最外层容器,内层元素仍然是原来的引用;深拷贝递归复制到底,副本和原对象完全独立。这句话谁都会说,区分度在例子和边界。
import copy origin = [1, [2, 3]] shallow = copy.copy(origin) # 只复制外层列表 deep = copy.deepcopy(origin) # 递归复制所有层级 origin[1].append(4) print(shallow) # [1, [2, 3, 4]],内层是同一个对象,跟着变了 print(deep) # [1, [2, 3]],深拷贝完全隔离copy.copy做浅拷贝,copy.deepcopy做深拷贝。两个边界要补:不可变对象(数字、字符串、元组)做深浅拷贝时,解释器通常直接返回原对象,因为改不了,没必要复制;切片origin[:]、list(origin)、dict(d)都是浅拷贝的常见形式。面试官问“什么时候必须用深拷贝”,答配置字典嵌套修改、批量任务里多个实例共享初始数据这两类场景,比空谈定义实用。
生成器、迭代器、可迭代对象是同一个问题的三个层次,按顺序答最清楚。可迭代对象是实现了__iter__方法的对象,能用 for 循环遍历;迭代器在可迭代对象基础上再实现__next__,能记住遍历位置,取完抛StopIteration;生成器是迭代器的一种实现方式,函数里出现yield,或者把列表推导式的方括号换成圆括号,都能得到生成器。
应用场景要说具体:读大文件时用生成器逐行产出,不会一次性把文件读进内存;处理超大列表的中间结果时用生成器表达式替代列表推导式,内存占用从 O(n) 降到 O(1)。这句话是加分项,因为它把语法和运维场景(读日志、处理大批量数据)接上了。
3.3 两道手写题:九九乘法表与阶乘
手写题的评分点不是能不能跑,而是边界处理和可读性。
# 外层控制行号,内层控制列数,end="\t" 让同一行不换行 for i in range(1, 10): for j in range(1, i + 1): print(f"{j}x{i}={i * j}", end="\t") print()range(1, 10)生成 1 到 9,内层range(1, i + 1)保证第 i 行输出 i 个式子,内层结束后的print()负责换行。用 f-string 比%或format更清爽,写的时候顺手加上说明,比闷头敲完不解释更容易得分。
阶乘题的关键在输入分支:
# 负数、0、正整数三种情况都要覆盖,0 的阶乘定义为 1 num = int(input("请输入一个数字: ")) if num < 0: print("负数没有阶乘") elif num == 0: print("0 的阶乘为 1") else: result = 1 for i in range(1, num + 1): result *= i print(f"{num} 的阶乘为 {result}")用循环而不是递归,一是避免大数递归深度超限,二是面试现场不容易写错。int()转换失败会抛异常,想完整一点可以套try,但手写题通常不要求,提一句“生产代码里这里要捕获非法输入”就够。
3.4 MySQL 三组对比:删除、字符类型、存储引擎
delete、truncate、drop的区别用表格一次说清:
| 维度 | delete | truncate | drop |
|---|---|---|---|
| 语言分类 | DML | DDL | DDL |
| 是否删结构 | 否 | 否 | 是 |
| 是否可回滚 | 事务内可以 | 否 | 否 |
| 是否带 where | 支持 | 不支持 | 不适用 |
| 自增值 | 不重置 | 重置 | 表都没了 |
| 速度 | 慢,逐行 | 快 | 最快 |
答题时补一句使用场景:想删部分数据用 delete,想清空整表保留结构用 truncate,表不要了用 drop。再补一个加分点:delete 逐行删除会写 undo 和 redo,大表删除会撑爆日志,生产上常用“分批删除加 limit”来控制。
char和varchar的差别在长度是否固定。char(n)定长,存不满会用空格补齐,取出来时尾部空格被去掉;varchar(n)变长,额外用一到两个字节记录实际长度。char上限 255 个字符,适合手机号、状态码、性别这类长度确定的字段;varchar上限 65535 字节且受行长度限制,适合地址、备注这类变长内容。追问“为什么定长更快”,答因为定长记录在页内的偏移可以直接算出来,不需要先读长度字段,变长字段多了还会有行溢出的开销。
MyISAM和InnoDB的对比是必考项:
| 维度 | MyISAM | InnoDB |
|---|---|---|
| 事务 | 不支持 | 支持 ACID |
| 锁粒度 | 表锁 | 行锁,基于索引 |
| 外键 | 不支持 | 支持 |
| 崩溃恢复 | 弱 | 有 redo log,可恢复 |
| 全文索引 | 支持 | 新版本已支持 |
| 适用场景 | 读多写少的分析型 | 高并发事务型 |
面试时先说结论“现在默认都用 InnoDB”,再解释原因:行锁降低冲突、支持事务和崩溃恢复、外键约束能保证一致性。MyISAM 不是完全没用,一些只读的报表库、日志归档表仍可能用它,说这句能体现判断力而不是背表。
3.5 事务、隔离级别与主从复制
事务是一组逻辑上不可分割的 SQL 操作,特性就是 ACID:原子性靠 undo log 实现回滚,一致性是最终目标,隔离性靠锁和 MVCC,持久性靠 redo log 刷盘。四个特性不要只念名字,各配一句实现机制,深度立刻不同。
四种隔离级别按严格程度递进,要能对应到它们解决的问题:
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| 读未提交 | 可能 | 可能 | 可能 |
| 读已提交 | 不会 | 可能 | 可能 |
| 可重复读 | 不会 | 不会 | 基本不会 |
| 串行化 | 不会 | 不会 | 不会 |
InnoDB 默认是可重复读,通过 MVCC 让同一事务内多次读到的数据一致,再通过间隙锁在很大程度上压制幻读。这句话是面试官最想听到的补充,因为只背表格的人答不出“默认级别怎么解决幻读”。
主从复制原理按四个动作讲:主库开启 binlog,记录所有变更;主库的 dump 线程把 binlog 发给从库;从库的 IO 线程写入 relay log 并更新位点;从库的 SQL 线程读 relay log 重放。整个默认过程是异步的,这也是延迟存在的根本原因。查看状态用SHOW SLAVE STATUS,新版本是SHOW REPLICA STATUS,重点看Slave_IO_Running和Slave_SQL_Running是否都为 Yes,以及Seconds_Behind_Master。
-- 关注两个线程状态和延迟秒数,IO 为 No 多半是网络或账号权限,SQL 为 No 多半是数据冲突 SHOW SLAVE STATUS\G延迟原因分四类答最清楚:主库写入压力大,大事务一次产生大量 binlog;从库硬件弱于主库,重放跟不上;一主多从时主库要把 binlog 发给每个从库,带宽成为瓶颈;从库重放早期是单线程,大表 DDL 或批量更新会卡住。优化手段对应到原因上:拆大事务、从库加索引减少重放耗时、开启并行复制、把大查询分流到从库之外的只读实例。
备份工具记两个就够:mysqldump是逻辑备份,导出 SQL 语句,跨版本恢复方便但慢;xtrabackup是物理备份,直接拷数据文件,速度快、适合大库,支持热备。备份策略的标准答法是“全量加增量加 binlog”:每周全量一次,每天增量,binlog 保留足够天数用于按时间点恢复,并且定期做恢复演练——只备份不验证等于没备份。
4. Docker、Kubernetes 与网络:容器题最后都会问回协议层
容器和编排的题看起来新,问法却很传统:概念、对比、命令、流程。Docker 部分集中在“和虚拟机的差别”与 Dockerfile 指令,Kubernetes 部分集中在组件分工、对象选择、健康检查和持久化。而负载均衡和 Service 一旦往下问,就会回到 OSI 七层和四层转发的差别,所以网络基础必须和容器放在一起准备。
4.1 Docker 与虚拟机的差别,别只答“更轻量”
标准答法分三层。第一层是架构:虚拟机通过 Hypervisor 虚拟出硬件,每台虚拟机跑一个完整操作系统内核;容器共享宿主机内核,靠 namespace 做隔离、靠 cgroup 做资源限制。第二层是代价:虚拟机启动要引导内核,分钟级;容器本质是宿主机上的一个进程,秒级甚至更快;镜像大小也差一个量级,虚拟机镜像有几个 G,容器镜像常见是几百兆。第三层是短板:隔离性弱于虚拟机,内核共享意味着一个容器把内核搞崩,宿主机和其他容器都受影响;安全边界不如虚拟机清晰。
把第三层主动说出来,是这道题的分水岭。只讲优点的人像在背宣传材料,讲清代价的人才像做过选型。
4.2 镜像、容器与 Dockerfile 的四个易混指令
镜像是只读模板,由多层文件系统叠加而成,每层对应 Dockerfile 里的一条指令;容器是镜像加一个可写层,删除容器时这一层也一起没了。容器状态记四种:运行、已暂停、重启中、已退出。命令层面按生命周期归类更好记:pull、images、rmi管镜像,run、start、stop、restart、rm、ps管容器,exec、logs、inspect管运行中的容器,save、load、commit管迁移。
启动 nginx 并挂载目录的命令是高频送分题:
# -d 后台运行,-P 把容器内暴露的端口随机映射到宿主机,-v 把本地目录挂到容器网页根目录 docker run -d -P --name nginx \ -v /home/nginx:/usr/share/nginx/html \ nginx-P和-p要分清:大写随机映射,小写指定宿主机端口:容器端口。-v的冒号左边是宿主机路径,右边是容器内路径,挂载后宿主机改文件,容器里立刻生效,这是配置和静态资源最常用的做法。
Dockerfile 指令里,COPY和ADD的区别必问:COPY只做本地文件复制,语义单一;ADD除了复制,还会自动解压本地 tar 包,也支持从 URL 拉取文件。听起来 ADD 更强,实际推荐用 COPY,因为 ADD 的隐式行为会让构建过程不可预测,远程拉取也不如先curl再COPY可控。另外CMD和ENTRYPOINT也常一起问:CMD提供默认命令,docker run后面跟参数会被整体覆盖;ENTRYPOINT定义入口,后面的参数会作为它的入参追加。
4.3 Kubernetes:组件、对象与三类探针
Kubernetes 是容器编排系统,解决的是调度、扩缩容、自愈和服务发现。和 Docker 的关系要一句话讲清:Docker 负责单机上的容器生命周期,Kubernetes 负责跨机器的编排,它通过容器运行时接口调用底层运行时,本身不直接管容器。
组件分工按控制面和节点分开答。控制面跑 API Server(唯一入口,所有请求都经过它)、etcd(保存集群全部状态,是唯一的有状态组件)、Controller Manager(各种控制器的集合,负责把实际状态拉向期望状态)、Scheduler(决定 Pod 落在哪个节点)。节点上跑 kubelet(负责本节点 Pod 的创建和健康上报)、kube-proxy(维护 Service 的转发规则)、容器运行时。
常见对象按用途记:Pod 是最小调度单位,Deployment 管无状态应用的副本和滚动更新,StatefulSet 管有状态应用(稳定网络标识、有序部署、独立存储),DaemonSet 保证每个节点跑一份(日志采集、监控代理),Service 提供稳定访问入口,ConfigMap 和 Secret 管配置,Ingress 管七层入口,PV 和 PVC 管存储。三者选择的应用场景要能各举一个:无状态 Web 服务用 Deployment,数据库集群用 StatefulSet,节点级日志采集用 DaemonSet。
创建 Pod 的流程按顺序说:kubectl提交请求到 API Server,API Server 写入 etcd,Scheduler 监听到未调度的 Pod 后选节点并回写,目标节点的 kubelet 发现分配到自己的 Pod,调用容器运行时拉镜像起容器,最后把状态回报给 API Server 写入 etcd。这套流程能顺下来,说明你理解的是声明式模型而不是命令。
健康检查是常考细节,三种探针别混:
# Pod spec 片段:存活探针失败会重启容器,就绪探针失败只是从 Service 摘流量 livenessProbe: httpGet: path: /healthz port: 8080 initialDelaySeconds: 10 periodSeconds: 5 readinessProbe: httpGet: path: /ready port: 8080 periodSeconds: 5livenessProbe判断容器是否活着,连续失败按重启策略重启;readinessProbe判断能否接收流量,失败只是把 Pod 从 Endpoints 里摘掉,不重启;startupProbe用于启动慢的应用,成功前其他探针不生效,避免启动阶段被误杀。探测方式有三种:httpGet、tcpSocket、exec,运维场景里exec常用来跑一条自定义检查命令。
持久化方式按演进顺序答:emptyDir随 Pod 生命周期存在,Pod 删了就没了,适合临时缓存;hostPath挂宿主机目录,简单但绑定节点;PV 和 PVC 把存储抽象成资源,由管理员提供或由 StorageClass 动态创建,Pod 只声明需要多大、什么访问模式。生产上基本是 PV/PVC 加 StorageClass 动态供给,答这句能体现落地经验。
4.4 网络:从 OSI 七层到四层/七层负载均衡的选择
OSI 七层从下往上:物理、数据链路、网络、传输、会话、表示、应用。运维面试不需要逐层展开,但要能对应设备和协议:网络层是 IP 和路由,传输层是 TCP 和 UDP,应用层是 HTTP、DNS、SSH。
TCP 和 UDP 的对比记三行:TCP 面向连接、可靠、有序,开销大;UDP 无连接、不保证可靠、开销小、延迟低。场景上一句话对应:网页、文件传输、数据库连接用 TCP;DNS 查询、日志上报、音视频流用 UDP。三次握手是 SYN、SYN+ACK、ACK,目的是同步双方序号并确认收发能力;四次挥手是 FIN、ACK、FIN、ACK,因为 TCP 是全双工,两个方向要分别关闭。常被追问“为什么握手是三次挥手是四次”,答案就在这个不对称上。
HTTP 状态码按段记:2xx 成功,200 正常、204 无内容;3xx 重定向,301 永久、302 临时、304 未修改;4xx 客户端错误,400 参数错、401 未认证、403 无权限、404 不存在;5xx 服务端错误,500 内部错误、502 网关收到无效响应、503 服务不可用、504 网关超时。排查时 502 和 504 最常出现,前者多半是后端进程挂了,后者多半是后端处理超时,往这两个方向答比背定义有用。
负载均衡的四层和七层之分,正好接上 LVS 和 Nginx 的对比。LVS 工作在内核态,基于 IP 和端口转发,不改应用层内容,吞吐高、资源占用低,适合做第一层入口;Nginx 工作在应用层,能按域名、路径、URL 做分流,支持正则和健康检查,适合做七层路由和静态资源服务。LVS 的 DR 模式改的是目标 MAC 地址,响应包由真实服务器直接回给客户端,所以要求调度器和真实服务器在同一网段;NAT 模式改写目标 IP,进出都经过调度器,调度器容易成为瓶颈;TUN 模式用 IP 隧道把请求送到后端,响应直连客户端,吞吐能提升明显但配置复杂。调度算法记四种:轮询、加权轮询、最小连接、加权最小连接。
Nginx 自身的考点集中在进程模型和限流:master 进程读配置、管理 worker,worker 进程处理请求,worker 数量通常设成 CPU 核数;限流有三类做法,限制请求频率、限制突发流量、限制并发连接数,对应limit_req和limit_conn两个模块。追问“Nginx 和 LVS 怎么选”,标准答法是“入口用 LVS 扛量,七层路由和灰度用 Nginx,两层配合”,不要答成二选一。
5. 易错题:五个最容易答反的考点
这一章整理的是练题时反复出现的失分模式。它们的共同点不是不会,而是答到一半就停,或者把相近的概念串了线。每条按“错在哪、为什么错、怎么答对”拆开,考前过一遍比再刷十道新题有效。
5.1 根分区满了,只答 df 和 du 的区别
错在哪:把题目当成概念题,答完“df 看文件系统、du 看目录”就结束,没有排查动作。
为什么错:面试官问的是处置流程,不是名词解释。只答定义说明你只见过 Healthy 状态的机器,没处理过真实的磁盘告警。
怎么答对:按四步走——df -h定位挂载点,du -sh /*逐层下钻,lsof +L1找已删除但被占用的文件,df -i排 inode 耗尽。最后补一句处置动作:日志类文件用: >清空而不是rm,配合 logrotate 做轮转,临时文件加定时清理。
5.2 统计类命令漏掉关键一步,数字对
本文还有配套的精品资源,点击获取