V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
oncewosiwo
V2EX  ›  职场话题

分享前段时间面试 B 站的一个二面凉经

  •  
  •   oncewosiwo · 2019-01-31 13:49:46 +08:00 · 7763 次点击
    这是一个创建于 2127 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一面
    • 问了现在公司的整体架构情况

      • 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 终卒
    48 条回复    2020-09-25 15:57:53 +08:00
    defunct9
        1
    defunct9  
       2019-01-31 13:54:14 +08:00
    唉,我一个都不懂,这下完蛋了
    assiadamo
        2
    assiadamo  
       2019-01-31 13:57:08 +08:00
    这是什么岗位的,我面试游戏事业部没这么复杂....是主站的吗
    alvin666
        3
    alvin666  
       2019-01-31 13:58:09 +08:00 via Android   ❤️ 1
    面试造飞机,上班拧螺丝
    oncewosiwo
        4
    oncewosiwo  
    OP
       2019-01-31 14:01:12 +08:00
    @assiadamo 嗯,主站
    misaka19000
        5
    misaka19000  
       2019-01-31 14:01:48 +08:00 via Android
    b 站不是待遇不太好吗?楼主是要了多少啊。。。
    puritania
        6
    puritania  
       2019-01-31 14:06:57 +08:00
    楼主基础不错 干几年了?
    assiadamo
        7
    assiadamo  
       2019-01-31 14:08:52 +08:00
    @alvin666 批站技术还是有点牛逼的...视频方面的技术已经全面向 youtube 看齐了,比如 dash 和 quic 等等...反而是游戏事业部这边感觉都是传奇私服出来的技术很老...
    S9Yh4wIFsBG7jnE4
        8
    S9Yh4wIFsBG7jnE4  
       2019-01-31 14:09:48 +08:00
    b 站技术咋样啊
    puritania
        9
    puritania  
       2019-01-31 14:12:42 +08:00
    数据库连接池,还需要几个特性就是取出来的连接一定是可用的(定期 ping,取出 channel 时 ping ),同时还需要常规连接数和最大连接数。
    oncewosiwo
        10
    oncewosiwo  
    OP
       2019-01-31 14:14:05 +08:00
    @puritania 用一个经验工作多年的老油条了。。
    hirasawayui
        11
    hirasawayui  
       2019-01-31 14:46:19 +08:00
    羡慕,想去 b 站
    puritania
        12
    puritania  
       2019-01-31 15:00:27 +08:00
    @assiadamo 但是他们好像游戏那边盈利不少的
    Katrol
        13
    Katrol  
       2019-01-31 15:06:55 +08:00
    @puritania 好像都是代理的吧,自研的没看到
    shallyy
        14
    shallyy  
       2019-01-31 15:12:04 +08:00
    感觉 lz 技术很不错,去年夏天面过 b 站的 Python 也问了很多底层的细节 最后也凉了
    renothing
        15
    renothing  
       2019-01-31 15:13:28 +08:00
    感觉这像是在面试运维呢?或者后端偏运维
    oncewosiwo
        16
    oncewosiwo  
    OP
       2019-01-31 15:14:07 +08:00
    @shallyy 哈哈,同凉
    oncewosiwo
        17
    oncewosiwo  
    OP
       2019-01-31 15:14:27 +08:00
    @renothing 面 go 的开发岗
    raynor2011
        18
    raynor2011  
       2019-01-31 15:15:39 +08:00
    IO 阻塞不会导致 cpu 占用变高吧
    huhu3312
        19
    huhu3312  
       2019-01-31 15:23:01 +08:00
    cpu 占用变高的话,死锁,死循环,大量 io 线程阻塞,其实的不清楚了
    CallMeReznov
        20
    CallMeReznov  
       2019-01-31 15:32:12 +08:00
    看半天以为是运维开发面试题,到后来看到 GO 批站那么流弊运维都要会 GO 了?
    好多平常用根本没注意不了解只顾一把梭的点 受教了
    yepinf
        21
    yepinf  
       2019-01-31 15:35:17 +08:00
    哔站一共几场面试呢
    mysql 比重有点多
    66beta
        22
    66beta  
       2019-01-31 15:36:17 +08:00 via Android
    运维开发现在都转 Go 了啊
    oncewosiwo
        23
    oncewosiwo  
    OP
       2019-01-31 15:39:04 +08:00
    @yepinf 我是一场连着面下来的
    RqPS6rhmP3Nyn3Tm
        24
    RqPS6rhmP3Nyn3Tm  
       2019-01-31 15:40:26 +08:00 via iPad
    好多具体工具使用相关的,这种问题难道不是用的时候才看 manual 吗,我觉得不能反映编程水平
    oncewosiwo
        25
    oncewosiwo  
    OP
       2019-01-31 15:45:26 +08:00
    @raynor2011 这是一个需要好好研究一下的问题,按我的实践经验,worker 进程阻塞的时候 cpu 占用确实会的很高,目前只知道一个说的过去的解释,网卡队列满了的时候会频繁触发 cpu 中断处理数据包
    polythene
        26
    polythene  
       2019-01-31 16:04:26 +08:00
    我也想去写 go,可是大家都要有相关经验,好绝望~
    Yiki
        27
    Yiki  
       2019-01-31 17:49:30 +08:00
    好奇 B 站的技术栈是怎样的
    原来是有 go 的..
    eamon666
        28
    eamon666  
       2019-01-31 18:05:34 +08:00
    b 站服务端 技术过了 并对我表示赞许,
    我当时要了 30k 结果 hr 直接拒。
    可以参考下
    bk201
        29
    bk201  
       2019-01-31 18:20:10 +08:00
    @eamon666 你面什么职位要 30k ?
    oncewosiwo
        30
    oncewosiwo  
    OP
       2019-01-31 18:30:43 +08:00
    @eamon666 这,难道我也是价钱开高了....
    eamon666
        31
    eamon666  
       2019-01-31 18:48:12 +08:00
    @oncewosiwo 服务端部门 leader
    eamon666
        32
    eamon666  
       2019-01-31 18:48:32 +08:00
    @bk201 服务端部门 leader
    eamon666
        33
    eamon666  
       2019-01-31 18:49:53 +08:00
    @oncewosiwo
    @bk201
    当时我是最高 offer 25*14 都是普通 rd 岗位
    然后这边 b 站一直夸我技术好 让我来了 hold 全场 我有点遭不住 就多要了点
    结果 hr 连拒信都不给 太没礼貌了
    iAcn
        34
    iAcn  
       2019-01-31 18:51:31 +08:00 via Android
    楼主不是应聘 Go 吗,怎么面了一大堆 PHP 的
    deston
        35
    deston  
       2019-01-31 18:52:20 +08:00 via Android
    @eamon666 有点遭不住哈哈哈
    LosLord
        36
    LosLord  
       2019-01-31 19:01:10 +08:00
    楼主方便说下工作年数和要求薪资吗,想做个参考。
    oncewosiwo
        37
    oncewosiwo  
    OP
       2019-01-31 20:15:07 +08:00
    @iAcn 因为我目前公司的岗位是 PHP~
    NoahVI
        38
    NoahVI  
       2019-01-31 20:31:33 +08:00
    我也想向楼主一样这么吊
    wweir
        39
    wweir  
       2019-02-01 08:57:37 +08:00 via Android   ❤️ 1
    分享一下去年 B 站的凉经,在技术上硬刚了某业务负责人、中间件负责人、运维调度平台负责人、DBA 头头。
    前后面试近 3 小时,就感受和反馈来说,前两轮 90 分以上,后两轮 70~80 这样。
    最后的结果是:面试官最后问了我老东家的 leader 是谁,回去合计一翻之后,回去等消息。
    楼主,听了我的凉经,是不是感觉好多了 😄
    oncewosiwo
        40
    oncewosiwo  
    OP
       2019-02-01 09:42:23 +08:00
    @wweir 厉害了😂
    xiaoshenke
        41
    xiaoshenke  
       2019-02-01 11:17:18 +08:00 via Android
    @wweir 问 leader 这个这么骚?
    eamon666
        42
    eamon666  
       2019-02-01 11:28:48 +08:00
    @deston 我们遭不住啦!
    wweir
        43
    wweir  
       2019-02-01 13:00:55 +08:00
    @xiaoshenke 其它还好,这个确实骚得有点过了,虽然圈子很小,这么明说,就过份了。
    就说我能力不够岗位要求,也就罢了。问了 leader 让走人,这几个意思
    DragonQuestMaou
        44
    DragonQuestMaou  
       2019-02-01 14:21:04 +08:00
    cpu 资源占用 us/sy/si 各代表什么意思
    如果进程 cpu 占用很高 ,一般是发送在那些部分

    这两个问题不是应该是我们这个方向面试才问的么...
    us/sy/si 我还真的不知道..
    IO 阻塞应该不会引起占用问题 win 下会直接挂起然后等待 APC
    其实是系统调用现在也还好 win 基本都在走 KiFastSystemCall 和 MSR 没有之前的 int 2e 了 走 sysenter

    为啥搞你们这个还要问这些..
    oncewosiwo
        45
    oncewosiwo  
    OP
       2019-02-01 14:57:28 +08:00
    @DragonQuestMaou 你们是搞哪个方向的,系统内核开发的吗😂
    我的理解是,IO 阻塞本身不会导致 cpu 占用变高,但是作为一个服务,如果 worker 进程都被阻塞了,外面还一直有请求进来,这种情况我实际碰到挺多次的,CPU 占用都变得很高了,至于原因目前只想一个,就是上面提到的哪个网卡队列满了导致触发 cpu 中断
    DragonQuestMaou
        46
    DragonQuestMaou  
       2019-02-01 15:07:59 +08:00
    @oncewosiwo 二进制安全 win 内核驱动方向的 以前写过 j2ee
    至于你说的网卡队列没有研究过不太清楚 我们一般不会遇到这种情况 hhh
    yuyoung
        47
    yuyoung  
       2019-09-03 16:08:14 +08:00
    dandankele
        48
    dandankele  
       2020-09-25 15:57:53 +08:00
    老哥你这 PHP 做了几年啊?知识点还是比较牛的了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3494 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 11:01 · PVG 19:01 · LAX 03:01 · JFK 06:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.