面试刷题网站:xiaolincoding.com
大家好,我是小林。
今天继续来填坑啦!之前跟大家盘 26 届校招薪资的时候,好多林友在评论区催更,说想看游戏厂的薪资情况,这不,直接安排上了!
今天咱们就来唠唠网易 26 届的校招薪资,我根据收集到的 base 薪资,大概分了三个档位:白菜、SP、SSP,表格里都给大家标清楚了,一目了然:
不得不说,网易不愧是游戏圈的老大哥,游戏开发方向的薪资是真给得狠!我整理的这些案例里,SSP 档的基本全是游戏开发岗,太顶了。
我特意去翻了下网易 25 年的财报,2025 年网易总净收入 1126 亿,其中 921 亿都是游戏和相关增值服务来的,占了全公司总营收的 82%!
说白了,游戏就是网易的顶梁柱、现金牛,那对游戏开发的核心人才,肯定舍得下重金挖,这薪资高也就一点不奇怪了。
对了,前段时间我训练营的老学员,还跟我聊了他入职网易一年的感受,说项目组氛围特别好,干的活儿也能实打实学到东西,组里还经常有技术分享,整体成长环境还是很在线的。
接下来咱们就来盘一盘网易游戏的一面面经,说真的,这份面经还挺有意思的 , 基本没问啥常规八股,全是揪着 Linux 命令往深了问。
其实也能理解,游戏服务器基本都是跑在 Linux 上的,日常干活不管是排查线上问题,还是项目上线、运维操作,全离不开 Linux 命令,所以人家一面就专门考这个,太实在了,完全是冲着干活能力来的。
我估摸着好多同学准备面试,都光顾着背 Java、MySQL 那些八股了,把 Linux 命令这块给疏忽了。这里跟大家说下,我图解网站里专门整理了 Linux 命令的面试真题,不熟悉的兄弟,跟着文章内容敲一敲练一练,应付基础面试绝对没问题。
https://www.xiaolincoding.com/interview/
话不多说,咱们直接看面经,发车!
网易游戏一面面经
1. nginx反向代理和正向代理分别是什么?
正向代理
咱们先说说正向代理吧。你可以这样理解,正向代理就是帮客户端干活的。比如说,你在公司想访问某些外网,但是公司有防火墙限制,这时候你就需要通过一个代理服务器去访问。这个代理服务器就相当于你的"中间人",你把请求发给它,它再帮你去外面的服务器拿数据回来。
关键点在于,外面的服务器只知道代理服务器的IP地址,根本不知道是你在访问它,你的真实身份被隐藏了。所以说正向代理是站在客户端这边的,客户端知道自己要访问谁,只是借助代理去完成这个事情而已。
反向代理
再说说反向代理。反向代理正好相反,它是帮服务器干活的。你访问一个网站的时候,其实你看到的可能只是nginx这个代理服务器,它后面可能有好几台真实的服务器。
你的请求先到nginx,然后nginx再决定把请求转发给哪台后端服务器处理。这里的关键是,作为客户端的你,根本不知道后面有几台服务器,也不知道它们的IP地址是什么,你只认识nginx这个代理。所以反向代理是站在服务器这边的,用来隐藏服务器的真实信息,同时还能做负载均衡、缓存这些事情。
咱们用个生活中的例子来理解会更直观一些。
- 正向代理就像你要出国玩,但是签证比较麻烦,于是找了个旅行社代办,旅行社就是你的代理,帮你去办这个事。而反向代理呢,就像你去一个大公司谈业务,前台接待你,然后前台再帮你找合适的部门经理来对接,你根本不知道后面有多少个部门、多少个经理,你只跟前台打交道,前台就是那个反向代理。
所以说, 正向代理是客户端的代理,隐藏的是客户端的信息;反向代理是服务器端的代理,隐藏的是服务器的信息。nginx在实际应用中更多是作为反向代理来用的,做负载均衡、提升性能这些场景特别常见。
2. top怎么查看过去一段时间的平均负载和当前负载?
top命令在第一行就直接显示了系统的平均负载,分别是过去1分钟、5分钟、15分钟的load average值。这三个值能帮我们判断系统负载的趋势,如果1分钟的值比15分钟的值大很多,说明负载在上升;反过来就是负载在下降。至于当前的实时负载,可以看CPU使用率那一行,尤其是idle这个值,它越小说明当前系统越忙。
比如输入 top 命令之后,就会显示如下的内容:
top - 14:23:15 up 10 days, 3:45, 2 users, load average: 0.52, 0.58, 0.63
Tasks: 178 total, 1 running, 177 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.3 us, 1.2 sy, 0.0 ni, 96.2 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 7821.5 total, 423.2 free, 4521.3 used, 2877.0 buff/cache
MiB Swap: 2048.0 total, 1876.5 free, 171.5 used. 2890.1 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 root 20 0162940 5824 4012 S 3.2 0.1 0:12.34 nginx
5678 mysql 20 0184725642310828544 S 2.1 5.412:45.67 mysqld
重点看第一行,load average: 0.52, 0.58, 0.63 这三个数字非常关键。这就是系统的负载均值,但注意啊,这三个数字代表的是:
0.52 - 过去1分钟的平均负载
0.58 - 过去5分钟的平均负载
0.63 - 过去15分钟的平均负载
所以你看,top给你的已经是"过去一段时间"的平均负载了,只不过这个"一段时间"是固定的1分钟、5分钟、15分钟这三个时间窗口。这些数据是系统内核一直在统计的,不是top自己算出来的。
至于当前负载,你可以看第三行的CPU使用率部分:
%Cpu(s): 2.3 us, 1.2 sy, 0.0 ni, 96.2 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st
这里各项的意思是:
us (user): 2.3% - 用户进程占用CPU时间
sy (system): 1.2% - 系统内核占用CPU时间
id (idle): 96.2% - CPU空闲时间,这个数字越大说明越闲
wa (wait): 0.3% - 等待IO的时间
所以当前CPU使用率就是 100% - 96.2% = 3.8%,这就是此时此刻的负载情况。
那如果你真的想查看更长时间范围的历史负载数据怎么办呢?top就无能为力了,你得用其他命令:
$ uptime
输出类似这样:
14:23:15 up 10 days, 3:45, 2 users, load average: 0.52, 0.58, 0.63
你看,uptime显示的负载数据跟top第一行其实是一样的,也是1分钟、5分钟、15分钟的平均值。
3. 给一个url怎么配置特定端口号?
最简单直接的方式,就是在URL里明确写出端口号。格式是这样的:
协议://域名或IP:端口号/路径
具体例子:
http://example.com:8080/api/users
https://192.168.1.100:9090/admin
http://localhost:3000/index.html
你看,就是在域名或IP后面加个冒号,然后跟上端口号。如果你不写端口号的话,浏览器会用默认端口,http默认是80,https默认是443。所以你访问 http://example.com 其实就是访问 http://example.com:80,只是省略了而已。
4. linux统计文件中某个url的次数?
方法一:grep + wc 组合(最简单直接)
假设你有个access.log日志文件,想统计某个URL出现了多少次:
$ grep -o "/api/user/login" access.log | wc -l
输出:156
这个命令的意思是,grep的-o参数只输出匹配的部分(而不是整行),然后用wc -l统计行数。每匹配到一次就输出一行,所以统计行数就是出现次数。
方法二:awk统计(最常用的专业方法)
这个是最经典的组合,sort + uniq -c + sort,我给你看个完整的例子:
$ cat access.log
192.168.1.100 - - [18/Sep/2020:10:30:25] "GET /api/user/login HTTP/1.1" 200
192.168.1.101 - - [18/Sep/2020:10:30:26] "GET /api/user/info HTTP/1.1" 200
192.168.1.100 - - [18/Sep/2020:10:30:27] "GET /api/user/login HTTP/1.1" 200
192.168.1.102 - - [18/Sep/2020:10:30:28] "GET /api/order/list HTTP/1.1" 200
192.168.1.100 - - [18/Sep/2020:10:30:29] "GET /api/user/login HTTP/1.1" 200
现在我想统计每个URL出现的次数:
$ cat access.log | awk '{print $7}' | sort | uniq -c | sort -nr
输出:
3 /api/user/login
1 /api/user/info
1 /api/order/list
让我解释一下这个命令链1:
awk '{print $7}' - 提取第7列,也就是URL那部分
sort - 先排序,因为uniq只能对相邻的行去重
uniq -c - 去重并统计每行出现的次数
sort -nr - 按数字大小倒序排列,-n是按数字排序,-r是反转1
如果你只想看某个特定URL的次数,可以加个grep:
$ cat access.log | awk '{print $7}' | grep "/api/user/login" | wc -l
输出:
3
方式三: 统计访问最多的前10个URL
这个在分析热点请求的时候特别有用:
$ awk '{print $7}' access.log | sort | uniq -c | sort -nr | head -10
假设有更多数据,输出可能是:
523 /api/user/login
412 /api/order/list
305 /api/user/info
198 /api/product/detail
156 /api/cart/add
89 /api/search
67 /api/category/list
45 /api/comment/list
32 /api/user/logout
28 /api/help
这样你就能一眼看出哪些接口是系统的热点请求了。
5. cd怎么返回上级目录?
最常用的就是用两个点:
$ pwd
/home/user/project/src/main
$ cd ..
$ pwd
/home/user/project/src
你看,cd .. 就是返回上一级目录。两个点 .. 在Linux里代表父目录(上级目录),一个点 . 代表当前目录。
6. 四个进程在四核CPU上运行,CPU利用率多少?
如果这4个进程都是CPU密集型的(比如科学计算、视频编码、加密解密),并且一直在进行计算,那么:
- 4个进程 × 每个占用100% CPU = 每个核心100%利用率总体CPU利用率 = 100%
这种情况下,4个进程刚好占满4个核心,CPU利用率接近**100%**。
比如这样的场景:
$ top
PID USER PR NI VIRT RES SHR S %CPU %MEM
1234 user 20 0 100m 10m 5m R 100.0 0.5 process1
1235 user 20 0 100m 10m 5m R 100.0 0.5 process2
1236 user 20 0 100m 10m 5m R 100.0 0.5 process3
1237 user 20 0 100m 10m 5m R 100.0 0.5 process4
%Cpu(s): 100.0 us, 0.0 sy, 0.0 ni, 0.0 id
但现实中,大部分进程都不是纯CPU密集型的,它们会有:
磁盘IO等待(读写文件)
网络IO等待(网络请求)
sleep/wait状态(等待某些条件)
阻塞操作(等待用户输入、数据库查询等)
这种情况下,即使有4个进程在4核CPU上运行,CPU利用率可能只有10%-50%甚至更低。
举个例子,如果是Web服务器进程:
$ top
PID USER PR NI VIRT RES SHR S %CPU %MEM
1234 user 20 0 500m 100m 20m S 15.3 2.5 nginx
1235 user 20 0 500m 100m 20m S 12.7 2.5 nginx
1236 user 20 0 500m 100m 20m S 8.9 2.5 nginx
1237 user 20 0 500m 100m 20m S 11.2 2.5 nginx
%Cpu(s): 12.0 us, 3.5 sy, 0.0 ni, 84.5 id
你看,4个进程加起来CPU占用才48.1%,总体CPU利用率只有15.5%左右,大部分时间CPU都在idle(空闲)状态。
mpstat 命令可以监控 cpu 的情况:
$ mpstat -P ALL 1
Linux 5.4.0 (server01) 01/15/2024
02:30:15 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
02:30:16 PM all 45.25 0.00 8.50 2.25 0.00 0.50 0.00 0.00 0.00 43.50
02:30:16 PM 0 50.00 0.00 10.00 3.00 0.00 1.00 0.00 0.00 0.00 36.00
02:30:16 PM 1 48.00 0.00 9.00 1.00 0.00 0.00 0.00 0.00 0.00 42.00
02:30:16 PM 2 42.00 0.00 7.00 2.00 0.00 1.00 0.00 0.00 0.00 48.00
02:30:16 PM 3 41.00 0.00 8.00 3.00 0.00 0.00 0.00 0.00 0.00 48.00
你看,即使4个核心都有进程在运行,总体CPU利用率也只有56.5%(100% - 43.5%idle),因为有iowait(IO等待时间)。
所以,不能简单地说CPU利用率是多少,这取决于进程的类型:
- 如果是4个CPU密集型进程(比如科学计算、视频编码),在4核CPU上运行,理论上每个进程占用一个核心,CPU利用率可以达到接近100%如果是IO密集型或混合型进程(比如Web服务、数据库应用),进程会频繁等待IO操作,CPU大部分时间处于空闲状态,利用率可能只有20%-60%实际生产环境中,即使进程数等于核心数,CPU利用率很少能达到100%,因为进程都会有IO等待、上下文切换、系统调用等开销可以通过top、htop、mpstat等工具实时监控每个核心的利用率和进程状态来判断
7. 有没有遇到进程在CPU负载超过100%的情况?
在Linux系统中,CPU使用率是按核心数计算的。如果一个进程是多线程的,它可以同时使用多个CPU核心,这时候你在top或htop里看到的CPU使用率就会超过100%。
比如我之前遇到过一个Java应用,在top里看到是这样的:
$ top
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 user 20 0 4.2g 2.1g 20m R 385.7 26.5 120:45.67 java
你看,这个Java进程的CPU使用率是385.7%,说明它同时在使用将近4个CPU核心。
再用htop看得更清楚:
$ htop
1[||||||||||||||||||||||||95.3%] 5[||||||||||||||||||||||||98.1%]
2[||||||||||||||||||||||||97.8%] 6[|||||| 25.6%]
3[||||||||||||||||||||||||96.4%] 7[|||| 18.3%]
4[||||||||||||||||||||||||94.7%] 8[||||| 21.2%]
PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command
1234 user 20 0 4.2G 2.1G 20M R 385.7 26.5 2:00.67 /usr/bin/java -jar app.jar
你可以看到CPU 1-4几乎都被这个进程占满了。
318