这里有一篇文章详细的描述了一次正则回溯导致 CPU 100% 的发现和解决过程,原文比较长,我之前也在 OpenResty 的开发中遇到过两次类似的问题。
这里简单归纳下,你就可以不用花费时间去了解背景了:
大部分开发语言的正则引擎是用基于回溯的 NFA 来实现(而不是基于 Thompson's NFA);
如果回溯次数过多,就会导致灾难性回溯,CPU 100%;
需要用 gdb 分析 dump,或者 systemtap 分析线上环境来定位;
这种问题很难在代码上线前发现,需要逐个 review 正则表达式;
站在开发的角度,修复完有问题的正则表达式,就告一段落了。最多再加上一个保险机制,限制下回溯的次数,比如在 OpenResty 中这样设置:
lua_regex_match_limit 100000;
这样即使出现灾难性回溯,也会被限制住,不会跑满 CPU。
嗯,看上去已经很完美了吗?让我们来跳出开发的层面,用不同的维度来看待这个问题。
Read full article from 第二层思考
No comments:
Post a Comment