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

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

  •  
  •   oncewosiwo · 166 天前 · 4501 次点击
    这是一个创建于 166 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一面
    • 问了现在公司的整体架构情况

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

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

    为啥搞你们这个还要问这些..
        45
    oncewosiwo   165 天前
    @DragonQuestMaou 你们是搞哪个方向的,系统内核开发的吗😂
    我的理解是,IO 阻塞本身不会导致 cpu 占用变高,但是作为一个服务,如果 worker 进程都被阻塞了,外面还一直有请求进来,这种情况我实际碰到挺多次的,CPU 占用都变得很高了,至于原因目前只想一个,就是上面提到的哪个网卡队列满了导致触发 cpu 中断
        46
    DragonQuestMaou   165 天前
    @oncewosiwo 二进制安全 win 内核驱动方向的 以前写过 j2ee
    至于你说的网卡队列没有研究过不太清楚 我们一般不会遇到这种情况 hhh
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1791 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 28ms · UTC 16:29 · PVG 00:29 · LAX 09:29 · JFK 12:29
    ♥ Do have faith in what you're doing.