适用对象:围绕你简历中的这段项目描述进行面试准备。
项目描述:
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 模式数据库连接池,确保高并发场景下的系统稳定与数据安全。
面试官一般不会一上来就抠代码,更常见的是先确认三件事:
- 这个项目你是不是真的主导做过。
- 简历里的架构词和性能数字是不是说得准。
- 你是否理解每个技术选型背后的原因和代价。
所以第一轮高频追问,通常会围绕下面四类:
- 这个项目到底解决什么问题。
- 为什么这么设计,而不是别的方案。
- 这些性能指标是怎么测出来的。
- 如果继续放大流量,瓶颈会先出在哪里。
- 这个项目解决的核心问题是什么?
- 为什么它叫边缘 AI 推理网关,而不是普通 WebServer?
- 它适合落地在哪些业务场景?
- 和普通推理服务相比,它的核心价值是什么?
- 你做这个项目时最看重的目标是吞吐、延迟,还是工程可落地性?
- 为什么选 Reactor,而不是 Proactor?
- 为什么选 Epoll,而不是 select 或 poll?
- 为什么选 ET,而不是 LT?
- 你说的是主从 Reactor,这里的主和从分别负责什么?
- 线程池在你的架构中承担什么职责?
- 为什么不用协程?
- 网络层和 AI 推理解耦,具体解耦了什么?
- 如果要水平扩展,这个架构怎么扩?
- 你简历里写的 3.2万+ QPS 是怎么测出来的?
- 压测时的机器配置、核数、内存、系统环境是什么?
- 500 并发下 3.2万+ QPS,对应的平均延迟和 P99 是多少?
- 这个 QPS 是静态文件、推理接口,还是混合流量?
- 推理延迟 < 1ms 是平均值、P50,还是单次最佳值?
- 推理 QPS 3.2万+ 和静态接口 QPS 的差异来自哪里?
- 这些指标测的是端到端,还是只测模型本身?
- 你有没有做过多轮回归测试,还是只测过一次?
- 为什么选 ONNX Runtime,而不是 Python + PyTorch 服务化?
- 为什么不用 TensorRT?
- 为什么模型要常驻内存?
- 模型单例的收益和代价是什么?
- 你说规避 Python GIL 性能瓶颈,这句话具体是什么意思?
- 如果模型更大、QPS 更高,现在的推理链路最大瓶颈是什么?
- 推理过程的线程安全是怎么保证的?
- 如果以后要上 GPU,这套方案要怎么改?
- 为什么 mmap + writev 能提升性能?
- 它具体减少了哪些拷贝和哪些系统调用?
- 为什么不是直接用 sendfile?
- 你这里的零拷贝是不是严格意义上的完全零拷贝?
- 这种优化更适合哪些响应场景?
- 如果是超大文件,这个方案还有没有风险?
- 为什么要做小根堆定时器?
- 为什么说它是 O(log n)?
- 它和时间轮相比有什么优缺点?
- Slowloris 攻击是什么?
- 你的方案为什么能缓解 Slowloris?
- 超时时间是怎么定的?
- 如果大量慢连接长期占坑,除了定时器还能怎么防?
- 为什么日志要异步写?
- 双缓冲异步日志的核心思想是什么?
- 同步日志在高并发下的问题是什么?
- RAII 数据库连接池解决了什么问题?
- 为什么数据库连接不能每次请求现建现关?
- 连接池大小怎么定?
- 如果连接池耗尽了怎么办?
- 这个项目里你真正独立完成的部分有哪些?
- 你遇到过最难的一次排障是什么?
- 你做过最有效的一次优化是什么?
- 如果让你重新做一遍,你会重构哪一块?
- 这个项目当前最大的瓶颈和最大的工程风险分别是什么?
- 你从这个项目里学到的最重要的工程经验是什么?
- select、poll、epoll 的区别是什么?
- LT 和 ET 的区别是什么?
- 为什么 ET 必须配合非阻塞 I/O?
- 什么是惊群?
- 什么是半包和粘包?
- TCP 三次握手和四次挥手分别是什么?
- TIME_WAIT 为什么存在?
- keep-alive 的作用是什么?
- 为什么高并发服务端通常要用非阻塞 I/O?
- 用户态和内核态切换的成本来自哪里?
- 线程和进程的区别是什么?
- 线程池为什么能提升性能?
- 锁的开销主要体现在哪?
- mmap 的原理是什么?
- 什么情况下会发生缺页?
- 信号是什么?
- SIGPIPE 为什么危险?
- RAII 是什么?
- shared_ptr 和 unique_ptr 的区别是什么?
- 右值引用和 move 的意义是什么?
- condition_variable 的典型使用场景是什么?
- mutex 和 atomic 分别适合什么场景?
- unordered_map 的底层原理是什么?
- vector 为什么会扩容?
- 多线程下常见的竞态条件有哪些?
- 为什么数据库连接要池化?
- 数据库连接池有哪些核心参数?
- 如果连接池耗尽怎么办?
- MySQL 事务四大特性是什么?
- 索引为什么常用 B+ 树?
这是最容易被追问的词。
面试官通常会继续问:
- 主 Reactor 线程做什么?
- 从 Reactor 线程做什么?
- accept 在哪一层处理?
- 一个连接从建立到关闭经过哪些线程?
如果你的真实实现更接近单 Reactor + 线程池,就不要把架构词写得过大。
这个数字必须有完整口径。
你至少要准备清楚:
- 压测工具是什么。
- 压测命令是什么。
- 压的是哪个接口。
- 机器配置是什么。
- 是否本机压本机。
- 平均延迟和 P99 是多少。
- 是否做过多轮测试。
这句话也很容易被追问口径。
面试官一般会问:
- 是纯模型推理耗时,还是 HTTP 端到端耗时?
- 是平均值、P50、还是最优值?
- 输入数据规模是什么?
- 是否包含预处理和后处理?
这句话可以说,但不要说绝对。
更稳的表达方式是:
- 在高并发、CPU 密集型推理场景下,Python 服务化会受到解释器开销、运行时调度和 GIL 相关限制影响;采用 C++ + ONNX Runtime 后,推理链路更轻、更稳定,吞吐更高。
这句话最好说成“有效缓解”,更稳。
因为严格意义上的防御 Slowloris,通常还会配合:
- 请求头超时。
- 最低接收速率限制。
- 单 IP 连接数限制。
- 反向代理或网关层限流。
如果简历写了这句话,面试官会默认你能讲清:
- 为什么要双缓冲。
- 为什么不是简单阻塞队列。
- 刷盘时机怎么控制。
- 高并发下如何避免业务线程被日志拖慢。
很多问题表面上在问技术,实际上在确认这四点:
- 你是不是自己做过,而不是照着教程搭出来的。
- 你是不是知道为什么这么设计。
- 你是不是知道这个方案的缺点和边界。
- 你是不是能把性能数据讲清楚。
因此,最容易出现的追问模板基本都是下面这些:
- 为什么这么做,不选别的方案?
- 这个指标是怎么测出来的?
- 这个方案的缺点是什么?
- 如果流量继续翻十倍,哪里会先出问题?
- 你做错过什么,后来怎么修的?
这 20 个问题建议优先准备到可以口述 1 分钟。
- 这个项目解决什么业务问题?
- 为什么要做成边缘 AI 推理网关?
- 你在项目里的核心贡献是什么?
- 为什么用 Reactor?
- 为什么用 Epoll ET?
- 为什么需要线程池?
- 为什么选 ONNX Runtime?
- 为什么不用 Python 直接部署?
- 模型常驻内存的收益是什么?
- 你的 QPS 和延迟是怎么测的?
- 峰值 QPS 4019 的测试口径是什么?
- 推理延迟 < 1ms 测的是哪一段?
- 为什么 mmap + writev 能提升性能?
- 为什么要做小根堆定时器?
- Slowloris 攻击是什么,你怎么缓解?
- 异步日志为什么必要?
- RAII 数据库连接池解决什么问题?
- 这个架构最大的瓶颈在哪里?
- 你遇到过最难的 bug 是什么?
- 如果继续优化,你下一步做什么?
确保下面几件事说法一致:
- 架构名称和真实实现一致。
- 性能数字和测试口径一致。
- 优化点和收益描述一致。
- 稳定性能力和实际实现一致。
建议每个亮点都按这三句来准备:
- 我为什么做这个。
- 我怎么做的。
- 做完后收益和代价分别是什么。
- 测试环境。
- 测试方法。
- 测试对象。
- 测试结果。
按这个顺序讲最稳:
- 现象。
- 排查。
- 根因。
- 修复。
- 回归验证。
如果面试官追问项目,最稳的回答方法不是一上来堆术语,而是按下面的顺序说:
- 先说目标。
- 再说方案。
- 再说取舍。
- 最后说结果。
比如回答“为什么这样设计”,可以用这个模板:
我当时主要是为了解决某个问题,所以对比了几种方案。最终选这个方案,是因为它在当前场景下能兼顾性能和实现复杂度。但它也有明显代价,比如某个瓶颈或某个限制。如果后续流量继续增长,我会优先把它优化成另一种方案。
你这段简历的风险不在于技术点少,而在于关键词比较强、数据比较具体,所以面试官会更倾向于验证你是不是“真的做过且讲得准”。
只要你把下面四件事准备扎实,这个项目就会很能打:
- 真实架构到底是什么。
- 性能数据到底怎么来的。
- 每个选型为什么不是别的方案。
- 你亲手解决过哪些问题。