十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

运维开发笔试核心指南:从TCP状态机到场景设计题

运维开发笔试核心指南:从TCP状态机到场景设计题 说实话看到这个标题的时候我愣了一下。2020年校招搜狐畅游运维开发工程师。那会儿我也在准备类似岗位的笔试看到运维开发四个字的时候脑子里第一个念头是这到底是招运维还是招开发后来真正入了行才明白这个岗位要的就是那种既能写代码又能扛机器的人说白了就是全栈里的全栈但又不是传统意义上的全栈——你要懂网络、懂系统、懂数据库还得有工程化思维能写工具、写平台、做自动化。这篇东西不是给你回忆一段笔试答案而是想跟你聊聊像搜狐畅游这种游戏公司在笔试里到底想从运维开发候选人身上看到什么。整篇文章会围绕知识点模块、答题策略、以及那些裸考必挂但准备后很简单的隐性考点展开。想投运维开发方向的校招生或者已经在准备笔试的这篇应该能帮上忙。1. 先把岗位想明白运维开发笔试在筛选什么样的人许多候选人拿到笔试题就闷头刷题结果往往不太理想。原因在于运维开发笔试和纯后端开发笔试、纯运维笔试都不一样它是一个交叉口考的是你能否用开发的思路解决运维的问题。搞懂这一点你的备考方向才不会跑偏。1.1 游戏公司为什么要设运维开发这个岗搜狐畅游做的是游戏业务游戏业务对运维的依赖度极高。玩家分布在全国乃至全球各地网络环境千奇百怪游戏版本更新频繁但服务不能停服务器数量动辄上千每台机器上的CPU、内存、磁盘、网络状态如何掌握传统运维靠人肉盯着但游戏公司扛不住这种人力消耗所以就必须有一个岗位专门负责把运维工作产品化、工具化。这也是运维开发这个岗位的核心价值所在。它不直接面向玩家写游戏逻辑也不像传统运维那样整天敲命令而是做一套又一套自动化系统监控告警平台、发布系统、容量管理平台、日志采集分析系统、故障自愈工具等等。笔试里考的Linux、网络、Python、数据库最终都是为了这个目标服务的。我见过不少候选人简历里写着熟悉Linux熟悉Python但笔试一考网络就成了差不多先生TCP三次握手说不清TIME_WAIT状态更是完全没概念。这种人在面试官眼里基本属于简历写了但功底存疑。笔试设计的逻辑很简单不是考你会不会而是看你是真会还是停留在百度一下就会的程度。1.2 笔试考察的五个核心知识版图结合搜狐畅游这类游戏公司的笔试风格运维开发岗通常逃不开以下几块内容操作系统与Linux基础进程管理、内存管理、文件系统、系统调用、常用命令、系统性能分析工具top、vmstat、iostat、sar等。网络基础TCP/IP协议栈、HTTP协议、DNS解析过程、TCP三次握手四次挥手、常见网络故障排查思路。数据库MySQL索引原理、SQL优化、事务与锁机制偶尔会涉及Redis缓存使用场景。脚本与编程Python为主Shell为辅考察字符串处理、文件处理、正则表达式、简单的算法逻辑。场景设计题比如日志分析、监控告警设计、自动化部署方案、故障排查流程。这五块不是平均用力不同公司出题偏好差别很大。游戏公司更偏重网络和高并发场景因为游戏在线业务的实时性要求高玩家对卡顿和掉线的容忍度极低。你在准备时要有侧重不能拿一套后台开发的复习提纲走天下。1.3 笔试中的隐藏分答题逻辑比答案本身更重要这一点太关键了。运维开发的笔试阅卷人通常不是HR而是团队里的技术负责人。他看的不只是你最后的答案对不对更是你的思考过程。同一道线上服务CPU飙升排查思路是什么的题有人写重启一下就好了有人写先top看哪个进程再用pidstat定位线程然后看堆栈结合监控平台对比变更记录。后者哪怕后来发现原因判断错了也会比前者得分高。所以我在笔试时形成的一个习惯是所有简答题和场景题都按是什么-为什么-怎么查-怎么解决-怎么预防的结构写。哪怕题目要求只需要一句话我也尽量写两到三句把排查思路链条展示出来。记得有一次笔试有一道题是MySQL慢查询该如何优化我除了写explain、加索引之外还写了先定位是哪类SQL再结合业务是否可接受读写延迟最后考虑从SQL改写、索引调整、缓存引入、读写分离几个层面逐级优化。这种答案看起来就有层次感面试官会觉得你有实战思维而不是只会背八股。2. 网络与系统基础不是背概念而是能讲清来龙去脉网络和系统是运维开发的基本盘。游戏公司对这方面尤其看重因为线上故障十有八九跟网络和系统资源有关。笔试中这部分大概是30%到40%的权重属于得基础者得天下的部分。2.1 TCP状态机一道题就能分辨你是背的还是懂的TCP相关题目属于必考重点几乎是所有运维开发笔试的送分题和送命题。送分是因为知识点固定送命是因为许多人只背了三次握手、四次挥手但没理解状态迁移背后的逻辑。有一次笔试里看到这样一道题TCP连接中主动关闭方为什么需要TIME_WAIT状态等待时间是多少为什么是这个值很多人能答出等2MSL为了保证最后一个ACK能到达对方但再往下问为什么就能保证到达万一ACK丢了怎么办不少人就卡壳了。理解TIME_WAIT正确的姿势应该是什么我当时的理解是这样主动关闭方发出FIN后进入FIN_WAIT系列状态收到对端FIN后进入TIME_WAIT状态然后等待2MSLLinux里默认60秒通常认为是2个报文最大生存时间所以这两个概念在题里经常混出。这个状态要解决两件事确保对端能收到我的最后一个ACK如果没收到对端会重发FIN此时我还能响应。让网络中残留的旧报文自然消失避免影响同一个四元组上的新连接。仅仅这一道题就可以延伸出运维中的实际问题连接数过多的服务器怎么调整TIME_WAIT参数哪些场景可以设置tcp_tw_reuse这就会涉及内核参数调优是游戏服务器经常面临的问题。我建议准备这种题时最好能把TCP状态迁移图亲手画一遍从CLOSED一路到CLOSED每个状态的触发条件、携带的标志位、双方所处状态都梳理清楚。笔试时如果出了状态相关的题画图是加分项因为这道题考的不只是记忆而是你对连接生命周期的整体认知。2.2 Linux性能排查从一条命令延伸出的完整思维链CPU飙高、load上涨如何定位这类题几乎每个运维开发候选人都会碰到区别只在于深度。基础答案是top看一下哪个进程top -Hp看一下哪个线程再配合perf或gstack做栈分析。这种答案正确但不出彩。更优的思路是什么我会分场景展开如果是用户态CPU高大多是业务代码死循环或频繁GC需要抓线程栈、看火焰图。如果是内核态CPU高要考虑是不是系统调用频繁、网络中断、磁盘IO等待等问题。如果是IO密集型导致load高CPU看起来不高但大量任务处于D状态不可中断睡眠要用iostat看磁盘的util结合pidstat的IO统计来定位。笔试阶段不需要你写得像论文一样完整但至少要让阅卷人感受到你不是只会在生产环境敲top的人而是真正理解性能分析逻辑的人。另外uptime里的load average怎么解读单核和多核的区别是什么这些基本概念也得能说清楚因为游戏公司的服务器机型配置多种多样4核、8核、16核都可能负载高不代表出问题需要结合核数一起看。2.3 HTTP状态码与CDN游戏周边生态的必备常识有人可能会觉得游戏公司天天跑TCP长连接HTTP熟了有什么用事实上游戏公司的运维开发大量场景是在做Web平台、API网关、下载更新服务、活动页面、日志上报接口这些都是HTTP打交道。HTTP的题在笔试里一般是送分题但有些细节值得注意。比如题目问301和302有什么区别这种不算难。难的是如果给游戏客户端配置下载更新服务客户端请求到了一个状态码502和503分别说明什么应该怎么处理这时候你需要知道502是网关从上游收到了无效响应通常说明后端服务崩了或挂了503是服务暂时不可用可能是过载或正在维护。但放到游戏场景里处理策略完全不同502通常要重启服务或排查后端503则要考虑限流和扩容。理解到这一层你的答案就不再是书上的定义而是有业务语境的判断。CDN相关内容也值得关注因为游戏包体、补丁更新、静态资源分发都依赖CDN。笔试里可能会问命中率、回源、刷新的概念或者给你一个部分玩家下载补丁速度极慢的场景题让你排查是CDN节点问题、源站问题、还是客户端调度问题。这种题没有标准答案但需要你具备CDN的基本知识框架。3. 脚本与代码题怎么写出有运维味的代码编程题在运维开发笔试中的比重通常在20%到35%之间具体看各家公司风格。搜狐畅游这类游戏公司比较务实不会上来就甩一道LeetCode Hard而是更多考察你在实际运维工作中用得到的编码能力。比如写一个日志分析脚本、按条件筛选文件、模拟一个监控告警逻辑等。3.1 语言选型Python为主、Shell为辅的底层逻辑笔试编程题通常可以用多种语言提交但不同语言在阅卷人眼里的印象分不一样。运维开发岗首选Python理由很实在在运维领域Python的生态最完整写监控脚本、写Web后端、写数据采集、做自动化运维都有成熟库。而且Python语法简单笔试时写起来速度快不容易出编译错误。Shell不是不能用但只在处理纯文本、文件操作类题目时更自然。一旦涉及复杂数据结构、网络请求、多线程Shell代码会变得很难维护阅卷人看了也头疼。比较好的策略是优先Python如果题目明确是文件I/O和awk/grep能解决的可以用Shell但是代码风格上要留意别写出长到无从读起的管道。举个例子让我印象很深的是一道日志分析题给你一个几十万行的访问日志需要统计出每个接口的平均响应时间、最大响应时间、每分钟请求量并输出到新文件。Python解法思路很清晰import re from collections import defaultdict time_pattern re.compile(r\[(\d{2}:\d{2})\]) api_pattern re.compile(rGET /api/(\S) ) request_count defaultdict(int) total_time defaultdict(int) max_time defaultdict(int) with open(access.log, r) as f: for line in f: minute time_pattern.search(line).group(1) api api_pattern.search(line).group(1) # 假设日志中有响应时间字段提取出来 cost int(line.split()[-1]) request_count[api] 1 total_time[api] cost if cost max_time[api]: max_time[api] cost with open(summary.txt, w) as f: for api in sorted(request_count.keys()): avg total_time[api] / request_count[api] f.write(f{api} count{request_count[api]} avg{avg:.2f} max{max_time[api]}\n)这道题的关键不是语法多高级而是用defaultdict避免了繁琐的判断用正则精准匹配字段用排序保证输出有序。笔试阅卷人看到这种代码第一印象就是这个人日常真的用Python做数据处理不是临时背的。3.2 日志统计类题目的优化点与边界情况日志分析题看着简单但里面有几个很容易被忽略的坑。第一个是正则表达式的效率问题。如果日志行特别长格式复杂一个写得不严谨的正则可能导致性能严重退化。第二个是内存问题。如果数据量真的很大把所有数据都放内存里就会OOM这时候要用流式处理逐行读、逐行统计像上面例子那样只保留聚合结果不保留原始行。第三个是脏数据问题。日志里经常出现缺失字段、超长字段、编码异常等情况代码里要考虑跳过或容错。笔试中不需要你把所有坑都预先踩一遍但你在代码注释里如果能写出假设日期格式固定如果某行解析失败则跳过这类说明会比傻乎乎地直接把代码写出来显得更专业。因为真实日志从来都不是规规矩矩的能考虑到异常情况的候选人在面试官那里很加分。3.3 幂等性运维脚本和普通业务代码的分水岭这是一个容易被忽视但非常非常重要的考点。写普通业务代码时我们关注的是功能正确性写运维脚本时我们还要关注一个额外的属性幂等性。一个脚本重跑多次结果应该是一致的不会因为跑了两遍而导致数据错乱或重复执行。笔试可能会直接出一道写一个MySQL自动备份脚本或者写一个软件安装脚本。如果你只是简单地把命令拼在一起比如apt-get install -y nginx这道题虽然简单但如果在更复杂的场景里——比如环境初始化脚本可能在多个节点上重复执行这种写法就存在隐患。加一个判断如果已安装则跳过就体现了幂等性意识if ! command -v nginx /dev/null 21; then sudo apt-get update sudo apt-get install -y nginx fi类似的思维可以被扩展到很多场景。备份文件如果同一天跑两次是生成两个备份还是覆盖告警脚本如果连续多次触发相同告警是重复发消息还是合并代码题里用这种思路来组织逻辑基本上可以让阅卷人确认你是懂运维的。4. 数据库与中间件笔试中占比不高却最容易拉开差距数据库在运维开发笔试中通常占15%到20%的分值题型以MySQL为主穿插Redis、消息队列的概念题。很多候选人把注意力放在语言和网络上数据库复习不充分结果在这些基础题上丢了不该丢的分。4.1 MySQL索引与慢查询不只是会背explainMySQL的题基本围绕索引和SQL优化展开。索引这块重点掌握B树索引结构、聚簇索引与二级索引的区别、最左前缀原则。能解释清楚为什么索引能加快查询但会增加写入开销这种问题就已经比大多数人强了。慢查询优化是运维场景的高频考题。题目通常会给出一个慢SQL让你分析原因并给出优化方案。比较典型的写法是先用EXPLAIN看执行计划查看是否走了索引、扫描行数有多大。如果没走索引判断是因为没建索引还是因为函数操作、隐式转换导致索引失效。如果走了索引但依然慢可能是数据量大导致回表太多可以考虑覆盖索引。如果单条SQL已经优化到极致了还慢就要从业务层考虑引入缓存或做读写分离。慢查询优化题更进一步的加分回答是怎么定位慢SQL怎么利用慢查询日志和性能分析工具这背后就是数据库性能调优的完整主动监控思路而不仅仅是出现问题再处理。4.2 Redis在游戏场景中的应用与注意事项游戏公司几乎离不开Redis。排行榜、缓存、分布式锁、在线状态、玩家会话都是Redis的典型应用场景。笔试中可能会考Redis为什么这么快Redis的持久化机制有什么区别缓存穿透、击穿、雪崩是什么这类基础题也可能出设计题比如如何用Redis实现一个限流器。限流器是运维开发常用的能力尤其是游戏平台上各种接口需要防刷和限流。简单但实用的方案有滑动窗口和令牌桶基于Redis的INCR和EXPIRE可以实现滑动窗口限流的雏形。能用Python伪代码写出这个逻辑在笔试中会非常亮眼。另外Redis的持久化RDB和AOF的区别也要说清RDB是快照恢复快但可能丢数据AOF是追加日志数据更安全但文件大、恢复慢。实际运维里通常两种策略结合用。4.3 消息队列与容器化技术的基础认知虽然题目未必直接考Kafka或者K8s的深层次原理但作为一个面向2020年以后的运维开发岗对分布式基础组件有认知是底线。消息队列方面可能会问消息队列的作用你可以从解耦、异步、削峰三个角度展开。以及消息丢失怎么处理这种场景题也需要有所准备。容器化方向重点掌握镜像与容器的区别、Docker常用命令、Dockerfile的基本编写以及Kubernetes控制平面的几个核心组件API Server、Scheduler、Controller Manager、etcd和调度工作负载的基本概念。这些知识板块覆盖面广但笔试的考察深度通常不会太深。你不需要成为专家但至少应该有这样的意识运维开发不是只跟Linux服务器打交道而是围绕一套分布式基础设施在做事。5. 场景题与开放题真正的分水岭前面说的都是相对确定的知识点只要认真准备分数差距不会太大。但场景题和开放题不一样它们没有标准答案考的是你面对一个实际问题时能不能拿出清晰、有逻辑、有层次的解决方案。这部分是让有实战经验的人跟纯粹刷题的人拉开差距的地方。5.1 故障排查类场景题从现象到根因的完整推导经典的题型是线上游戏服务器报警玩家大量掉线你怎么排查表面看很简单但候选人给出的答案差异非常大。初级回答重启服务器。这相当于没回答。中级回答先看负载和网络连接数再分析日志。有这个意识说明有一定经验。高级回答我先分清楚是单台机器故障还是大范围故障。单台则看系统资源、进程状态、网络连接大范围则看是不是机柜故障、机房网络问题、或者发布变更引起。如果是发布后立刻出现的问题先回滚版本如果没有任何变更再排查硬件、网络、以及外部依赖。与此同时保持监控数据的记录为后续复盘提供依据。这个回答好在哪里好在有优先级思维和排除法。故障排查不是上来就翻日志而是先用最快的方式缩小范围。实际操作中我会先看一眼监控大盘上的数据比如CPU、内存、网络流量、错误码、玩家在线数趋势图然后针对性地深入。笔试的答题完全可以参照这种思路。5.2 容量规划类场景题给一台配置就行吗另一种高频场景题是假设游戏新版本上线预计在线人数会翻倍你如何做容量评估和扩容方案。这类题让很多候选人措手不及因为学校里不会教。我的回答框架是这样先评估当前单机瓶颈。是CPU内存带宽数据库连接数通过已有监控数据确定。根据瓶颈给一台业务服务器、一台数据库服务器分别做性能画像。用简单的线性估算当前单机支持N人在线翻倍就需要至少两倍容量但需要考虑峰值因子、冗余度。扩容方案要考虑服务是无状态的可以随意加机器还是有状态的需要做数据迁移或分片。这种思路下还需要提到监控先行和压测验证的概念。容量规划不是拍脑袋做出来的需要有数据支撑。笔试中用基于现状、分步验证的话术来组织答案会显得你有全局观。5.3 监控告警设计题的答题框架给你一个游戏服务你需要监控哪些指标这个题目相当开放也很能反映一个人的运维理解。我的答题框架是分层展开基础设施层CPU、内存、磁盘、网络、IO。中间件层Redis命中率、慢查询、连接数MySQL连接数、慢查询、主从延迟消息队列积压量。应用层QPS、响应时间、错误率、在线人数、关键接口耗时。业务层登录成功率、充值成功率、玩家操作延迟、异常会话数。告警策略哪些指标需要告警、阈值怎么设、告警级别怎么分、报警渠道怎么选、值班处理流程是什么。这类题是最容易展示做过事的因为只有真正建设过监控体系的人才能分层次地列出这些点。如果你只是背概念很容易只停留在CPU、内存两个维度上就显得单薄了。6. 笔试实战策略与避坑经验最后聊聊笔试当天怎么把这些准备转化成实际得分。很多考生实力不差但因为策略不对导致该拿的分没拿全。按照笔试现场的实际情况我总结了一些实操经验。6.1 时间分配与做题顺序笔试总时长一般是90分钟或120分钟。我的建议是拿到试卷先花2到3分钟把全部题目扫一遍给不同题型分配大致时间。选择题/判断题如果会马上做如果犹豫超过1分钟先跳过。因为这类题分值低纠结半天不如留时间给大题。简答题/场景题优先做你最有把握的。这类题是按点给分的写了多少都很关键。编程题留足30分钟以上。先写核心逻辑如果时间不够或部分测试用例过不了也要把代码框架提交上去有一半的解法爬分比空着强得多。我见过一个最可惜的案例是某位同学在Python题上花了大量时间调试正则表达式导致最后的场景设计题只写了不会两个字直接丢掉了至少10分。这在运维开发笔试里是非常不划算的因为场景设计题只要写出思路哪怕不完善也有不少分。6.2 笔试中常见的失分点按经验来看失分点集中在下面几类概念知道但说不清原理。比如知道TCP三次握手但不知道SYN Flood的原理。场景题只给结论不给过程。比如优化慢SQL只写加索引没有分析为什么加索引有效。编程题边界情况处理不到位。比如日志统计题没考虑空行、重复统计、内容编码问题。代码风格随意。变量命名随意、缩进不对、没有注释这在阅卷人眼里会留下工程习惯不好的印象。答题没有层次感。简答题洋洋洒洒写了一大段但核心关键词淹没在长篇大论里阅卷人根本来不及找。针对这些失分点我在考试时基本会刻意进行调整。概念题尽量用小标题式回答例如原理...造成影响...解决方案...。编程题即使不要求注释我也会写一两行说明这个模块在干什么。这些习惯在考试和工作中都是通用的。6.3 从笔试看后续面试和职业发展准备笔试不只是笔试它也是后续面试的风向标。一般来说笔试里答得好的方向面试时会在那个方向继续深挖笔试里暴露的薄弱点面试官也可能会围绕它来试探。所以笔试结束后建议随手记录一下自己哪些题做得吃力、哪些知识点卡壳了接下来一周到两周内集中补齐。这比盲目刷面试题更有效。以我的经验来看运维开发这个岗位的基础能力比技术栈的最新热点更值钱。你可以在简历上写熟悉Kubernetes但如果你连TCP的状态机、Linux的负载含义、MySQL的索引原理都说不透面试官是不会信的。反过来如果你能把这些基础讲得滴水不漏再结合一定的开发能力聊任何新技术对方都会觉得你学得会。回到搜狐畅游这次笔试本身我看到的是一个游戏公司对运维开发岗的真实需求既要你能动手解决问题又要你能写代码把解决方案沉淀成工具。一个运维开发工程师的核心竞争力不是会用多少工具而是能不能把运维经验转化为自动化、平台化的能力。笔试只是证明这一点的第一步但也是最公平的一步——它让有准备的人脱颖而出也让裸考的人无处遁形。最后分享一个我个人的小习惯笔试前一周我会把Linux常用命令的所有核心参数过一遍把TCP状态迁移图重画一遍把MySQL的explain结果里每个字段含义再过一遍。这三件事看起来基础但每次都能在笔试时救我的命。考试的时候越基础的东西越容易让人轻敌而它恰恰是拉开差距的地方。
返回列表