腾娱互动-游戏运维工程师-一面(面经分享)

秋意零 2024-7-9 402 7/9

一面

2024年6月6日 | 16:00 | 一面 | 56 min | base武汉

1)自我介绍

2)实习时管理的服务器规模,有负责服务的线上发布?服务是上的K8s还是运行在虚拟机上面的?

3)Shell 脚本:根据业务程序需要,对新申请的服务器需要做业务初始化。请按以下要求编写一个业务初始化脚本(编写脚本即可):

  1. 该脚本整体上需要支持可重复运行,运行后初始化的结果一样。
  2. 执行脚本时,自动打印本机监听的udp端口信息。
  3. 执行脚本时,自动打印本机与9.110.120.130机器的连接信息、及连接数量。
  4. 设置内核参数:net.core.somaxconn为4096并保证服务器重启后依然生效。
  5. 新建本地用户:game,且uid为10000,属于users组,家目录为/data/game。
  6. 配置程序运行目录/var/run/game,属主game:users,权限755,并保证服务器重启后依然存在。
  7. 设置/etc/resolv.conf中第一个nameserver为127.0.0.1(只能有一个127.0.0.1的nameserver),不能改变该文件其它配置项。

#!/bin/bash

# 2.
echo "2.打印本机监听的udp端口信息"
netstat -tulnp | grep udp

# 3.
echo "3.打印本机与9.110.120.130机器的连接信息、及连接数量"
# 目标IP地址
TARGET_IP="9.110.120.130"
# 获取ESTABLISHED状态的连接信息
connections=$(netstat -an | grep ESTABLISHED | grep $TARGET_IP)
# 打印连接信息
echo "连接信息:$connections"
# 统计ESTABLISHED状态的连接数量
connection_count=$(echo "$connections" | wc -l)
# 打印连接数量
echo "连接数量:$TARGET_IP$connection_count"

# 4.
echo "4.设置内核参数:net.core.somaxconn为4096"
# 临时修改
# sysctl -w net.core.somaxconn=4096

# 持久化设置,需写入/etc/sysctl.conf
if ! grep -q "net.core.somaxconn" /etc/sysctl.conf; then
 echo "net.core.somaxconn = 4096" | sudo tee -a /etc/sysctl.conf
fi
sysctl -p

# 5.
echo "5.新建本地用户:game,且uid为10000,属于users组,家目录为/data/game"
if [[ ! -d /data/game ]];then
mkdir -p /data/game
fi

if ! id game &>/dev/null; then
 sudo useradd -u 10000 -g users -d /data/game game
fi

# 6.
echo "6.配置程序运行目录/var/run/game,属主game:users,权限755"
if [[ ! -d /var/run/game ]];then
mkdir -p /var/run/game
fi
sudo chown game:users /var/run/game
sudo chmod 755 /var/run/game

# 7.
echo "7.设置/etc/resolv.conf中第一个nameserver为127.0.0.1"
sed -i '2s/^nameserver.*/nameserver 127.0.0.1/g' /etc/resolv.conf
cat /etc/resolv.conf

操作系统

4)打印当前的内核参数,通过哪个命令查看(GG)

sysctl -a

5)进程和线程的区别(根据课程,考察操纵系统、网络部分)

6)操作系统它分配的基本单位是进程还是线程

进程

7)操作系统它调度的基本单位是进程还是线程

线程

8)服务器上的应用程序,运行过程是如何申请内存的(GG)

  1. 进程创建: 当应用程序启动时,操作系统会为它创建一个新的进程。每个进程都有自己的虚拟地址空间,这个空间被分割成不同的区域,如代码段、数据段、堆和栈。
  2. 静态内存分配: 应用程序在编译和链接阶段,其代码和数据会被加载到进程的虚拟地址空间中。这部分内存是在程序启动时由操作系统自动分配的,称为静态内存分配。
  3. 栈内存分配: 当函数调用发生时,局部变量、函数参数和返回地址等会被自动推入栈中,这个过程也是操作系统自动管理的。当函数调用结束时,这些数据会自动从栈中弹出。
  4. 堆内存分配: 动态内存分配主要发生在堆上,这通常是由程序员显式控制的。在C/C++中,使用malloc()calloc()realloc()free()等函数来申请和释放内存;在C#或Java等高级语言中,内存管理通常由垃圾回收器自动处理。
  5. 动态内存申请: 当应用程序需要额外的内存时,它会调用操作系统提供的系统调用(如brkmmap)来申请更多内存。malloc等函数实际上就是构建在这些系统调用之上的高层封装。
  6. 虚拟内存管理: 操作系统使用虚拟内存技术,将物理内存与硬盘上的交换空间结合,为进程提供了比实际物理内存更大的地址空间。当内存不足时,操作系统会将暂时不用的内存页换出到硬盘,将需要的页换入内存,这个过程被称为分页或页面调度。
  7. 内存保护: 操作系统还提供了内存保护机制,防止一个进程访问不属于它的内存区域,这通过页表和段表的权限位来实现。
  8. 内存释放: 当不再需要内存时,应用程序应该释放内存,以免造成内存泄漏。在手动管理内存的语言中,这通常需要显式调用free()delete等函数;在有垃圾回收机制的语言中,内存会在适当的时候被自动回收。

9)什么是中断(GG)

中断(Interrupt)是计算机系统中的一个重要概念,指的是在处理器(CPU)执行当前程序的过程中,由于内部或外部的某个事件或请求,导致CPU暂停当前的任务,转而去执行一段专门处理该事件的程序(称为中断服务程序或中断处理程序,Interrupt Service Routine/Handler),待处理完成后,CPU再回到原来的任务继续执行。

网络

10)网络OSI七层模型,由低到高分别是

11)ICMP、UDP、HTTPS是在那一层

ICMP、HTTPS:应用层

UDP:传输层

12)TCP三次握手和四次挥手过程是(G一半)

详细介绍:点击跳转

13)TCP三次握手涉及到的几个状态是(GG)

详细介绍:点击跳转

腾娱互动-游戏运维工程师-一面(面经分享)

客户端:CLOSED、SYN-SENT、ESTABLISHED

服务段:CLOSED、LISTEN、SYN-RCVD、ESTABLISHED

四次挥手涉及状态

腾娱互动-游戏运维工程师-一面(面经分享)

14)建立连接的TCP链路,如果客户端主动断开连接,netstat如何查看链路连接状态(GG)

netstat -ant | grep "TIME_WAIT"

Linux命令

15)top 命令里面可以看到进程哪些状态(GG,答了两个个)

  1. R (Running 或 Runnable): 表示进程要么正在CPU上运行,要么准备就绪等待CPU时间片,即它位于CPU的就绪队列中。
  2. D (Disk Sleep 或 Uninterruptible Sleep): 进程处于不可中断的等待状态,通常是因为它正在与硬件设备交互(如磁盘I/O操作),此时进程不能响应信号,直到操作完成。
  3. S (Sleeping 或 Interruptible Sleep): 进程处于可中断的等待状态,等待某个事件(如信号、资源可用性等)发生而被唤醒。这个状态下的进程可以被信号中断并唤醒。
  4. Z (Zombie): 僵尸进程,表示进程已经结束,但是其父进程尚未回收其资源(如PID、状态信息等)。僵尸进程占用很少的系统资源,只是保留了一个记录在进程表中的条目。
  5. T (Stopped 或 Traced): 进程被暂停或被调试器跟踪,通常是因为接收到SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU等信号。
  6. t (tracing stop) : 跟踪停止状态。与T状态类似,但通常是因为被调试器(如gdb)所控制。
  7. X<> (Dead): 在某些top版本中,这些符号可能用来标记正在退出或已经退出但尚未清理的进程。

16)Linux 系统中/proc是做什么的呢(GG,答了存放硬件信息,比如 cpu、memory )

在Linux系统中,/proc是一个特殊的文件系统,称为proc文件系统(Process File System),它是一个伪文件系统或虚拟文件系统。这意味着它并不占用硬盘空间,而是存在于系统内存中,用于提供访问内核运行时状态和内核及进程相关信息的接口。

/proc文件系统的主要功能包括但不限于:

  1. 查看系统信息:用户和程序可以通过阅读/proc下的文件来获取关于系统硬件(如CPU、内存、磁盘)和软件(如系统版本、运行的进程)的详细信息。
  2. 监控进程状态:每个运行的进程在/proc目录下都有一个以其进程ID(PID)命名的目录(如/proc/1234),通过查看这些目录下的文件,可以获取该进程的详细信息,包括命令行参数、环境变量、状态、内存使用情况等。
  3. 调节内核行为/proc文件系统中的某些文件是可写的,允许用户或系统管理员动态地调整内核参数,比如调整网络参数、内存管理策略、CPU调度策略等,而无需重启系统。
  4. 故障诊断:当系统出现故障或需要性能调优时,/proc文件系统中的信息是非常重要的诊断工具,可以帮助识别问题所在。
  5. 提供内核接口/proc下的某些目录如/proc/sys/proc/net/proc/scsi/proc/bus等,分别提供了对系统、网络、SCSI设备和总线信息的访问接口。

总之,/proc文件系统为用户空间和内核空间提供了一个桥梁,使得用户可以在不直接操作内核数据结构的情况下,安全、方便地获取系统状态信息和调整系统配置。

17)top 命令可以看到一个平均负载队列的指标,这个平均负载队列指的是什么(GG,随便答了一点)

点击跳转:详细介绍

18)top 命令里这个平均负载队列,它跟CPU使用率有啥区别(GG)

点击跳转:详细介绍

K8s相关

19)有用过 Helm 吗?(GG)

20)Deployment 和 StatefulSet 有什么区别

21)StatefulSet 有3个副本,Pod 编号是0、1、2,重启了编号2那边它的 IP 会变吗?

22)StatefulSet 的镜像升级过程是?跟 Deployment 有什么区别?

23)K8s 暴露服务有几种方式

24)了解 CRD 嘛?

25)Dockerfile 里面设置环境变量使用关键字是?

26)CMD 和 ENTRYPOINT 的区别

27)创建 Deployment 后发现 Pod 在不停的重启,可能是什么原因导致的

28)接上一个问题:由于Pod不断重启导致容器里面的数据丢失了,有哪些方式保障数据不被丢失呢

Python

29)Python 里装饰器了解吗?(GG,有一点印象)

30)Python 里 is 和 == 的区别是?(GG,说实话真没学过)

  • == 操作符比较的是两个对象的是否相等。也就是说,如果两个对象的值相同,== 就会返回 True,即使这两个对象在内存中是不同的实例。
  • is 操作符比较的是两个对象的身份是否相同,即它们是否指向内存中的同一个对象。如果两个变量引用的是完全相同的对象(即它们的内存地址相同),is 就会返回 True

开放题

31)实习过程中有排查过让你印象深刻的 Linux 系统问题嘛

32)看你简历这边有处理过生产环境事故,说下具体过程

33)你这边的K8s集群YAML备份脚本的实现原理和功能是

34)假如让你去承接一个新的业务运维工作,你需要熟悉哪些具体事项,如果有多个事项排一个优先级

由于上面答得方向不对,面试官换了一种说法:运维交接工作,你要把他交接给另外一个人,你会交接他哪些部分?

反问:

1)工作内容是?

主要负责支持腾讯游戏这块业务的工作,包括

  • 根据业务的版本发布计划,去做现网业务的版本变更
  • 新业务涉及到周边资源的申请,比如服务器、中间件、DB
  • 服务监控告警的配置,及时处理告警

运维支持,资产管理、发布变更、健康配置、告警处理

2)业务部署在什么环境

业务:服务器

业务:K8s、CICD

3)会和哪些人协助工作

会和腾讯共同维护游戏业务

开发、运营、搭档的人

4)属于内包?

是的

5)几轮面试

不确定,可能3轮

这篇文章有用吗?

点击星号为它评分!

平均评分 0 / 5. 投票数: 0

到目前为止还没有投票!成为第一位评论此文章。

很抱歉,这篇文章对您没有用!

让我们改善这篇文章!

告诉我们我们如何改善这篇文章?

- THE END -

秋意零

8月04日17:36

最后修改:2024年8月4日
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论