SRE网易一面面经
1:你知道http与https的区别在哪里吗?
答:https在http协议的基础上加了一层安全层,以前是SSL协议,现在是TLS(transport layer secure)协议,简单来说,过去http传输的是明文,现在https协议传输的是密文。
2:https中存在非对称加密和对称加密,你能简单描述一下这个过程吗?
答:过去老版本的TLS协议使用的是RSA协商算法(非对称加密),主要作用是将客户端生成的预主密钥使用serverhello消息发送过来的服务端公钥加密成密文放在client_excharge消息中发给服务端(这个过程发生在serverhello消息后面),服务端收到后用服务端私钥进解密,然后得到预主密钥,双方再通过密钥派生函数得到后续通信对称加密的密钥。也就是说这个非对称加密是为了生成后面对称加密的密钥,保证后续加密通信的安全性,那么为什么不用非对称加密通信呢,因为非对称加密和解密过程复杂耗时长,所以不适合作为加密通信的方法。
新版本一般使用的是ECDH(椭圆曲线)来作为协商算法,他的好处在于不需要加密过程就能使客户端和服务端都能得到共同的加密密钥,排除中间人攻击的风险。但是他也存在非对称加密,就是在服务端发完certificate消息后发出的certificate_verify消息包含了用服务端私钥加密的从clienthello到serverhello消息的哈希文的密文,随后客户端用公钥进行解密,在进行比对用来确定服务端身份的正确性。这里的非堆成加密也是用来为了确保通信的安全性。
3:假如说我想检查某个目录下所有文件的占用磁盘大小该用什么命令?
du -sh /path/to/directory
du全称为disk usage,用来查看某个文件或者目录占用的磁盘大小
-s选项意味summary,作用是单纯显示占用空间大小
-h选项意味human,用kb这种格式显示大小
4:假如我想知道某个进程的重定向情况应该有哪些方法?
- 第一种
lsof -p [pid]
lsof会列出这个进程使用了哪些文件,以及这些重定向情况。
-第二种
每个进程在虚拟文件系统下都有相关参数的记录比如说文件描述符fd(file descripter)
ls -l /proc/1234/fd
列出的信息大概率是:
lrwx------ 1 user user 64 Jun 10 10:00 0 -> /dev/pts/1 # 标准输入(stdin) lrwx------ 1 user user 64 Jun 10 10:00 1 -> /var/log/app.log # 标准输出(stdout)重定向到文件 lrwx------ 1 user user 64 Jun 10 10:00 2 -> /dev/null # 标准错误(stderr)重定向到 /dev/null
5:你知道在不使用docker的情况下如何使用命名空间去隔离cpu还有内存吗?
答:我个人觉得这个面试官应该是问错问题了,因为命名空间是用来隔离资源的,包括文件系统,网络,用户空间等等,真正用来隔离和控制cpu还有内存的是控制组,
cpu用来控制cpu使用量的是CFS(cpu fair scheduler)cpu公平调度器,具有两个参数
cpu.cfs_period_us
:调度周期,单位微秒,默认 100000 (100ms)。cpu.cfs_quota_us
:在这个周期内允许进程组运行的时间,单位微秒。
- 设定周期为 100ms (
100000us
),配额为 50000us,意味着该 cgroup 能使用 50% 的 CPU 时间。
cpu如何限制使用量
- CFS 调度器对每个 cgroup 维护一个虚拟运行时间(virtual runtime)。
- 在每个调度周期,内核维护 cgroup 的累计运行时间,不允许超过
cpu.cfs_quota_us
。 - 当某个 cgroup 用够了它在该周期内允许使用的 CPU 时间,调度器暂停其调度,直到下一个调度周期重新开始。
- 这样就实现对 CPU 使用百分比的限制。
- 可配置多个 CPU 核心,结合
cpuset
cgroup 实现核心绑定和隔离。
内存用来控制内存使用量的是内存控制器 memory controller,是cgroups的一个子系统,专门用来追踪和限制进程内存使用量。关键参数如下:
memory.limit_in_bytes
:设置最大允许使用的物理内存字节数。memory.soft_limit_in_bytes
:软限制,在内存紧张时可作为优先释放的参考。memory.memsw.limit_in_bytes
:物理内存 + 交换区的限制(开启了 swap 的场景)。memory.usage_in_bytes
:当前内存使用量。memory.failcnt
:超过限制次数计数。- 还有用于限制内核页面缓存、内核slab缓存的参数。
内核如何实现限制
- 内核会在进程申请内存(如调用
malloc
、brk
、mmap
等)时,检查该进程所属 cgroup 当前的内存用量和限制。 - 如果超过了
memory.limit_in_bytes
,分配失败,通常会返回错误; - 当然,超限后系统会尝试激活OOM(Out Of Memory)杀手,优先终止该 cgroup 中内存占用最高的进程,避免系统整体崩溃。
- 内存限制统计不仅包括匿名内存,还可能包括页缓存(根据配置)。
- 这种限制精确到 cgroup 级别,不影响其他 cgroup。
一个实际的流程如下:
- 创建新的 memory cgroup
mkdir /sys/fs/cgroup/memory/mycontainer
- 设置内存限制为 300MB
echo $((300*1024*1024)) > /sys/fs/cgroup/memory/mycontainer/memory.limit_in_bytes
- 将容器内的进程加入这个内存 cgroup
假设容器主进程 PID 是 12345,执行:
echo 12345 > /sys/fs/cgroup/memory/mycontainer/tasks
6:你如何看待SRE工程师这个岗位?
答:所谓可靠性工程师就是现代化,自动化运维工程师吧。第一方面就是说不再用传统的脚本或者手动操作去管理机器,应用,而是使用自动化运维工具用代码去管理应用环境和硬件。第二方面就是说不是被动的等待服务出问题再去解决,而是主动设计SLI,SLO,SLA这些指标去衡量服务性能,加强管理。第三方面就是说需要去负责某个具体业务的稳定性,需要参与到技术方案评审,作为服务稳定性的最后一道关卡,包括变更管理的评审等等。
7:什么SLI,SLO,SLA
答:SLI是service level indicator,作为衡量某个服务性能的指标,SLO是service level object某个指标的目标值,SLA是service level agreement是一种对SLO的承诺吧。
举个举例帮助理解:
假设你运营一个视频点播平台:
- SLI:
- 视频启动成功率
- 视频播放卡顿率
- 响应时间(秒)
- SLO:
- 视频启动成功率 ≥ 99.95%
- 卡顿率 ≤ 0.5%
- 95% 请求响应时间 ≤ 2秒
- SLA:
- 对客户承诺如果视频启动成功率不足99.95%,则按月扣除一定费用或提供赔偿。
总结
术语 | 作用总结 | 谁负责/面向 |
---|---|---|
SLI | 量化服务表现的关键指标 | 运维团队和开发团队内部使用 |
SLO | 设定合理的目标范围,供团队持续改进衡量 | 技术团队、管理层制定,指导内部运营 |
SLA | 正式的客户或合作协议,基于SLO制定,有法律约束力 | 服务提供方与客户或合作方之间的合同文件 |
8:如果你发现当前系统平均负载值很高,但是cpu是空闲的,可能是什么原因,你打算怎么排查?
答:首先系统平均负载load_average指的是前1分钟,5分钟,15分钟的处于运行和等待运行和处于不可中断的进程的平均数目,如果说cpu空闲,那就说明处于运行和等待运行的进程数比较少,很有可能是处于不可中断的进程数比较少,处于不可中断的进程通常是处于I/O状态的进程,这种情况下我会大概率去排查当前进程有多少处于D(不可中断)状态,然后会通过iostat命令排查io情况。
9:如果你发现当前很多连接处于time_wait状态,占用了连接资源,是什么原因导致的,你会怎么处理?
答:
- 服务端或客户端频繁建立短连接(比如HTTP短连接、数据库连接等),连接很快关闭。
- 每关闭一个连接,主动关闭一方进入 TIME_WAIT 状态。
- 典型场景:Web服务器接受大量短时请求,连接创建和关闭速度快,TIME_WAIT 数量自然增加。
这种情况下我会开启http的长连接选项,一个连接可以多次处理请求,减少连接数目。