公司动态
2018网易运维笔试题复盘:从Linux命令到高可用架构考点全解析
网易的校招笔试卷运维工程师这个岗位的题目在技术圈里流传度一直很高。2018年这套题我印象特别深当时做完之后第一感觉是题目不难但处处都是坑。它不像算法岗那样考你各种花哨的数据结构也不像开发岗那样揪着源码不放它考察的恰恰是运维日常工作里最常碰到的那些事只不过换了种方式让你在纸上还原真实场景。这篇文章算是我的一个复盘笔记把当年做这套题时踩过的坑、后来重新梳理的考点以及我结合多年实践经验补全的完整解析都整理出来。如果你正准备参加校招运维岗笔试或者刚入行想系统梳理运维知识体系这篇内容应该能帮你少走不少弯路。1. 先说结论2018年这套运维笔试题的考察主线1.1 题型分布与分值逻辑网上流传的版本通常包含四类题型单选题、多选题、简答题、编程与综合题。分值配比大概在单选30分、多选20分、简答20分、编程与综合30分左右不同渠道流传的版本可能不一样但整体思路是统一的——基础扎实的能拿及格分真正做过运维或认真准备过的人才拿得到高分。单选和多选覆盖的是知识点有没有记牢简答题考的是能不能把原理讲清楚编程和综合题则直接模拟了上线后出故障的场景。你会发现它不考特别偏门的冷知识反而盯着高频命令、常用协议、典型故障反复出题。这就是校招运维笔试的一个核心逻辑招的不是技术明星而是能直接上手处理问题的人。1.2 考点地图从命令到架构的五个层次我把这套题的知识点拆成了五个层次这个框架后来也成了我带新人时的培训主线第一层是Linux基础命令与文件系统包括权限、用户、文本处理、进程管理。第二层是网络知识重点在TCP/IP协议栈、DNS、HTTP状态码这些高频考点。第三层是Shell脚本和自动化能力考察能不能把重复性工作用脚本封装起来。第四层是数据库与中间件MySQL索引与慢查询、Redis缓存策略几乎每年必考。第五层是整体架构与故障排查让你站在全链路视角定位问题。把考察主线拆清楚之后后面每一类题型的套路就明朗了。2. Linux与基础命令题看起来送分其实都在挖坑2.1 文件权限那道题rwx与umask的组合陷阱这套题里有一道典型的权限题大意是某文件权限为-rw-r--r--当前用户属于文件所属组问该用户能否修改文件内容。很多人一看所属组有r权限就直接选能写但实际上写权限对应的是w组权限是r--没有w位所以答案是不能修改只能读取。这题真正的坑在于umask。它对新建文件的权限影响是校招笔试的高频考点默认权限是666减去umask值得到实际权限。比如umask为022新建文件权限就是644新建目录是755。这里必须记住文件默认没有执行权限目录默认可以有执行权限所以计算方式不一样。如果题目里先让你创建文件再问权限很多人忘了umask这一步就会算错。我在实际工作中经常看到有人用chmod 777处理一切权限问题笔试不会这么考但会换个角度问为什么生产环境不建议用777标准答法是任何用户都能改和执行等于放弃了权限隔离一旦被入侵就是灾难。网易这套题里类似的坑还有chown和chgrp的区别考的是递归参数-R的使用场景。2.2 文本处理三兄弟grep、sed、awk的典型考法文本处理是运维笔试的必修课这套题里对grep、sed、awk的考察点非常集中。grep一般考两个点一个是grep -E和egrep的关系另一个是grep -v、grep -c、grep --color这些参数的实际含义。有一道印象很深的题要求从access.log中过滤出状态码不是200、且请求路径包含/api/的行正确写法是grep -v 200 access.log | grep /api/。注意这里用了管道因为单条grep做不到条件组合这就在考察命令组合能力。sed的出题方向比较固定无外乎替换、删除、打印。比如把a.txt中所有foo替换成bar并写回原文件很多人写了sed s/foo/bar/g a.txt但完全没生效因为少了-i。更精细的考法是sed -i.bak既改了文件又保留备份这是生产环境最稳妥的操作方式。awk则是三兄弟里最容易拉开分差的。它常见考法是按列处理awk {print $1, $NF} access.log或者条件统计awk $9 ! 200 {count} END {print count} access.log。真题里一般会结合排序和去重awk {print $1} access.log | sort | uniq -c | sort -rn | head -10这条经典命令能够在一条命令里完成统计访问量最高的前十个IP几乎每年笔试都有类似变体。2.3 进程与资源排查题怎么用ps/top/ss快速定位进程管理题里ps -ef和ps aux的区别是高频点。ps -ef是标准格式ps aux是BSD格式两者在大部分Linux发行版输出内容相近但ps aux展示的CPU和内存占用率更直观所以实际排查时用ps aux --sort-%cpu | head这种命令更多。笔试如果问找出CPU占用最高的进程基本就是考这条命令链。top的考点则集中在交互快捷键按P按CPU排序按M按内存排序按1展开每个CPU核心的负载。这个话题我在很多面试场合都强调过——背命令参数不如亲手按几遍。还有一个高频题是端口排查如何查某个端口被哪个进程占用。正确思路是先用ss -lntp | grep 8080或者netstat -tunlp | grep 8080拿到PID之后再用ps -fp PID反查进程详情。网易这套题里就有一道选择题专门考察ss -lntp中l、n、t、p四个参数的含义分别对应监听状态、不解析域名、TCP协议、显示进程信息。别看参数简单这些恰恰是线上问题排查最快的一条路。3. 网络与服务端知识题把协议栈背熟不如会看现象3.1 TCP三次握手与TIME_WAIT简答题的标准答法网络知识是运维笔试卷里的重头戏TCP三次握手不是单纯考你画个流程图就完事它更关心能不能把状态变化说清楚。三次握手是这样客户端先发SYN服务端收到后返回SYNACK客户端再回ACK。为什么不是两次因为要防止已经失效的连接请求突然又传到服务端导致资源浪费为什么不是四次因为服务端的SYN和ACK可以合并成一个报文没必要拆开。这个为什么是简答题的踩分点只画出三次箭头最多拿一半分。TIME_WAIT这个状态在运维笔试里几乎年年出现。我的理解是主动关闭连接的一方在发送最后一次ACK后会进入TIME_WAIT状态等待2MSL最大报文段生存时间后才彻底关闭。之所以要等一是为了防止最后一个ACK丢失二是为了让网络中残留的旧报文过期消失避免干扰新连接。真题常常会延伸问线上出现大量TIME_WAIT怎么办标准回答是从两个方向入手检查是否开启了tcp_tw_reuse在客户端场景下允许复用TIME_WAIT连接、tcp_tw_recycle不要轻易开NAT环境下有坑以及调整net.ipv4.tcp_fin_timeout参数。同时要分析应用层是否有频繁短连接可以考虑用连接池、长连接手段降低建连频率。这套回答既有参数又有业务逻辑踩分比较容易。3.2 DNS解析过程一道题能串起一整套排查思路试卷里关于DNS的题目基本都会给定一个具体场景用户访问某个域名很慢让你分析可能原因。这个题其实是从本地到权威逐层递进的过程。完整解析链路是浏览器先查浏览器缓存再查本机/etc/hosts然后查本地DNS缓存接着向递归DNS服务器发起查询递归服务器再依次去查根域名服务器、顶级域名服务器、权威域名服务器。每一层都有超时和缓存两个潜在问题。实践中的排查思路我会按这个顺序来这套步骤同样适合用在笔试答题里先看/etc/resolv.conf里配置的DNS服务器是否可达cat /etc/resolv.conf | grep nameserver。用dig trace跟踪完整解析过程看问题出在哪个环节。用nslookup对比不同DNS服务器的解析结果判断是否存在DNS劫持或污染。检查/etc/hosts是否有历史残留配置这种灵异问题我遇到不止一次。有一道真题问的是修改了DNS配置后为什么没有立即生效本质上是在考缓存。systemd-resolved、nscd、dnsmasq都有各自独立的缓存机制修改配置文件之后可能需要重启服务或者清缓存。很多人只重测了ping就下结论结果ping的DNS解析结果还停留在旧缓存里。3.3 Nginx反代与负载均衡配置题背后的设计意图网易这套题里有一道Nginx配置题要求写出一个反向代理配置把/api/路径转发到后端服务。典型答案是这样server { listen 80; server_name example.com; location /api/ { proxy_pass http://backend_server; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }这道题的雷点在于proxy_pass后面的URL是否带路径。如果写成proxy_pass http://backend_server/;请求会被去掉匹配前缀后转发如果不带斜杠则保留原始URI转发。这个细节很多人当时没注意丢分很可惜。负载均衡策略也是必考点常用策略包括轮询、加权轮询、ip_hash、least_conn。面试官真正想看的往往不是你会背策略名称而是知道该怎么选如果后端服务做了会话保持且有状态优先ip_hash如果处理能力不均用加权轮询如果请求耗时差异大least_conn更合理。这套题还会顺带问一个高可用设计Nginx挂了怎么办标准方案是Keepalived做VIP漂移或者用LVS、HAProxy组成双机热备。笔试答题不需要写完整配置但至少要提到心跳检测VIP漂移故障自动切换这个思路。4. Shell编程与自动化笔试里的手写题如何稳拿分4.1 一行脚本批量重命名管道与替换的边界Shell题是运维笔试里区分度的关键网易这套题有一道很典型的批量重命名题把目录下所有*.log文件重命名为*.log.bak。最简单的解法是for f in *.log; do mv $f $f.bak done我知道有相当多的人第一反应是rename命令但rename在不同发行版上行为不一样CentOS默认的renameperl版本和Ubuntu上的renameutil-linux版本语法差异很大。笔试环境里保险的做法就是纯for循环加mv不依赖外部命令的版本差异。如果题目升级成把access_20240101.log改成20240101_access.log答案可以用参数扩展for f in access_*.log; do name${f#access_} date_part${name%.log} mv $f ${date_part}_access.log done这里${f#access_}是去掉前缀${name%.log}是去掉后缀。Shell的变量扩展在笔试中不算超纲但如果平时只写${var}这种基础用法考场上很容易卡住。4.2 日志切割与定时任务的完整落地方案另一道Shell真题是日志切割。题目会给出一个每天都在增长的app.log要求每天凌晨切割一次并保留最近7天的日志。标准答案分两部分。第一部分是脚本#!/bin/bash LOG_DIR/var/log/myapp LOG_FILEapp.log YESTERDAY$(date -d yesterday %Y%m%d) cd $LOG_DIR || exit 1 mv $LOG_FILE ${LOG_FILE}.${YESTERDAY} # 重载应用日志句柄比如 kill -USR1 pid或者重启应用这里为什么要cd $LOG_DIR || exit 1因为脚本里用了相对路径如果目录不存在或者没有权限后续的mv会直接报错加上判断能让错误尽早暴露。第二部分是crontab0 0 * * * /opt/scripts/rotate_log.sh /var/log/rotate_log.log 21很多人写crontab时忽略了一个关键细节crontab默认的PATH极其精简不包含/usr/local/bin脚本里如果用了python3或docker这类命令一定要写成绝对路径或者在脚本开头export PATH/usr/local/bin:/usr/bin:/bin。这个坑笔试不会直接告诉你但会在脚本正确性上扣分。4.3 脚本健壮性细节set -e、引号与退出码网易这套Shell题里有一道挑错题我记忆很深——一段脚本里写了if [ $1 start ]; then echo starting... fi这行代码有两个明显问题第一$1没有加引号如果变量为空[ start ]会报语法错误第二在[ ]里虽然很多环境支持但可移植的写法应该是单等号。规范写法是if [ $1 start ]。更高级的坑在set -e这里。很多人知道set -e能让脚本在命令出错时立即退出但没意识到它在某些条件下会失效比如管道命令的退出码默认取最后一个命令的退出码cmd1 | cmd2即使cmd1失败了只要cmd2成功$?就是0这个脚本还会继续跑。针对这个情况正确答案是通过set -o pipefail配合set -e一起使用这样管道中任何一个环节失败都会让整个管道返回非零状态。我在自己的脚本里几乎都会加这两行set -e set -o pipefail笔试如果考到如何提升脚本稳定性这两行加上IFS的谨慎处理、变量加引号基本就能拿到大部分分数。5. 数据库与中间件考点运维必须懂的那几板斧5.1 MySQL慢查询与索引优化explain看完之后做什么数据库题在运维笔试里占比不低MySQL是绝对主力。有一道题给出一张订单表要求优化一条很慢的查询语句条件里包含where user_id ? and create_time ?。标准回答先建联合索引ALTER TABLE orders ADD INDEX idx_user_time (user_id, create_time);为什么把user_id放前面create_time放后面这是最左前缀原则的结果。如果查询只按create_time过滤这个联合索引就帮不上忙题目的经典问法为什么我的索引没生效基本都出在这个点上。explain的输出结果里我觉得最值得关注的是type列和rows列。type从好到坏大致是const、ref、range、index、ALL如果看到ALL基本就是全表扫描这时候必须动索引或改写SQL。rows是预估扫描行数如果和真实返回行数差距巨大说明统计信息不准确可能需要ANALYZE TABLE。真题的延伸坑是明明加了索引还是慢。这类题一般有几种情况查询列上做了函数运算导致索引失效比如where DATE(create_time) 2024-01-01应该改成范围查询create_time 2024-01-01 AND create_time 2024-01-02字符集不一致导致隐式类型转换也会让索引被抛弃。这几种情况在笔试答案里写全踩分点就很稳。5.2 Redis缓存策略缓存穿透、击穿、雪崩的答题框架Redis在2018年那会儿已经成了校招笔试的必考项网易这套题里有一道简答题问的是如何解决缓存穿透。很多人的第一反应是加缓存但缓存穿透恰恰是指查了一个缓存和数据库里都不存在的数据导致每次请求都打到数据库。标准答法有三个层面缓存空值查询结果为空时也设置一个短时间缓存例如SET key EX 60防止同一key反复击穿。布隆过滤器把所有可能存在的数据hash到一个bitmap里请求先经过布隆过滤器不存在的key直接拦截不查数据库。参数校验非法参数在接口层就拒绝比如id 0直接返回。缓存击穿和缓存雪崩的区别也要讲清楚击穿是某个热点key失效瞬间大量请求打到数据库雪崩是大批key在同一时间失效导致数据库压力骤增。击穿的解法是热点key不设置过期时间或互斥锁重建缓存雪崩的解法是过期时间加随机数或用多级缓存。这套答题框架放到现在依然适用。面试官要的不是唯一的正确答案而是你能不能把三种现象分清楚并给出对应的策略。5.3 一致性哈希与集群扩容考点延展有些版本会把一致性哈希揉进Redis集群或缓存分片题里问增加一台缓存节点后如何最小化影响已有数据。这个的背景知识是如果通过hash(key) % N做分片N变了几乎所有key的映射都会变大量缓存一下失效。一致性哈希的做法是把哈希值空间看成一个环每个节点在环上占据一个位置每个key顺着环找到顺时针第一个节点。这样新增节点时只有该节点逆时针方向到上一个节点之间的key需要重新映射其他key不受影响。笔试如果给出了环形图通常还会考虚拟节点的作用解决节点太少导致的哈希倾斜问题让各节点负载更均衡。这个考点在实际生产中更像设计思路不一定要写代码但一定要把为什么不能直接用取模讲透彻。6. 故障排查与综合题大题到底想要什么答案6.1 经典故障题用户反馈接口变慢怎么一步步排查这套笔试卷的大题部分有一道综合题场景是线上某接口突然变慢用户反馈明显卡顿要分析可能原因和处理思路。这类题没有标准答案但得分的关键是排查顺序是否合理。我给出的完整排查链路是这样的它后来也成了我处理线上故障的标准动作确认影响范围是所有接口都慢还是单个接口慢是一个用户反馈还是大面积反馈。看系统层指标top看CPU和负载free -h看内存iostat看磁盘IOvmstat看系统整体状态。看网络层指标如果带宽被打满sar -n DEV或iftop能直接看到流量异常。看应用日志聚焦错误日志、慢日志grep timeout app.log、搜索5xx状态码。看数据库show processlist;有没有长时间未结束的SQL慢查询日志有没有新增。链路追踪或直连测试跳过负载均衡直连后端复现问题缩小故障范围。我记得这道题班里同学给出了两种典型错误答法一种是上来就查数据库忽略了系统负载和服务端日志另一种是不停绕圈子没有把可能性逐层排除。其实面试官要的是你脑子里有一套完整的排查地图知道在什么阶段用什么工具。6.2 容量评估题的计算思路综合题里还会出现一个容量评估题比如预估单台服务器能支撑多少QPS。这类题不是要精确值而是考察你有没有工程估算的能力。计算框架一般是四步先确定单请求平均耗时再用并发数除以平均耗时得到QPS上限然后留出余量。举个例子假设接口平均响应时间50ms服务器最大并发连接数1000那理想QPS就是1000 / 0.05 20000但实际还要考虑CPU、内存、带宽、连接池等瓶颈通常只敢按理想值的30%-50%做容量规划。这道题里如果出现了PV怎么换算成QPS这种问法通用公式是QPS约等于PV除以单台服务器一天内的有效秒数再乘以峰值系数。传统经验值是峰值QPS约为平均QPS的3到5倍。这个估算方法不一定精确但在笔试里展示出了架构意识。6.3 高可用设计的踩分点最后一道综合题往往和一个场景绑定比如设计一个可支撑千万级日活的高可用架构。这道题开放度很高但再开放也有几个必答的踩分点接入层用负载均衡Nginx或SLB分发流量。应用层多实例部署无状态化设计让任意一台机器重启不影响整体。缓存层用Redis Cluster或主从加哨兵避免单点。数据库层做读写分离读多写少走从库事务性强走主库。核心链路加熔断降级比如接口超时快速失败避免雪崩。数据备份和恢复方案要么定时全量加binlog增量要么有跨机房容灾。我记得当时很多人只写到数据库主从复制就停了但高可用设计更看重任一组件挂了系统还能不能继续服务这个视角。如果你能答出状态尽量往后端放、每一层都可替换这样的分层思想这道题基本就稳了。7. 复盘手记这套题考完之后我重新梳理的知识点考试只是一时的真正的收获在于把一张卷子里暴露出的盲区补全。这套2018年的笔试卷对我的后续工作影响很大我重新梳理过几遍知识点有几个体会想分享。第一基础命令必须做到条件反射。不是能写出top而是看到CPU飙高知道按什么键、看哪一列、下一步用什么命令定位。笔试里很多选择题考的就是这种肌肉记忆平时没有亲手压过测、排查过问题很容易在几个长相相似的参数里犹豫。第二网络协议不要死记硬背要用抓包去验证。我后来专门用tcpdump配合Wireshark看了一次完整的三次握手和四次挥手状态变化瞬间就刻在脑子里了比背十遍状态转换图都有用。笔试里考TIME_WAIT、CLOSE_WAIT的区别时你能直接联想到实际报文长什么样答题就不会空泛。第三Shell脚本一定要追求可复用和健壮。笔试里的脚本题通常很短但评分点全都藏在细节里——变量有没有加引号、有没有处理掉文件不存在的情况、退出码是否正确。我后来给自己定了一条规矩所有生产环境脚本必须能在set -e -u -o pipefail下运行通过这个习惯直接提高了脚本的存活率。第四故障排查题千万别靠猜。哪怕在笔试里也要把每一步排查为了排除什么假设写清楚。我在实际带团队时发现新人的差距从来不在知识量而在排查思路是否线性、是否每一步都有明确的验证手段。这个问题笔试阶段就能暴露出来早发现早补。最后再说一个当年没人告诉我的小技巧做题时先扫一遍所有题目把会做的做完再回头啃不确定的题。运维笔试不是讲究势如破竹而是讲究稳定得分。基础题拿满简答题踩准关键词综合题写出层次整张卷子的分数就差不了。哪怕到现在我处理陌生故障时也还是这套思路——先把能确定的部分稳住再逐步逼近根因。