面灵AI→

字节飞连一面:p90 与 p99 指标口径、操作系统八股与 DFS 路径追问

轮次
一面
时间
2026-09
来源
牛客网

《面试题目》

  1. 自我介绍
  2. 讲讲你的项目

实习拷打

  1. 你怎么解决参数映射不一致问题?
  2. 你看 avg 和 p90 是为了解决什么样的问题?
  3. 你们会统计 p99 的指标吗?
  4. 用户体量大概有多少?p99 有多少?如果样本参数大,是不是也需要参考 p99?
  5. p90 能解决大部分用户的问题,但从我们的角度看 1% 不是一个很小的数,取决于你的用户量,能不能通过 p90 解决用户的问题?
  6. 你知道你们的用户量有多少吗?p99 的指标呢?
  7. 除了刚刚说的问题,你有没有排查过线上问题?
  8. 从你现在的角度来看,这些是可以避免的吗?
  9. 线上有碰过性能问题吗?
  10. 怎么排查性能问题?

八股环节

  1. 进程和线程的区别?
  2. 对于操作系统来说为什么要区分内核态和用户态,它们之间的核心区别是什么?
  3. 如果我发起一次系统调用会经历哪些步骤?
  4. 对于 read fd 来说会经历哪些步骤?
  5. read 和 mmap 的区别?
  6. mmap 少一次拷贝,它的风险在哪?
  7. 三次握手、四次挥手?
  8. 什么时候会出现 TIME_WAIT 情况,还有端口耗尽的情况?
  9. HTTP 和 HTTPS 的区别?
  10. HTTPS 的单向认证和双向认证分别解决了什么样的问题?
  11. 如果我访问了一个全 IP 直连的地址会有什么问题?
  12. 那一般怎么去解决这个问题,想用 DNS 去解决?

算法:力扣 130 被围绕的区域

  1. 除了 DFS 还有别的解法吗?试着用别的方法实现
  2. DFS 里你为什么只遍历四条边,你的思路是什么?
  3. 这个和正常的 DFS 有啥区别?
  4. 这一道题 BFS 和 DFS 有什么区别?
  5. DFS 怎么遍历这一张图的?
  6. 那从第二行第二个那个 0 开始遍历,它的 DFS 路径是什么?
  7. 你的方法里 DFS 从内部的 (1,1) 开始调用,到底是怎么走的?
  8. 这道题 DFS 和 BFS 的访问顺序有区别吗?
  9. 怎么判断 DFS 和 BFS 是不是访问一致的?

《参考解析》

  1. avg 与 p90/p99 的分工要一句话说清:平均延迟会被少量极端值拉平,也掩盖长尾,所以对外承诺的体验指标通常看分位数;p90 决定「大多数人的体感」,p99 决定「最差的那批人有多差」。被追问「1% 不是小数字」时,正确的接法是把它换算成绝对值——日请求 1000 万时 p99 就是 10 万次糟糕体验,同时说清你们当时的业务体量到底够不够支撑这个结论。另外一定要说明指标口径:p90 是哪个环节的耗时(网关、服务端、还是端到端)、采样窗口多长、是否包含重试,口径不同数字没法比。

  2. 性能排查的答法要有链路感,而不是报工具名:先看监控大盘定位是全局还是单接口、何时开始(对齐发布/配置变更时间点),再看链路 trace 找最慢的那一跳,然后才进到实例层面——CPU 用 top/火焰图分辨是计算密集还是 GC,内存看 GC 日志与堆直方图,线程看 jstack 找阻塞与锁竞争,最后用 arthas 这类工具在线观测。收尾补一句「定位后先止血(限流、回滚、扩容)再根治」,这是面试官最想听的工程判断。

  3. 内核态与用户态的核心是权限与隔离:用户态拿不到特权指令、不能直接碰硬件和页表,内核态才能执行特权操作;分层的目的是保护内核与进程间隔离。一次系统调用会经历:用户态把参数放进约定寄存器 → 执行陷入指令(如 syscall)触发软中断切到内核态 → 内核按调用号查表、做权限校验 → 执行具体逻辑(可能阻塞、可能被调度走)→ 把返回值写回寄存器、切回用户态。答到「上下文切换保存了什么」「为什么系统调用比函数调用贵」会更完整。

  4. read 与 mmap 的差别在拷贝次数与页表映射:普通 read 是「磁盘/内核缓冲 → 内核缓冲 → 用户缓冲」两次拷贝;mmap 把文件页直接映射进进程地址空间,读的时候按缺页把 page cache 的页挂到用户页表上,省掉第二次拷贝,顺序读大文件时优势明显。它的代价正好是追问的答案:缺页中断带来的开销、文件被截断时访问越界会收到 SIGBUS、页的生命周期由内核管但脏页回写时机不是你能控的、映射大文件会占虚拟地址空间且不适合小文件随机读。

  5. TIME_WAIT 与端口耗尽的回答要落到「谁先关」和复用参数上:主动关闭的一方进入 TIME_WAIT,等 2MSL 是为了保证最后的 ACK 能重传、以及让本次连接的残余报文在网络里消散,避免污染用同一四元组新建的连接。高并发短连接服务(尤其是客户端角色)会攒下大量 TIME_WAIT,把可用源端口吃掉,从 netstat 上看到「TIME_WAIT 好几万、端口快用完」就是它。缓解手段按破坏性排序:改用长连接/连接池最优,其次是 tcp_tw_reuse 与扩大本地端口范围,靠调小 tcp_fin_timeout 治标不治本。

  6. HTTPS 的单向与双向认证解决的是「谁信谁」:单向只验服务端证书,客户端身份靠应用层的账号密码,适合面向公众的网站;双向认证要求客户端也出示证书(mTLS),解决的是服务端如何确认调用方身份,常见于内部服务间、金融与物联网设备接入。两者共同的底座是证书链验签 + 密钥交换,答的时候提一句证书校验要关掉「跳过校验」的开关,否则等于没有。

  7. IP 直连的问题要从「证书校验」讲到「运维体系」:HTTPS 用 IP 访问时,证书 SAN 里必须包含这个 IP,否则校验失败;客户端拿不到 SNI 与 Host 头,同一台机器上的多站点无法区分;更要紧的是绕过了 DNS,等于放弃了就近接入、故障切流、灰度与变更审计,IP 一变全量不可用。想用 DNS 解决方向是对的——但要答出配套:域名 + 多 A 记录或 CNAME 到调度域、健康检查剔除故障节点、客户端设置合理的解析缓存与重试,必要时上 HTTPDNS 避开本地 DNS 劫持。

  8. 力扣 130 除了 DFS/BFS,并查集确实是一条正解:把所有与边界相连的 'O' 视为同一个连通分量,用并查集把边界上的 'O' 与一个虚拟节点合并、相邻 'O' 互相合并,最后把所有不与虚拟节点连通的 'O' 改成 'X'。DFS 从四条边出发的原因是:只有与边界连通的 'O' 才不会被完全包围,从边界反向标记「安全区」比逐个格子判断更省事;写 DFS 时把「标记与还原」写对(本题不需要还原,标记过的就是安全的)。被追问「DFS 和 BFS 访问顺序是否一致」时,要点是顺序由邻居的遍历次序决定,两者只有在邻居顺序和入栈/入队策略一致时才可能产生相同的访问序列,递归 DFS 的顺序与显式栈的 BFS 顺序一般不同,判断方法就是按同一套邻居顺序手工模拟两个遍历。