北京-快手 一面面经
1.自我介绍
面试官:“你先做一下自我介绍吧。”
我:“面试官您好,我叫XX ,是XX大学网络工程24届应届生,本次应聘的是贵公司的运维开发工程师,我现在是在XX公司当运维开发实习生,主要负责的内容是Shell脚本维护,数据库集群搭建,LVS的配置;大二的时候是在XX做Java开发实习生,工作内容是参与XXWeb平台的开发,和数据爬取处理的工作。现在呢我对运维方案也有了自己的一些理解,后续职业规划也是朝着SRE,和运维这方面发展,希望能够成为快手运维的一份子。”
面试官:“讲下你在实习中遇到的某个问题,解决办法,以及对自己的提升,在其中学到了什么?”
我:“我现在的主要实习工作是写Shell脚本,在上上周的时候有个需求是产品版本升级,需要写了一个seaweedFS ——分布式文件存储的安装脚本,并导入一些系统配置,我在之前是没有用过这个文件存储系统,然后按照网上的系统安装步骤,转成Shell 脚本进行安装,在我写好这个脚本之后自己测试是可以正常安装的,但是当我把这个脚本添加到原来的产品一键部署脚步后,发现这个脚本异常终止,遇到这个情况第一反应就是换一个虚拟机重新试一下,发现还是不行,依旧异常终止;确定不是电脑环境问题,这个时候就需要看启动日志了,我cd 到seaweedFS 的安装目录,然后用less命令查看日志,发现是ElasticSearch 报错,当前集群状态为“red”,seaweedFS 配置错误;询问了开发人员了解到,初始化安装的时候默认往seaweedFS 存储了一些文件,然后需要保存到ElasticSearch 方便检索,但是现在ES状态为Red不允许插入数据,所以报错;后面更改了脚本逻辑在安装seaweedFS之前先判断ES集群状态,等待集群健康值为yellow或为green时再进行,seaweedFS的安装。其中提升了排错的能力,然后也了解到学技术,做SRE不是埋头苦干,需要和同事多交流,才能够提示自己的效率”
面试官:“有了解ES状态为什么会是red吗?或者说什么情况下才是green,yellow?”
我:“有了解,只要是ES有一个主分片未分配完成就是red状态,主分片分配完成,但是副本分片没有分配完成就是yellow,可以把yellow当成是一个warning其实是不影响我们的正常使用的(毕竟我搭建ES的状态全是yellow 哈哈哈),副本分片和主分片均分配完毕,集群状态就是green”
2.计算机网络
面试官:“我问点计算机基础,TCP四次挥手过程讲一下”
我:“四次指的是,客户端A发出一次断开请求,服务端先返回一次我收到了你的断开请求,然后再返回一次我已经断开了,之后客户端向服务端发送一次,我知道你已经断开了,总共四次;具体的细节就是三次握手后Client端和Server端都进入ESTABLISHED状态,Client 发送SYN=1,和序列号seq=u 给服务端,自身进入FIN_WAIT_1 状态,服务器收到请求后发送ack=u+1,seq=v,ACK=1,Server端进入close_wait状态,Client端接收到后进入FIN_WAIT_2状态,之后Server端再次向Client端发送报文,FIN=1(表示关闭),seq=w,ack=u+1,进入LAST_ACK状态,Client收到后进入TIME_WAIT状态,像Server端发送ACK=1,seq=uu+1,ack=w+1等待2MLS后进入Closed转态,Server端收到后也进入Closed状态”
大概是下面这个样子
面试官:“TCP拥塞控制是怎么做的?”
我:“TCP进行拥塞控制有四个部分,慢开始,拥塞避免,快重传,快恢复;慢开始从小到大加倍增加拥塞窗口的数值,拥塞避免:每经过一个往返时间RTT就把发送发的拥塞窗口加1,而不是像慢开始阶段那样加倍增长;快重传:接收方快速重传丢失的报文;快恢复:与慢开始类似,慢开始在TCP连接建立时或者是网络拥塞后才使用,快恢复是在遇到3-ACK时触发,常常伴随着快重传”
3.操作系统
面试官:“操作系统内存寻址过程”
我:“忘了”
面试官:“操作系统中死锁的处理策略?”
我:“构成死锁有几个必要条件,资源独占,不可剥夺,保持申请,循环等待;死锁预防可以通过破坏这几个条件来实现,死锁避免银行家算法”
面试官:“Linxu 防火墙配置 禁用一个ip,禁用某个TCP 端口,聊天框打出来”
禁用一个端口
firewalled-cmd --zone=public --remove-port = 8080/tcp --permant
禁用一个ip
firewalled-cmd --permant --remove-rich-role="rule family="ipv4" source address = "xxx.xxx.xx.xx" port protocol="tcp" port="8080" accept"
面试官:“iptables 会吗?”
我:“不会,我都是用的firewalld-cmd”
4.Java
- Java 忘的有点多,大佬们帮忙补充吧
面试官:“Java String,StringBuilder,StringBuffer 的区别联系”
HashMap底层怎么实现的
HashMap 怎么解决哈希冲突
SpringBoot Bean的生命周期
面试官:“SpringBoot, IOC是什么,设计的好处?”
我:“IOC 控制反转,是一种软件开发的思想,将对象创建交给了IOC容器进行管理,然后我们通过依赖注入@ Autowired @ Resource 的方式来调用;好处是降低了程序的耦合性,让程序员更加专注于业务,比如操作数据库,xml到mapper再到service,再到Controller,每一层我们不太需要关注他的下层是怎么操作的,只管用就行,这也是我理解的Java面向接口编程;对于测试来说,也只需要依赖注入对应的层进行测试,同样是减少耦合”
面试官:“MySQL索引采用什么数据结构,说下自己的理解?”
我:“MySQL采用的是B+树的存储结构,查询数据其实都是和磁盘IO次数有关,越少的话查的也就相对越快,而B+树的特点就是树的高度其实不会很高,他的数据存储在最下面一层也就是叶子结点当中,查找从根节点开始,每一个子节点都有关键字和一些记录项,顺着树的分支进行查找,就能找到目标节点”
5.算法
算法题:数组第k大个数(自己写样例输入输出,尽量不要用库)
(一个 快排+分治 敲了20多分钟,提交19次,我tm真是个菜b)
c++ 版
#include<iostream> #include<vector> using namespace std; int quickSortGetK(vector<int> v, int left, int right, int k) { if (left >= right) return v[left]; int key = v[left]; int i = left; int j = right; while (i < j) { while (key <= v[j] && i < j) j--; while (key >= v[i] && i < j)i++; cout << i << " " << j << endl; swap(v[i], v[j]); } swap(v[i], v[left]); if (i == k) return v[i]; if (k < i) return quickSortGetK(v, left, i - 1, k); else return quickSortGetK(v, i + 1, right,k); } int main() { vector<int> v; for (int i = 0; i < 10; i++) { int data; cin >> data; v.push_back(data); } int k = 3; cout << "到这" << endl; cout<<quickSortGetK(v, 0, v.size() - 1, v.size()-k); } /* * 10 2 5 3 6 3 6 3 6 3 */
go 版
package main import "fmt" func sortArray(nums []int, k int) int { var quick func(nums []int, left, right int, k int) int quick = func(nums []int, left, right int, k int) int { // 递归终止条件 if left >= right { return nums[left] } // 左右指针及主元 i, j, pivot := left, right, nums[left] for i < j { // 寻找小于主元的右边元素 for i < j && nums[j] >= pivot { j-- } // 寻找大于主元的左边元素 for i < j && nums[i] <= pivot { i++ } // 交换i/j下标元素 nums[i], nums[j] = nums[j], nums[i] } // 交换元素 nums[i], nums[left] = nums[left], nums[i] if k < i { return quick(nums, left, i-1, k) } if k > i { return quick(nums, i+1, right, k) } return nums[i] } return quick(nums, 0, len(nums)-1, k) } func main() { var number = []int{8, 9, 20, 12, 23, 32, 10, 10, 9, 12} /* n 是一个长度为 10 的数组 */ k := 1 answer := sortArray(number, len(number)-k) fmt.Print(answer) }
网页没代码提示,字母打错了报错我也找不到位置 ,size打成zize ,排编译错误浪费很多时间,没看懂网页的那个报错提示,早知道粘IDE上,脑袋抽了,我当时为什么不在IDE上写)
反问:贵公司是哪个部门,部门业务
#快手信息集散地##快手24秋招##面经##如何判断面试是否凉了#