性能测试工具bench
This commit is contained in:
76
doc/interview_questions_aggressive_50.md
Normal file
76
doc/interview_questions_aggressive_50.md
Normal file
@@ -0,0 +1,76 @@
|
||||
# KVStore 激进版本:面试高频追问 50 题(含 Tradeoff 视角)
|
||||
|
||||
## 回答建议(统一框架)
|
||||
- 建议每题按「目标 -> 方案 -> 收益 -> 代价 -> 兜底」回答。
|
||||
- 收益常见维度:吞吐、时延、稳定性、可维护性、可扩展性。
|
||||
- 代价常见维度:实现复杂度、内存开销、排障成本、一致性窗口、开发周期。
|
||||
|
||||
## 1) 架构与边界(1-5)
|
||||
1. 你把系统拆成了哪些层(网络/协议/执行/持久化/复制)?这种分层带来的收益与额外复杂度分别是什么?
|
||||
2. 为什么默认选择 Reactor 而不是 Proactor/协程网络模型?三者在吞吐、延迟、开发复杂度上的 tradeoff 是什么?
|
||||
3. Array/RBTree/Hash 三种引擎的选型边界是什么?在不同数据分布下的性能收益与维护成本如何权衡?
|
||||
4. 你说“主路径轻量化”,具体删掉了哪些主线程工作?对 CPU 利用率与代码复杂度的 tradeoff 是什么?
|
||||
5. 如果要做多核扩展,你会优先做连接分片还是数据分片?两者在扩展性与一致性上的代价分别是什么?
|
||||
|
||||
## 2) 协议与解析(6-10)
|
||||
6. RESP 解析如何处理半包/多包/粘包?选择“严格报错”还是“尽量恢复”的 tradeoff 是什么?
|
||||
7. binary-safe 为什么必须用 slice(ptr+len)而不是 C 字符串?这对性能和代码可读性有什么影响?
|
||||
8. 你如何限制恶意请求(超大 bulk、超多参数)?安全性提升与正常流量误伤之间如何平衡?
|
||||
9. inline 与 multibulk 共存时如何处理优先级?兼容性收益与实现复杂度代价分别是什么?
|
||||
10. 新增命令时如何保证最小改动?抽象过度与快速迭代之间的 tradeoff 怎么拿捏?
|
||||
|
||||
## 3) ChainBuffer 与“零拷贝”追问(11-15)
|
||||
11. readv 直写后用户态还会发生哪些拷贝?你如何定义“零拷贝”和“低拷贝”的边界?
|
||||
12. chain_buffer_linearize 何时触发?减少复杂解析逻辑与引入额外 memcpy 的 tradeoff 是什么?
|
||||
13. 为什么要做 chunk free_list?复用内存带来的性能收益与内存峰值风险如何平衡?
|
||||
14. 大 Key(64KB)与小 Key 混跑时,chunk 策略如何避免碎片化?吞吐和内存效率谁优先?
|
||||
15. sendmsg 聚合发送遇到部分发送时如何保证一致性?更高吞吐与更复杂状态管理如何权衡?
|
||||
|
||||
## 4) 所有权移交与并发安全(16-20)
|
||||
16. “执行-落盘共享缓冲片段”如何定义所有权?减少拷贝收益与生命周期复杂度代价怎么评估?
|
||||
17. detach/release 如何避免 UAF/double free?你牺牲了哪些性能换取内存安全?
|
||||
18. 连接提前关闭时已移交数据如何回收?优先保证数据安全还是优先快速释放资源?
|
||||
19. 为什么采用“谁申请谁释放”?跨线程释放带来的便利与隐患如何取舍?
|
||||
20. 若做真正 0 拷贝落盘,你会接受哪些新增约束(引用计数/锁/回收时序)?
|
||||
|
||||
## 5) io_uring 持久化流水线(21-25)
|
||||
21. n*SPSC 相比单队列 MPSC 的收益和代价分别是什么?你为什么在当前阶段选 n*SPSC?
|
||||
22. in-flight 上限为何设为 CQ 的 80%?保守水位与峰值吞吐之间如何权衡?
|
||||
23. 队列满时背压策略是什么?“保护系统稳定”与“牺牲尾延迟”之间如何取舍?
|
||||
24. destroy_queue 用批量偷取+集中释放的动机是什么?释放抖动与主循环平滑性如何平衡?
|
||||
25. shutdown 阶段如何保证无悬挂任务?优雅退出时间与数据完整性哪个优先?
|
||||
|
||||
## 6) 快照 + 增量日志一致性(26-30)
|
||||
26. SAVE 与 oplog append 并发时一致性窗口怎么定义?强一致与吞吐的 tradeoff 是什么?
|
||||
27. 为什么恢复顺序是“先快照后 oplog”?恢复速度与恢复正确性之间如何权衡?
|
||||
28. oplog 记录命令字节流而不是逻辑变更,优势和成本分别是什么?
|
||||
29. replay 遇到坏日志时你会“失败退出”还是“跳过继续”?可用性与正确性怎么选?
|
||||
30. 你如何说明恢复后状态边界?文档化成本与实现灵活性的 tradeoff 是什么?
|
||||
|
||||
## 7) 主从同步与状态机(31-35)
|
||||
31. 请描述 SSYNC -> Snapshot -> SREADY -> Incremental 状态机,并说明每步的收益与风险。
|
||||
32. 快照传输期间新写入如何不丢?延迟增大与一致性增强之间怎么平衡?
|
||||
33. 共享内存 ring wrap marker 方案为什么可行?简单实现与健壮性之间的代价是什么?
|
||||
34. seq 不连续时你为何选择阻塞/跳过/重建?各策略的可用性与数据风险如何比较?
|
||||
35. eBPF uprobe 放在控制面而非数据面的考量是什么?观测能力与运行时开销如何权衡?
|
||||
|
||||
## 8) 内存分配器与内存池(36-40)
|
||||
36. mempool 分级(8-512B)的依据是什么?固定桶命中率与碎片风险如何平衡?
|
||||
37. 大对象回退 malloc 的原因是什么?统一路径与分层路径在复杂度上怎么取舍?
|
||||
38. mempool 如何处理空闲页回收?低延迟复用与低内存占用的 tradeoff 怎么设定?
|
||||
39. malloc/jemalloc/mypool 在你的 workload 下差异来自哪里?泛化能力与场景优化如何平衡?
|
||||
40. 线上内存峰值异常时先看哪些指标?指标全面性与观测成本如何取舍?
|
||||
|
||||
## 9) 压测方法学与结果可信度(41-45)
|
||||
41. 你如何保证 benchmark 可复现?“实验真实度”与“执行成本”之间怎么平衡?
|
||||
42. 为什么有些场景用 bench.c,有些改用 testcase mode=4?语义准确与工具统一如何取舍?
|
||||
43. QPS 统计口径怎么定义?是否包含失败请求?可比性与直观性之间如何平衡?
|
||||
44. 如何避免预热不足/缓存命中导致虚高?测试严谨性与测试周期如何平衡?
|
||||
45. 如何解释 round 间波动(CV)?追求峰值还是追求稳定性的 tradeoff 是什么?
|
||||
|
||||
## 10) 真实性、边界与演进(46-50)
|
||||
46. 简历里“零拷贝”哪些已落地,哪些是低拷贝/预案?为什么这样表述?
|
||||
47. 简历里“协同状态机”当前实现到哪一步?工程现实与对外表达如何平衡?
|
||||
48. 若给你 2 周把预案落地,你的里程碑怎么排?短期收益与长期架构如何取舍?
|
||||
49. 当前最大技术债是什么?为什么没有先修?业务推进与技术治理如何平衡?
|
||||
50. 若带 3 人继续做,下版目标与验收指标是什么?功能扩展与稳定性建设如何排序?
|
||||
Reference in New Issue
Block a user