1. 从一份校招笔试卷看运维工程师的真实能力画像
每年的秋招季,总有不少同学在后台问我同一个问题:运维岗笔试到底考什么?是不是就背背Linux命令、看看网络基础就能过?
说实话,我当年也有过这种天真想法。直到自己实际参加过几场大厂校招笔试,又作为面试官参与过几次校招面试之后,才真正意识到:运维工程师的笔试,不是考察你会不会背命令,而是在用一套精心设计的题目快速筛选出那些真正理解系统、理解网络、理解业务架构的人。尤其在网易这种级别的公司,2018年的校招运维笔试卷几乎可以看作行业的风向标——它不追求偏题怪题,而是把运维日常工作中的核心场景压缩进一两个小时,考察你的工程素养和问题排查思维。
这篇文章不打算逐题复现当年的试卷,毕竟题目版权在那里,我能做的是把运维笔试中反复出现的核心考点、常见的题型思路、以及我最近几年从事运维工作后回头看这套笔试题的复盘心得,尽量完整地给你拆开讲透。文中的所有结论和案例,都来自我实际带过的校招生、我参与过的面试题库评审,以及我自己踩过的坑。不管你是正在准备校招的应届生,还是打算转行运维的开发者,这篇文章都能帮你把复习方向理清楚。
先给一个总体的结论:大厂运维笔试的考察权重,大概遵循"Linux基础 30%、网络 20%、脚本编程 20%、数据库与中间件 15%、云计算与容器 10%、其他软技能 5%"这个比例。下面我按这个顺序逐块拆解,每块都会给出典型的出题形式和答题思路。
2. Linux基础题:看似送分实则暗藏杀机的方向
Linux操作系统是运维工程师的生存工具,笔试中这块内容占比最高,但经常出现的情况是:你觉得都会,分数出来却不高。为什么?因为Linux基础题太容易出细节了,而细节恰恰是区分"背过命令"和"真正用过系统"的分水岭。
2.1 文件系统与常用命令:考察的是组合能力
单纯的"ls、cd、cp、mv"这种命令背诵在笔试里基本不会出现,出题人真正想看的,是你能不能在限定条件下用命令完成任务。比如这类经典题:
"有一个日志文件access.log,需要找出访问量排名前10的IP地址,并输出到top10.txt中。"
这道题看起来平平无奇,但考察点至少有三个:awk的字段切割、sort的排序与去重、uniq -c的统计逻辑。我见过太多人写出来的答案是用一层层管道硬凑,但完全没有考虑到sort -rn和uniq -c配合时的坑。正确的解题思路是:
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10 > top10.txt这里有一个非常隐蔽的考点:为什么要在uniq -c前先sort?因为uniq只能去除连续重复的行,如果IP出现的位置不连续,uniq -c会输出多行统计结果,导致最终的结果完全错误。这个细节,没有实际处理过日志的人很难注意到。我在面试中遇到过不少候选人,前面聊得挺好,一追问这个"为什么",立刻露馅。
另一个高频方向是磁盘与inode相关的排查题。笔试会给一个场景:"服务器提示No space left on device,但df -h显示还有空间剩余",问你怎么处理。这个题目其实是在考察你知不知道df -h和df -i的区别,以及你是否接触过inode耗尽的问题。答案很简单,用df -ih查看inode使用率,找到满的那个分区,然后排查是否有大量小文件堆积。但就是这么简单的一个问题,当时的笔试正确率不到四成,因为很多人在简历上写了"熟悉Linux",实际上连df有哪些参数都没仔细看过。
2.2 权限管理:不止是chmod 777
权限类题目也是笔试的常客,但考察方式往往很刁钻。直接考"chmod 755什么意思"太简单了,大厂会换个角度:
"一个文件权限为-rwsr-xr-x,请问这个s代表什么?如果将这个文件的所有者改为root,会发生什么?"
这道题考的是setuid位。运维工作中,passwd命令、sudo命令都涉及setuid的机制,如果你只停留在chmod 777的层面,这道题基本只能靠蒙。答案是:s代表setuid位,表示执行该文件时,进程的有效用户ID被临时设置为文件所有者的用户ID。将所有者改为root后,任何用户执行该文件时都以root权限运行,这也是很多系统漏洞的根源。
另一个容易被忽略的点是umask。笔试常给一个场景:"系统umask为027,新建一个文件,权限默认是多少?"很多人直接回答644,忽略了umask对文件和目录的不同影响:文件默认权限是666减去umask,目录是777减去umask。0666 - 0027 = 0640,所以新建文件的权限是640而不是644。这个细节在工作中影响极大,特别是你写脚本去创建配置文件时,默认权限一旦过宽,就可能在安全审计时被单独拎出来点名。
2.3 进程管理与系统负载:排查思路比命令本身更重要
进程管理相关的题目,笔试中通常不会直接问"kill和kill -9有什么区别"这种低水平问题,而是给你一个故障场景,让你描述排查流程。比如:
"某台服务器CPU使用率100%,负载持续升高,但通过top查看时,CPU占用最高的进程却一直在变化,可能是什么原因?下一步你会怎么做?"
这道题考察两个层次:第一,你是否知道top查看的是瞬时状态,进程变化快说明可能有进程在频繁fork子进程;第二,你是否掌握了pidstat、ps -ef --forest、pstree等命令的组合用法,能否顺着进程树找到真正的根进程。我记得当时笔试后和几个同学对答案,不少人的回答只有一句"kill掉占用最高的进程",这个答案如果放到生产环境,不仅解决不了问题,还可能误杀关键进程导致业务中断。
我还想提一类题:给出free -h和top的部分输出,问"这个系统的内存是否不足?"很多人的第一反应是看free列是不是接近0。但实际上,Linux对内存的使用策略是"能用则用",大量内存被用作文缓存(page cache)是正常现象,真正需要关注的是available列的值。如果available已经很低,同时swap的使用率在持续增长,才说明系统确实存在内存压力。笔试中这类题,考察的就是你有没有真实经历过内存告警,还是只背过概念。
3. 网络与协议考点:这五类题答不上来基本没戏
网络是运维工程师的另一条腿。不同于网络工程师需要深入理解路由交换原理,运维岗的网络笔试更聚焦在"应用层的连通性排查"和"常见协议的工作机制"上。但这个聚焦并不代表简单,反而因为贴近日常工作,出题人可以把问题挖得很深。
3.1 TCP三次握手与故障排查的经典结合
三次握手几乎是每个岗位笔试都会涉及的基础题,但运维笔试不会让你默写三次握手的流程,而是这样问:"客户端连接服务器超时,如何通过抓包定位是哪一步出了问题?"或者"服务器的TCP连接队列溢出,通常会出现什么现象,如何确认?"
这两个问题都是真实的线上故障。第一个问题的排查思路是,在客户端和服务端分别抓包,观察SYN包是否有响应,如果SYN包发出后没有SYN-ACK返回,大概率是中间网络问题或服务器的iptables规则丢弃了包;如果SYN-ACK发出但客户端没有回ACK,则可能客户端侧有连接数限制或者网络问题。第二个问题考察的是半连接队列和全连接队列的概念,服务端出现大量SYN_RECV状态或accept队列溢出时,客户端表现是连接超时或延迟很高,这时候可以通过ss -lnt查看Send-Q是否积压来确认。
你看,这些内容在教科书里就是"三次握手的过程"五段话,但到了运维笔试里,变成了一个完整的排障链路。复习的时候如果只是背概念而不去实际抓包看几次,遇到这种题很难答得系统。
3.2 HTTP状态码:别只记404
HTTP协议是Web运维的基础,笔试中对于状态码的考察通常会混合在场景题里。比如:"用户在浏览器访问一个页面,返回200,但页面内容显示不全,可能是什么原因?"或者"反向代理返回502,你会从哪些方面排查?"
第一个问题,可能的原因包括:响应被截断(如负载均衡的buffer配置不当)、页面引用了部分加载失败的静态资源、服务端返回了部分内容后连接中断。第二个问题,502 Bad Gateway通常意味着反向代理无法从上游服务器获得有效响应,排查顺序是:先确认上游服务进程是否存活,再确认上游服务的监听端口是否正确,接着确认代理配置中的超时时间是否过短,最后看上游服务的错误日志。这种题没有标准答案,但题考察的是你的排查逻辑是否有条理,能不能把"代理层-应用层"之间的链条理清楚。
还有一个容易被忽略的考点是Location头。笔试常给一个302跳转的响应,让你判断跳转地址是什么前缀的协议。大多数人看到302就下意识认为是HTTP跳转,但如果header里Location写的是https://,这就意味着它实际是一个HTTPS的重定向。运维在处理混合协议场景时如果忽略这个字段,写的重定向规则会一直不生效。
3.3 DNS、负载均衡和HTTP的深层链路题
大厂笔试最喜欢出的综合性题目长这样:"用户反馈访问某个域名很慢,从浏览器到服务器,整个链路有哪些环节可能造成这个现象?如何一步步定位?"这道题考察的是对整个访问链路的全局认识,大致包括:DNS解析(包括递归解析和缓存)、TCP建连(包括三次握手和TLS握手)、反向代理转发、应用服务器处理、数据库查询、响应返回、浏览器渲染等环节。真正完整的答案是针对每个环节给出对应的排查命令和指标,比如dig看解析耗时、curl -w看各阶段耗时、ss看连接队列、top看应用负载、慢查询日志看数据库问题。
这种综合题没有标准答案,得分完全取决于你的知识面是否成体系。我当时笔试能通过,一个很重要的原因是平时习惯把"用户访问慢"当作一个链条来理解,而不是单纯的"是不是服务器性能不行"。这个习惯也让后面实际工作时受益很多,很多看起来"玄学"的线上问题,最后都是沿着链路一层层往下查找到根因的。
4. 脚本编程与自动化:校招笔试里的"硬通货"
运维工程师的日常,一半时间在处理故障,另一半时间在写脚本消灭重复劳动。笔试题对脚本编程的考察,往往不是让你从零写一个复杂程序,而是考察你能否用最简洁有效的方式处理数据、文本和日志。Shell和Python是两大出题方向,Shell更多考察文本处理和系统命令的组合能力,Python则更倾向逻辑和类库的使用。
4.1 文本处理三剑客:grep、sed、awk的典型考察姿势
关于文本处理的题目,我印象最深的一道是:
"有一个文本文件,每行格式为时间 IP 状态码 响应时间,要求输出所有状态码为500的记录中,响应时间大于3秒的行。"
答案是:
awk '$3==500 && $4>3 {print}' access.log看起来简单,但笔试中经常有人把awk的分隔符、字段编号搞错,或者忘记awk中字符串和数字之间的隐式转换可能带来的问题。如果你用$3=="500"而不是$3==500,在awk中会因为类型不同而无法匹配。这是一个非常实用的细节,真的线上排查日志时如果写错,你会得到一个空的结果,然后误判为"没有慢请求"。
sed的考点则集中在替换、删除和行区间操作。比如"将配置文件中的所有注释行删除"、"将第10行到第20行之间的#开头的行注释去掉"这类题。正常情况下sed -i '/^#/d'就能删除注释行,但如果配置文件里既有左边缩进的注释又有末尾的注释,往往还需要配合正则细化。考察的核心是正则表达式的熟练度,以及sed的p、d、s、c四种常用命令在什么场景下选哪个。
4.2 Linux运维常用命令大全:笔试的隐形考察点
很多同学复习时会去背"Linux常用命令大全",但笔试真正考察的,往往是你面对具体场景时能不能想到合适的命令组合。以日常文件处理为例,考察频率极高的是:找出指定目录下最大的前10个文件、统计日志中某种错误出现的次数、批量重命名、批量替换配置文件中的某个参数等。
我建议每个准备笔试的同学都自己动手做一套"运维命令速查表",不是那种网上抄来的大全,而是针对你实际用过的场景做分类记录。比如我自己整理的文件排查、进程排查、网络排查、性能排查四类速查表,在笔试前复习一遍,比翻书效率高得多。笔试题最后的开放题,往往就是让考生"描述一次线上故障的处理过程",如果你脑中有一张清晰的"排查命令地图",写出来的答案自然比别人有条理。
4.3 Python脚本题的常见套路和踩坑
Python在运维笔试中的地位逐年上升。笔试中的Python题通常不考算法,而是考实际的数据处理和系统交互。常见出题方式包括:
- 读取一个日志文件,统计IP出现次数并排序输出;
- 调用shell命令,获取服务器磁盘、内存等信息,格式化为JSON输出;
- 遍历目录,找到所有大于指定大小的文件并删除。
这些任务用Python写起来并不难,但笔试时间有限,很多人会在细节上丢分。第一个坑是忘记处理文件编码,日志文件经常不是UTF-8,读之前先open指定编码;第二个坑是系统命令的结果是bytes类型,直接当字符串处理会导致判断失败;第三个坑是路径处理时没有用os.path.join而是手动拼接字符串,在跨平台场景下很容易出问题。这些都是我在批改校招笔试时反复见到的错误,你自己平时练习时也要养成写健壮代码的习惯。
5. 数据库与中间件:笔试中拉开差距的分水岭
数据库和中间件在运维笔试中的占比不低,而且是区分"只懂服务器"和"懂业务架构"的关键板块。一个优秀的运维工程师,不仅要保证数据库实例正常运行,还要能在业务量增长时给出合理的容量评估和性能优化建议。
5.1 MySQL索引与SQL基础:都是必考课
MySQL相关的笔试题目,基本不会直接让你写增删改查,而是围绕索引、优化、事务这三块做文章。比如:
"有一个user表,数据量500万行,查询select * from user where age=25 and city='北京',发现每次查询都很慢,如何优化?"
这类题考察的是:首先是否知道用explain查看执行计划;其次是否理解联合索引最左前缀原则,在此基础上给出建议:对(city, age)建立联合索引,还是把city放前面的查询频率更高?最后是覆盖索引的优化,如果只需要id和name字段,尽量使用select id, name而不是select *,避免回表。
我看过不少答案,纠结点全在"用哪个索引"上,却忽略了加索引前先explain这个前置步骤。在笔试中,你的答题顺序能直观体现出你的工程习惯。
5.2 Redis、缓存一致性、幂等性:场景题越来越多
随着互联网业务对高并发的需求越来越大,缓存几乎是每个运维笔试的必考项。Redis的考察重点通常在:缓存穿透、缓存击穿、缓存雪崩三兄弟的区别和解决方案,以及缓存与数据库的一致性如何保证。
我还记得有一道题特别有意思:"秒杀场景下,缓存中的库存数量如何扣减才能保证不超卖?"很多人的第一反应是"用Redis的decr命令",然后补充"在数据库事务中再扣减一次"。但真正的问题在于:如果扣减库存后业务逻辑执行失败,需要回滚缓存,这时候如何保证缓存与数据库的最终一致?这题没有唯一答案,但至少有三种靠谱的思路:事务消息、延迟双删、binlog订阅同步。笔试考这种题,表面考Redis命令,实际考你面对分布式系统时有没有一致性意识。
5.3 Nginx:从配置题到原理题的跨越
Nginx作为Web服务器和反向代理,在笔试中出现的频率很高。低阶题目是"写一个Nginx配置,将/api/开头的请求转发到后端服务",高阶题目会问"Nginx的worker_processes和worker_connections如何配置?为什么一个进程能处理成千上万个并发连接?"
前者做对不难,后者就涉及事件驱动模型和epoll的原理了。当年笔试中有一道让我印象深刻的题:"在高并发场景下,Nginx返回大量502,但后端服务的CPU和内存都正常,最可能的原因是什么?"答案是后端服务的进程数或最大连接数限制被耗尽,Nginx无法建立新的连接。如果你只看过Nginx的配置模板而没理解upstream的并发限制机制,这道题基本无从下手。
6. Docker/Kubernetes与云原生:2018年笔试卷中的前瞻性布局
现在看2018年校招笔试试卷,很多人觉得考Docker和K8s很超前。但实际上,那一年国内大厂的生产环境已经在大规模落地容器化,运维工程师的岗位要求里明确写着"熟悉容器技术者优先"。这一方向在试卷中的分值虽然不高,但它承担着筛选"对这行有热情且有技术敏感度"候选人的任务。
6.1 Docker基础题:镜像与容器的生命周期
Docker的考点集中在:镜像和容器的关系、容器和虚拟机的区别、常用命令以及Dockerfile的编写规范。笔试题中常见的是一道Dockerfile排错题,给一个写好的Dockerfile,让你找出其中至少三个不合理的地方。
这类题考察的点很细,比如:是否用了COPY而非ADD(ADD有隐式的自动解压和远程URL拉取行为,容易引发安全风险);是否在镜像中留存了不必要的构建依赖;是否以非root用户运行应用;是否指定了精确的基础镜像版本而不是latest。我当年就是在"latest标签"这个点上丢了一分,事后回顾才发现,生产环境用latest标签会导致镜像不可复现,这是大忌。
Kubernetes的考察则更偏向概念理解,比如Pod与容器的关系、Deployment与StatefulSet的适用场景、Service的几种类型区别、以及kubectl常用操作。有一道题让我记忆犹新,是要你解释"如果Kubernetes集群中的一个Pod频繁重启,你会从哪些方面排查"。答案是看kubectl describe pod的事件信息、看Pod的日志结合退出码判断、检查资源限制是否导致OOM被kill、检查探针配置是否合理,尤其是liveness探针误判导致容器被反复重启的情况。
6.2 云计算运维的新考题方向
虽然2018年的试卷以传统运维为主,但已经出现了少量云平台相关的题目,比如"如何评估一个云上应用的高可用架构""对象存储与传统文件系统的区别"等。这类题目不需要你背某个云厂商的具体产品,而是考察你对分布式架构的理解,比如:无状态应用可以水平扩展、有状态应用需要持久化存储和主从同步、数据备份与容灾要遵循"两地三中心"的冗余逻辑。
到了今天,云计算和容器化已经是大规模普及的状态。即使你复习的是多年前的笔试卷,我也建议你在掌握传统运维知识的基础上,重点补一下Kubernetes的核心概念、云平台的基础产品和监控体系,比如Prometheus和Grafana的组合。这些内容在校招笔试中出现的比重只会越来越大,提前准备不吃亏。
6.3 从kubernetes调用containerd看考察趋势
近几年有一个比较新的考点方向值得提一下:Kubernetes是如何调用containerd的。这道题反映了大厂笔试正在从"你会不会用"转向"你理不理解内部机制"。简单来说,kubelet通过CRI(Container Runtime Interface)与containerd通信,kubelet作为CRI客户端,containerd作为CRI服务端(通过containerd内置的cri插件实现),containerd再通过runC或其它OCI运行时创建和运行容器。整个调用链是:kubelet -> CRI -> containerd -> OCI -> runC。
这类题目在笔试卷中出现,说明出题人希望筛选出不只是背命令,而是愿意深入源码和原理的工程师。如果你能熟练描述这条链路,并解释为什么需要CRI这一层抽象,在面试里绝对是一个加分项。
7. 从笔试到面试:校招备战的策略与复盘心得
笔试通过只是第一步,但笔试的备战过程会直接影响你在面试中的表现。很多面试题就是从笔试题目演变而来的,面试官会拿着你笔试时的答案追问细节和"为什么"。所以备战校招,笔试和面试应该当成一个整体来准备,而不是分两个割裂的阶段。
7.1 做题顺序与时间分配:这两年份血的教训
我记得自己在参加笔试时,最怕的是前面的大量选择题耗费了太多时间,导致后面的命令题和排障题没有时间写。实际上,大厂笔试试卷的分数分布通常是:选择题占大头、命令题和简答/场景题各占一部分。选择题的答案是客观的,能做就做,举棋不定的题先标记跳过,把时间留给后面的场景题——因为场景题只要写出合理的排查思路就能得分,而选择题完全靠记忆,蒙对的概率并不高。
另一个建议是:对于场景题,先列提纲再写答案。比如一道"线上故障排查"题,先在草稿纸上写"1、先看监控;2、确认影响范围;3、逐层排查网络、系统、应用;4、定位根因;5、恢复与复盘",然后每一点再展开一两句话。这样写出来的答案,逻辑清晰,得分的概率远远高于想到什么写什么。
7.2 收集整理属于自己的运维手册
备考期间,我建议你开始建立自己的知识库,把网上分散的内容整合成自己的运维手册。内容可以包括:Linux常用命令按场景分类的记录、常见报错和解决方法的截图、常用的排查命令模板(CPU高、内存不足、磁盘满、端口不通、连接超时)、以及Shell或Python脚本的常用片段。
自己动手整理一遍,和单纯看别人的总结,效果完全不同。整理的过程其实就是主动回忆的过程,你在复习时做过的每一道题、排过的每一个"假想故障",都能变成你面试时随口说出的案例。包括前面提到的运维工具箱、uos运维工具、网络运维工具等,你可以逐个尝试,找到自己顺手的几款,把它们写进你的工具链记录里。
7.3 经验与体会
最后分享一点我最真实的体会:运维笔试考的不是一个点,而是一张网。它把Linux、网络、脚本、数据库、容器这些知识点交织在一起,模拟的是生产环境中"你从一条告警发现一个可疑线索,然后顺藤摸瓜定位到另一个服务的问题"这种真实工作状态。所以,刷题时不要满足于"这道题我会",每次做完可以问自己三个问题:这道题的考点在真实工作中对应什么场景?如果数据规模再大一倍,答案还成立吗?如果这个故障在半夜两点发生,我的处理步骤和时间线是什么?这三个问题想清楚了,你准备的就不仅仅是一份笔试,而是这份运维工作的基本功。