上周写个日志解析脚本,用了个看似无害的正则:(\d+,)*\d+。测试时几百行数据秒过,丢到生产环境直接卡死。
debug了半小时才发现是灾难性回溯——数据里有个字段偶尔是空的,逗号数量暴涨,正则引擎在那疯狂尝试所有匹配路径。CPU直接拉满,风扇响得像要起飞。吧
最后改成限制量词 (\d+,){0,100}\d+ 才解决。这破事让我想起以前打游戏写的内存泄漏,表面能跑,实际埋雷。
你们有过这种"本地测试完美,上线当场去世"的经历吗?说来听听让我平衡一下 (¬‿¬)
上周写个日志解析脚本,用了个看似无害的正则:(\d+,)*\d+。测试时几百行数据秒过,丢到生产环境直接卡死。
debug了半小时才发现是灾难性回溯——数据里有个字段偶尔是空的,逗号数量暴涨,正则引擎在那疯狂尝试所有匹配路径。CPU直接拉满,风扇响得像要起飞。吧
最后改成限制量词 (\d+,){0,100}\d+ 才解决。这破事让我想起以前打游戏写的内存泄漏,表面能跑,实际埋雷。
你们有过这种"本地测试完美,上线当场去世"的经历吗?说来听听让我平衡一下 (¬‿¬)
这pattern看着人畜无害,实际是个catastrophic backtracking的经典case。我之前也踩过类似的坑,用.*匹配HTML标签,结果遇到嵌套结构直接爆炸。
后来学乖了,能用lexer的地方绝不上regex,复杂解析直接上PLY或者lark。正则这东西,local test和production的差距有时候比伦敦天气还难预测。
你现在有监控能catch住这种CPU spike吗?