Skip to content

Latest commit

 

History

History
340 lines (242 loc) · 11.1 KB

File metadata and controls

340 lines (242 loc) · 11.1 KB

简历项目面试追问清单

适用对象:围绕你简历中的这段项目描述进行面试准备。

项目描述:

2025.12-2026.02 基于 Reactor 与 ONNX 的高性能边缘 AI 推理网关

  • 架构设计:采用 Reactor 模型与 Epoll ET 边缘触发机制,结合自定义线程池,实现网络 I/O 与业务逻辑的高效解耦,静态接口在 500 并发下稳定 3.2万+ QPS。
  • 性能优化:深度集成 ONNX Runtime C++ API,并改造为 Session 池并发推理,推理接口在 100 并发下稳定 3.2万+ QPS。
  • 系统增强:基于 mmap 与 writev 实现零拷贝大文件传输,利用小根堆定时器管理连接,O(log n) 复杂度精准剔除超时请求,有效防御 Slowloris 攻击。
  • 稳定性保障:实现双缓冲异步日志系统与 RAII 模式数据库连接池,确保高并发场景下的系统稳定与数据安全。

一、面试官最可能先问什么

面试官一般不会一上来就抠代码,更常见的是先确认三件事:

  1. 这个项目你是不是真的主导做过。
  2. 简历里的架构词和性能数字是不是说得准。
  3. 你是否理解每个技术选型背后的原因和代价。

所以第一轮高频追问,通常会围绕下面四类:

  1. 这个项目到底解决什么问题。
  2. 为什么这么设计,而不是别的方案。
  3. 这些性能指标是怎么测出来的。
  4. 如果继续放大流量,瓶颈会先出在哪里。

二、围绕项目本身的高频问题

1. 项目定位与业务价值

  1. 这个项目解决的核心问题是什么?
  2. 为什么它叫边缘 AI 推理网关,而不是普通 WebServer?
  3. 它适合落地在哪些业务场景?
  4. 和普通推理服务相比,它的核心价值是什么?
  5. 你做这个项目时最看重的目标是吞吐、延迟,还是工程可落地性?

2. 架构设计

  1. 为什么选 Reactor,而不是 Proactor?
  2. 为什么选 Epoll,而不是 select 或 poll?
  3. 为什么选 ET,而不是 LT?
  4. 你说的是主从 Reactor,这里的主和从分别负责什么?
  5. 线程池在你的架构中承担什么职责?
  6. 为什么不用协程?
  7. 网络层和 AI 推理解耦,具体解耦了什么?
  8. 如果要水平扩展,这个架构怎么扩?

3. 性能指标与压测口径

  1. 你简历里写的 3.2万+ QPS 是怎么测出来的?
  2. 压测时的机器配置、核数、内存、系统环境是什么?
  3. 500 并发下 3.2万+ QPS,对应的平均延迟和 P99 是多少?
  4. 这个 QPS 是静态文件、推理接口,还是混合流量?
  5. 推理延迟 < 1ms 是平均值、P50,还是单次最佳值?
  6. 推理 QPS 3.2万+ 和静态接口 QPS 的差异来自哪里?
  7. 这些指标测的是端到端,还是只测模型本身?
  8. 你有没有做过多轮回归测试,还是只测过一次?

4. ONNX 与 AI 推理链路

  1. 为什么选 ONNX Runtime,而不是 Python + PyTorch 服务化?
  2. 为什么不用 TensorRT?
  3. 为什么模型要常驻内存?
  4. 模型单例的收益和代价是什么?
  5. 你说规避 Python GIL 性能瓶颈,这句话具体是什么意思?
  6. 如果模型更大、QPS 更高,现在的推理链路最大瓶颈是什么?
  7. 推理过程的线程安全是怎么保证的?
  8. 如果以后要上 GPU,这套方案要怎么改?

5. 性能优化与零拷贝

  1. 为什么 mmap + writev 能提升性能?
  2. 它具体减少了哪些拷贝和哪些系统调用?
  3. 为什么不是直接用 sendfile?
  4. 你这里的零拷贝是不是严格意义上的完全零拷贝?
  5. 这种优化更适合哪些响应场景?
  6. 如果是超大文件,这个方案还有没有风险?

6. 稳定性与连接管理

  1. 为什么要做小根堆定时器?
  2. 为什么说它是 O(log n)?
  3. 它和时间轮相比有什么优缺点?
  4. Slowloris 攻击是什么?
  5. 你的方案为什么能缓解 Slowloris?
  6. 超时时间是怎么定的?
  7. 如果大量慢连接长期占坑,除了定时器还能怎么防?

7. 日志与数据库连接池

  1. 为什么日志要异步写?
  2. 双缓冲异步日志的核心思想是什么?
  3. 同步日志在高并发下的问题是什么?
  4. RAII 数据库连接池解决了什么问题?
  5. 为什么数据库连接不能每次请求现建现关?
  6. 连接池大小怎么定?
  7. 如果连接池耗尽了怎么办?

8. 项目难点与个人贡献

  1. 这个项目里你真正独立完成的部分有哪些?
  2. 你遇到过最难的一次排障是什么?
  3. 你做过最有效的一次优化是什么?
  4. 如果让你重新做一遍,你会重构哪一块?
  5. 这个项目当前最大的瓶颈和最大的工程风险分别是什么?
  6. 你从这个项目里学到的最重要的工程经验是什么?

三、会顺手问到的八股题

1. 网络八股

  1. select、poll、epoll 的区别是什么?
  2. LT 和 ET 的区别是什么?
  3. 为什么 ET 必须配合非阻塞 I/O?
  4. 什么是惊群?
  5. 什么是半包和粘包?
  6. TCP 三次握手和四次挥手分别是什么?
  7. TIME_WAIT 为什么存在?
  8. keep-alive 的作用是什么?
  9. 为什么高并发服务端通常要用非阻塞 I/O?

2. 操作系统八股

  1. 用户态和内核态切换的成本来自哪里?
  2. 线程和进程的区别是什么?
  3. 线程池为什么能提升性能?
  4. 锁的开销主要体现在哪?
  5. mmap 的原理是什么?
  6. 什么情况下会发生缺页?
  7. 信号是什么?
  8. SIGPIPE 为什么危险?

3. C++ 八股

  1. RAII 是什么?
  2. shared_ptr 和 unique_ptr 的区别是什么?
  3. 右值引用和 move 的意义是什么?
  4. condition_variable 的典型使用场景是什么?
  5. mutex 和 atomic 分别适合什么场景?
  6. unordered_map 的底层原理是什么?
  7. vector 为什么会扩容?
  8. 多线程下常见的竞态条件有哪些?

4. 数据库八股

  1. 为什么数据库连接要池化?
  2. 数据库连接池有哪些核心参数?
  3. 如果连接池耗尽怎么办?
  4. MySQL 事务四大特性是什么?
  5. 索引为什么常用 B+ 树?

四、你这段简历最容易被重点拷问的表述

1. 主从 Reactor 模型

这是最容易被追问的词。

面试官通常会继续问:

  1. 主 Reactor 线程做什么?
  2. 从 Reactor 线程做什么?
  3. accept 在哪一层处理?
  4. 一个连接从建立到关闭经过哪些线程?

如果你的真实实现更接近单 Reactor + 线程池,就不要把架构词写得过大。

2. 峰值 QPS 3.2万+(500 并发)

这个数字必须有完整口径。

你至少要准备清楚:

  1. 压测工具是什么。
  2. 压测命令是什么。
  3. 压的是哪个接口。
  4. 机器配置是什么。
  5. 是否本机压本机。
  6. 平均延迟和 P99 是多少。
  7. 是否做过多轮测试。

3. 推理接口 QPS 3.2万+(100 并发)

这句话也很容易被追问口径。

面试官一般会问:

  1. 是纯模型推理耗时,还是 HTTP 端到端耗时?
  2. 是平均值、P50、还是最优值?
  3. 输入数据规模是什么?
  4. 是否包含预处理和后处理?

4. 成功规避 Python GIL 性能瓶颈

这句话可以说,但不要说绝对。

更稳的表达方式是:

  • 在高并发、CPU 密集型推理场景下,Python 服务化会受到解释器开销、运行时调度和 GIL 相关限制影响;采用 C++ + ONNX Runtime 后,推理链路更轻、更稳定,吞吐更高。

5. 有效防御 Slowloris 攻击

这句话最好说成“有效缓解”,更稳。

因为严格意义上的防御 Slowloris,通常还会配合:

  1. 请求头超时。
  2. 最低接收速率限制。
  3. 单 IP 连接数限制。
  4. 反向代理或网关层限流。

6. 双缓冲异步日志系统

如果简历写了这句话,面试官会默认你能讲清:

  1. 为什么要双缓冲。
  2. 为什么不是简单阻塞队列。
  3. 刷盘时机怎么控制。
  4. 高并发下如何避免业务线程被日志拖慢。

五、面试官真正想确认的四件事

很多问题表面上在问技术,实际上在确认这四点:

  1. 你是不是自己做过,而不是照着教程搭出来的。
  2. 你是不是知道为什么这么设计。
  3. 你是不是知道这个方案的缺点和边界。
  4. 你是不是能把性能数据讲清楚。

因此,最容易出现的追问模板基本都是下面这些:

  1. 为什么这么做,不选别的方案?
  2. 这个指标是怎么测出来的?
  3. 这个方案的缺点是什么?
  4. 如果流量继续翻十倍,哪里会先出问题?
  5. 你做错过什么,后来怎么修的?

六、建议你重点准备的 20 个问题

这 20 个问题建议优先准备到可以口述 1 分钟。

  1. 这个项目解决什么业务问题?
  2. 为什么要做成边缘 AI 推理网关?
  3. 你在项目里的核心贡献是什么?
  4. 为什么用 Reactor?
  5. 为什么用 Epoll ET?
  6. 为什么需要线程池?
  7. 为什么选 ONNX Runtime?
  8. 为什么不用 Python 直接部署?
  9. 模型常驻内存的收益是什么?
  10. 你的 QPS 和延迟是怎么测的?
  11. 峰值 QPS 4019 的测试口径是什么?
  12. 推理延迟 < 1ms 测的是哪一段?
  13. 为什么 mmap + writev 能提升性能?
  14. 为什么要做小根堆定时器?
  15. Slowloris 攻击是什么,你怎么缓解?
  16. 异步日志为什么必要?
  17. RAII 数据库连接池解决什么问题?
  18. 这个架构最大的瓶颈在哪里?
  19. 你遇到过最难的 bug 是什么?
  20. 如果继续优化,你下一步做什么?

七、面试前的准备建议

1. 统一口径

确保下面几件事说法一致:

  1. 架构名称和真实实现一致。
  2. 性能数字和测试口径一致。
  3. 优化点和收益描述一致。
  4. 稳定性能力和实际实现一致。

2. 每个亮点都准备三句话

建议每个亮点都按这三句来准备:

  1. 我为什么做这个。
  2. 我怎么做的。
  3. 做完后收益和代价分别是什么。

3. 每个性能数字都准备四个要素

  1. 测试环境。
  2. 测试方法。
  3. 测试对象。
  4. 测试结果。

4. 每个项目难点都准备一个闭环故事

按这个顺序讲最稳:

  1. 现象。
  2. 排查。
  3. 根因。
  4. 修复。
  5. 回归验证。

八、最实用的回答策略

如果面试官追问项目,最稳的回答方法不是一上来堆术语,而是按下面的顺序说:

  1. 先说目标。
  2. 再说方案。
  3. 再说取舍。
  4. 最后说结果。

比如回答“为什么这样设计”,可以用这个模板:

我当时主要是为了解决某个问题,所以对比了几种方案。最终选这个方案,是因为它在当前场景下能兼顾性能和实现复杂度。但它也有明显代价,比如某个瓶颈或某个限制。如果后续流量继续增长,我会优先把它优化成另一种方案。


九、最后提醒

你这段简历的风险不在于技术点少,而在于关键词比较强、数据比较具体,所以面试官会更倾向于验证你是不是“真的做过且讲得准”。

只要你把下面四件事准备扎实,这个项目就会很能打:

  1. 真实架构到底是什么。
  2. 性能数据到底怎么来的。
  3. 每个选型为什么不是别的方案。
  4. 你亲手解决过哪些问题。