一面
-
问了现在公司的整体架构情况
- lvs 入口,api 接口负载机,service 服务等
-
突然出现大量 close_wait,问题可能出在哪里
- close_wait 是接收关闭信号的一方, 而一般情况都是客户端主动关闭连接的,而且一个客户端一般也不会维护大量的连接
- 所以我的回答是因为有大量客户端关闭了连接导致的
- 面试官接着问操作客户端连接大量关闭的原因
- 我当时给的回答是可能遭受了攻击,面试官点头然后提示说还有其他可能吗,(回来之后想了想,感觉攻击者应该不会好心给服务端发送关闭信号的)
- 我想了下,回答说可能是客户端的超时机制导致的
- 面试官继续提示,为什么客户端会大量超时
- 最终 get 到了面试官的意图,回答说是服务端可能负载过高导致响应耗时变长
-
问了几个相对简单的问题,
- 是否熟悉 mysql 的 explain 命令,返回的消息里面有哪些字段
- 怎么查看各个 cpu 的资源占用情况?这个就是 top 命令进去之后按数字 1 了
-
cpu 资源占用 us/sy/si 各代表什么意思
- 回答说 us 是用户进程的资源占用,sy 是系统进程空间的 cpu 占用,si 由于没什么印象,就说不清楚
-
如果进程 cpu 占用很高 ,一般是发送在那些部分
- 个人理解服务器的瓶颈一般出现在 IO 层面,和 cpu 层面
- 所以回答说 IO 阻塞会导致 cpu 占用变高
- 面试官点头表示这是一个,然后继续问还有哪些,并提升了上一个问题问道的 us/sy
- 被面试官点了下,反应过来说,系统调用会导致程序在用户态和内核态进行切换,会消耗 cpu 资源
- 面试官继续问,还有吗
- 我想了下,没想到有什么相关的回答,就对着面试官尬笑了一下,摇了摇头
- 面试官继续提示,说知道中断吗
- 点点头,回答说是程序被 cpu 挂起(同时才反应过来,想起来 cpu 在各个进程 /线程间切换也是要消耗资源的)
-
问了处理过的表的数据量级,以及分表的策略
- 然后追问了分表下的利弊
- 问了分表下不同查询维度如何实现,最终引导除了双向表,得出分表了一个弊端,即数据冗余
- 然后说优势,减少单个表的索引大学,加快查询速度,多个表也可以支持并发插入
-
问了 go 相关的问题,如果在一个 goroutine 里面发生的 panic,这个错误能捕捉吗
- 之前验证过这个问题,直接回答了 goroutine 里面的 panic 只有在 goroutine 里面才能用 recover()捕捉,主协程无法捕捉,会导致整个进程崩溃
- 然后问了框架是否应该在 goroutine 里自动进程捕捉,这个还没有认真考虑过,选了一个回答说不提供,这个回答面试官好像不满意
-
另外一个 go 的问题,由于 go 协程无法预知执行顺序,如何控制 gorotine 的执行顺序
- 回答说给每个 goroutine 传入一个编号,然后使用原子操作维持一个公共计数,计数与编号一直的协程才执行后续逻辑,执行完之后就给计数加一,触发下一个协程执行
- 面试官说这个方式复杂了,有没有简单的办法,想了下没想到合适的方案
-
然后问了最近一两年有没做什么有深度的工作,公司内的好像在做服务化重构后业务相对稳定,没什么特别值得一提的,就跟面试官表示自己对照 swoole 写了一个 php 服务化的扩展,以及用 go 写了一个类似 redis 的 nosql 项目
-
最后面试官还提到了他们开始引入 TiDB,之前在知乎上看了一些 PingCAP 官方分享的 TiDB 内部实现的文章,还按他们创始人的一个分布式数据库学习路径的一个回答,看了谷歌大数据的“老三篇”论文,所以也回答对这个有了解
二面
- 二面的感觉不大理想
- 先问了 php 能不能做连接池的问题 ,很显然 php 没有很好的多线程方案,在线程安全版本下,每个线程都复制一份独立的变量堆栈,所以就回答不能做,只能使用长连接,
- 面试官接着问,fpm 下的长连接是如何跨请求保留的,由于挺长时间没看 php 内核,这次面的又是 go 的岗位,没做对应的准备,这题就没答上来
- (回来后重新看了 php 内核中的变量实现,以及内存管理,这个问题的情况是 php 资源型变量的的持久化保存,所以应该是通过 EG(persistent_list)这个符号表来实现的)
- 有兴趣可以看下我整理的笔记 http://onceme.me/post/php-memery/
- 然后又衍生出如何使用 go 来实现一个连接池,问了一个连接池有哪些特质
- 首先肯定回答了连接池首先需要使用长连接
- 面试接着问还有那些,考虑了一会,面试官提示一个连接同一时刻只能被一个协程持有
- 接着问了使用什么数据结构存储这些连接资源,
- 一开始回答了环形链表, 面试官摇头,说用 go 内部的数据结构
- 接着回答说使用通道,面试官追问原因,回答说通道共享数据,被一个协程取走的,就不会被第二个协程获取到
- 面试官没有明确的表示,还以为说错了(回来查了下,好像确实是使用通道)
- 接下来是问了斐波那契数列求第 n 项的值,这个之前发帖讨论过~
function fb($a,$b,$n){
$c = $a+$b;
if($n>0){
return fb($b,$c,--$n);
}
return $c;
}
$ret = fb(1,1,$n-3);
-
接着问了联合索引的问题,A,B,C 三个字段,建立联合索引,列出了几种查询组合判断是否能命中索引
- 这个相对基础点了,所以直接给出了答案
- 面试官接着问了有一句总结出来描述这种索引顺序的总结话语是什么,这个想了下,好像没看到过
- 接着问了为什么查询必须按照索引的顺序
- 之前看《 Mysql 技术内幕:Innodb 存储引擎》时有提到这块,不过印象比较模糊了,同时这部分内容恰巧没有做笔记,所以只能根据对 B+树的理解给出一个解释
- 面试官没有明确的表示
- (后面再回去看那本书,里面的解释是联合索引是一个多键值的 B+树)
-
最后问了一个奇怪的问题,问了 php 统计数组元素个数的内置函数,
- 当时还感觉有点意外,问这么基础的问题,就直接回答是 count()函数
- 面试官接着问如果是统计多维数组的的情况呢
- 这个印象里没有碰到类似的问题,想了下就摇头说不知道
- (回来之后有去查了这个问题,count 函数第二个参数传 1 可以统计多维数组的长度..)
最后 hr 问了现在工资和期望薪资,当时为什么来上海,业余兴趣,然后我问了面试的岗位所在部门的情况,然后就是让我回去等通知了
anywhere 终卒