知道该在哪儿敲下那个「0」:Bruce Dawson 的两个性能排障回忆录
来源: randomascii.wordpress.com — 2015-01-19
概述
Bruce Dawson 这篇经典文章分享两个「敲一个 0」就修好的性能 bug。第一个发生在 Xbox 时代:一个矩阵变换函数占了 7% CPU,他用测试 harness 量化后意识到问题不在函数本身,而是数据被分配在不可缓存的 non-cacheable 内存里,读取时缓存失效拖垮一切——把分配标志里误设的缓存类型值改成 0,CPU 占用立刻掉到 0.7%。第二个是备份盘驱动把 SectorSize 设为 0xFFFFFFFF,内核误当成 4GiB 分配,周期性地把磁盘缓存清得一干二净。
核心要点
- 优化前必须测量:作者写 harness 对比新旧代码,确认新代码快约 10%
- 意外发现测试环境比游戏里快约 900%,暴露出真正的瓶颈在别处
- 根因是数据落在 non-cacheable 内存,读内存不缓存导致性能雪崩
- 把分配标志的缓存类型改回 0,该函数 CPU 占比从约 7% 降到约 0.7%
- 另一个 bug:SectorSize=0xFFFFFFFF 被内核当成 4GiB 分配,反复清空磁盘缓存
金句
My status report at the end of that week was something like "39.999 hours of investigation, 0.001 hours of coding – huge success!"
👍 0
👎 0
返回 Lobsters 首页