百度运维面试全记录

今天终于功德圆满了,上午和百度的 HR 谈了会,因为三方还没到,就和百度签了 2 方,也算是给自己一个交代。基本上结果还是满意的,能去做自己想做的东西本身就是一种幸福,回想起来这几天的笔试面试,心情像过山车似的上下起伏,有兴奋,有紧张,有焦虑,有欣喜。一段经历往往就是这么令人印象深刻。

2013.10.13 百度笔试

在参加笔试前还是没有信心的,可能阿里给我的打击比较严重。当时的岗位貌似还投的有问题,开始的时候不知道自己到底想要做什么投的职位是研发工程师,但是后来发现更喜欢做运维,临时的改成了运维。百度还是比较有气度的,欢迎霸笔,欢迎霸面,只要你有实力,就有你展现实力的舞台,临时改职位就相当与霸笔了。题目还是有一定的水准的,比较均衡,自己尽了最大的努力做,当时的感觉是如果不给面试机会的话也不会后悔。

2013.10.14 百度一面

十分幸运的是昨晚10点多接到了面试的通知,第二天早上 9:30 面试。是在一个酒店里面面试的,很奇怪的是没有 HR, 前台也没有任何的接待人员,每个人都是到各个面试官的房间里面去面试的。

我大概在 9:20 多去房间面试的,面试官是个很和蔼的,微微有点胖的人,很年轻,感觉和我差不多大。没有自我介绍之类的,开始的时候聊聊笔试的程序设计的题目,题目说的是在长距离的传输中明明带宽很大,但是传输速度却很慢的问题。我首先回答了我的理由:

1.路由设置有问题,可能分配到了很拥堵的线路,造成的传输很慢;

2.发送的时候包分的过大,导致有些中间的路由节点会分片,然后到了接受端再进行数据的合并,会造成很大的损失。

面试官友好的和我讨论了这些东西,他说我说的这些理由都对,但不是影响传输速度最大的因素。还给了提示,汽车在高速上开的很快,但是在城市中就开的很慢,这是为什么? 但是我确实没想清楚这问题应该怎么去回答。然后他给了一个他认为的原因,因为路径太长,在一路上会有很多的节点进行数据的转发或者是信号增强之类的,信号从线路上到进入节点的cpu中进行处理,速度就会降低,节点越多速度下降的越多,虽然他是这么解释的的,但是我感觉我还是无法赞同他的观点。

然后是下一步的考察些基本的 linux 命令什么的,ls, ls -al 等等, vi 中的替换命令,还让我替换掉一个 c 程序中的一个写错的变量名,我感觉这个可以用 sed,还需要用正则表达式来匹配避免误伤,但是当时正则表达式好像没有写出来。我说还用过 vsftp 搭建过 ftp 服务,他就问了下,ftp 的验证方式有那几种?我不太清楚,只回答了匿名的帐号,和系统帐号,其实还有手动的验证的,将用户名和密码分别写在不同的文件中进行验证,原始的数据库形式的,还有一种就是需要有 mysql 的数据库的支持了,基本上就是这些验证方式了。

在我的简历上还写了编写 shell 脚本分析日志,然后他就让我举个例子,我就说对 apache 的日志进行切割找出访问量最大的ip出来,貌似我当时些的是这个样子的,cat log | awk ‘{print $1}‘| sort| uniq -c | sort -nr ,然后他问了不用 cat 怎么办?我写成了这个样子,awk ‘{print $1}’ < log | sort | uniq -c | sort -nr , 然后问还有没有什么办法,我说用 less,more 都可以吧,其实可以直接写成 awk ‘{print $1}’ log | sort|uniq -c | sort -nr, 这样感觉更好看一些,但是当时没想到。

最后还考了点 IO 重定向的问题。比如 2>1 什么意思,我说基本没见过这么写的,我见过的是 2>&1, 错误输出也输入到标准输出里面去,不知道对不对。然后他写了两个看起来比较容易混淆的命令 2>&1 >log>log 2>&1 有什么区别,我说第一种应该是错误的输出也重新定向到了 log 了,第二种应该是错误的输出没有定向到 log 中,回来实验了下,貌似恰好回答反了,看了记忆是不靠谱的。最后大概还问了平时在公司如何管理那么多台的服务器,用些什么工具进行管理,是自己写的工具还是别人做的? 可能我面试的时间长了, 为了不耽误下一个同学的面试, 他只是很简要的敷衍的和我说了句: “你以后来公司就知道了”。希望如他所愿。

一面的感觉还好,感觉应该有希望进入二面的,回来就慢慢的期待二面点电话通知了。

2013.10.15 百度二面

大概和一面的情况差不多,也是10点多接到二面的,第二天进行二面。二面开始的时候简单的自我介绍了下了,发现这就是个引入话题的方式,当我介绍到在实验室搭建了 nfs 服务的时候,他貌似很感兴趣,开始让我画一下 nfs 的架构,当时有点蒙,不是很清楚这个到底是个什么样子的,只是简单的画了下, 有个 nfsd 的服务,貌似还有个控制端口的服务什么的。然后就开始对这这个 nfs 的架构进行发问了,你感觉 nfs 有什么缺点,我说这个不怎么了解,但是发现如果服务端挂掉后,客户端是无法正常的卸载掉挂载的数据的,其实还有很多的缺点,回来后上网查找了下。

然后问,有机器 0~4, 0 为 nfs 服务器,1~4 挂载着 0 共享出来的文件,现在机器 0 down 掉了,问用 wget 可以从 4 中取出共享的文件吗?我说是不可以的,因为文件只有一份,服务器挂掉后就挂掉了,问我有什么解决方案没有,我说既然这个单机的不靠谱,就直接上 hadoop 吧,至少这样会保证数据安全,冗余度高。然后简单的画了下 hadoop 的架构图,然后和他扯了 hdfs 的基本原理和它存储的策略。在说到数据是按照 64M 一块来存储的时候,他问了下你知道 linux 的文件系统一般是多大的一块的吗?我说是 4K,他就问为什么 hadoop 要用 64M 这么大的块做存储,我说原因主要是考虑到效率问题,hadoop 是主要处理大数据的,将数据块分的大一点,系统一下就可以预读很多的东西,太大的块会造成浪费,太小的块会造成系统的效率低下。系统采用 4K 的块主要是为了避免浪费,因为文件即使没有占用一个块,那么这个块中的其他的空间也无法利用了。4k 主要是避免小文件造成的损失,从这里开始问到了文件系统,我大致的把文件系统的结构图画了出来,超级块,组的描述块,块占用的位图描述,inode的占用描述,inode节点,数据块。

然后说用 vi 打开个文件,然后删除,再保存会有什么情况,我说原来的文件还是会回来的,因为在删除的时候只是把文件名与具体的 inode 节点脱钩,原来的 vi 打开的是以 inode 作为标识符的,文件名字无所谓,随便删除,保存后会生成新的文件名与 inode 的对应关系。然后的问题是 vfs 的东西,虚拟文件系统,他说 linux 支持很多的文件系统,但是这些文件系统很不一样,但是用户操作起来却是一样的这个是什么原因,我说是因为 linux 实现了虚拟的文件系统,这个 vfs 屏蔽了下层的各种文件系统的差别,对上层的应用提供了一个统一的接口,所以说用户感觉操作起来的习惯是一致的。然后问了下 /proc 文件夹是干嘛的,我说里面是各个进程的数据,有占用cpu,内存,打开的文件,程序的文件夹等等信息,然后问这个是不是也是通过 vfs 进行读取的,我的回答是是的。

然后开始问了点命令,如何查看当前的网络状况,流量什么的,我说可以使用 iftop , 他说还有没有别的方案,我说可以监控 ifconfig ,每秒刷新一次,具体用什么命令我是忘记了, 回来查询了下用 watch ifconfig 即可。然后问怎么查看网络各个端口状况,我回答用 netstat ,他说有什么问题没有? 我说有,感觉就是太慢了,他问我有什么改进方案,没想出来, netstat 就是从 /proc 里面读取的数据,还有什么特别的解决方案。然后我问他有什么办法,他说了下,说是有个 ss 的命令,貌似很牛逼,说是速度很快,我记下了,回来查查看,确实牛逼,当时还用过过,但是就是没有什么印象,太他妈的坑爹了。

问完了这个貌似又有个问题,在多进程或多线程的时候同时处理一个 url,如果有 url 过来了,在阻塞状态的进程或线程会同时醒来响应,造成了竞争,问我有什么方案?我想了想说主要是这些进程同时响应了,可以指定一个进程处理 url,其他的不响应,我想的方案是下面的三种,最后面试官告诉我这个是“惊群”现象,回去可以查查。

  1. 设置一个空闲进程队列,每个空闲的进程入队,来一个 url,队首的进程进行处理,其他的不动。
  2. 根据 url 的 ip 来划分,指定这些进程只响应指定 ip 段的请求。
  3. 可以对 url 做 hash,然后分配到不同的进程中去工作。

下面是写程序的阶段,一个是求 m 个数中的前 k 最大值,这个是《剑指 offer》 上面的原题。我用 c 写的,悲剧的是很久没在纸上写代码,感觉在纸上写代码就是很诡异的感觉,一点都不习惯。先讲述了下思路,利用了快排的一个阶段,求 partition 的阶段,这个就是将原来的数组分成了 2 个部分的,遗憾的是老是想不清楚,代码写的很烂,还没写完。虽然思路对了,但是就是很烂。下一个是要写个小脚本,a,b两个文件,将a,b中的行做交叉,这个他妈的我写过的,但是当时写出来还是很烂,感觉都要崩溃的感觉。下面是回来写的代码,虽然还是很烂,但是能工作了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/bin/bash
# 读入两个文件,逐行读入,并交替打印出来
testfile1=$1
x1=`wc -l $testfile1 |awk '{print $1}'`
testfile2=$2
x2=`wc -l $testfile2 |awk '{print $1}'`
if [ $x1 -le $x2 ]; then
x=$x1
elif [ $x2 -lt $x1 ]; then
x=$x2
fi
i=1
while [ $i -le $x ]
do
echo "`head -$i $testfile1 | tail -1`"
echo "`head -$i $testfile2 | tail -1`"
i=`expr $i + 1`
done
if [ $x1 -gt $x2 ]; then
i=`expr $x2 + 1`
while [ $i -le $x1 ]
do
echo "`head -$i $testfile1 | tail -1`"
i=`expr $i + 1`
done
fi
if [ $x2 -gt $x1 ]; then
i=`expr $x1 + 1`
while [ $i -le $x2 ]
do
echo "`head -$i $testfile2 | tail -1`"
i=`expr $i + 1`
done
fi

再然后就是随便聊聊项目,将项目扯蛋了一遍,然后问了和一面同样的问题,这次面试官给了个正面回答,总的来讲运维管理是个很复杂的系统。主要侧重于应用的维护,而不在于一个个机器的管理,更底层的机器管理的工作一般都包给了机房让机房去做了,他们只要管理好在上面跑的应用就好,做负载均衡,机器优化,性能调优等等,对各种突发情况的处理,做处理的预案等等。感觉二面的感觉不是很好,但是内心感觉应该还是有点机会的。

2013.10.16-17 煎熬

按照以前的节奏,应该 16 号就应该三面了,但是二面回来后彻底的没有消息,看这周围的同学有些就去三面了,当时心里十分的纠结,怀着希望,又带着绝望。在 17 号终于决定不去想这档子事情了,去市区,准备去霸面华为,心情十分的低落。华为不给机会,折腾到了 3 点还没有吃到午饭,好不容易找到了个店刚点好菜,百度的电话到了,让我明天去三面。当时的心情无法形容,感觉有点泪流满面的感觉。

2013.10.18 百度三面

三面是 boss 面,感觉还是不错的,就是随便谈谈。基本上不聊技术,聊人生,聊规划,这时的重点不在于技术,而在于人了。就是 boss 考察你这个人,适合不适合他的团队,每个人的经历各有不同,展现自己的真实的一面就好。

2013.10.19-21 纠结

面试完了,剩下的时间就是纠结了。毕竟很在乎这份工作,加上手里没什么 offer,表现的对这份工作特别的渴望,在 19 号有人收到 offer 后,感觉常常的否定自己,忐忑不安的感觉。这样折磨了 3 天后 21 晚上终于接到了 HR 的电话,尘埃落定了。

后续

帝都,我来了!!!