【发布时间】:2013-08-26 20:10:50
【问题描述】:
我正在使用 mod 安全规则 https://github.com/SpiderLabs/owasp-modsecurity-crs 来清理用户输入数据。我在将用户输入与 mod 安全规则正则表达式匹配时面临 cpu 启动和延迟。总体而言,它包含 500 多个正则表达式来检查不同类型的攻击(xss、badrobots、generic 和 sql)。对于每个请求,我都会检查所有参数并检查所有这 500 个正则表达式。我正在使用Matcher.find
来检查参数。在这种情况下,一些参数属于无限循环,我使用以下技术解决了这个问题。
Cancelling a long running regex match?。
清理用户请求大约花费了大约 500 毫秒,cpu % 迅速上升。我使用 Visualvm.java.net 和我的测试套件运行器进行了分析。
CPU 配置文件输出
请帮我降低 CPU 使用率和平均负载?
【问题讨论】:
-
根据截图
checkPattern
被调用了212148825次,总计6100774ms,每次调用0.02ms。我没有看到那里的性能问题 - 并且绝对没有证明每次调用 500 毫秒。 -
如果有特定的模式导致更长的延迟,您应该识别它们并将它们包含在您的问题中。
-
@Holger 花费的时间不是问题。我只关心负载和 CPU 使用率。我想处理并行处理参数,如果我这样做了,我的平均负载达到 > 4。我使用
jstack -l
进行线程转储并使用thread -H -b -p <process id>
找到最大消耗线程并将 id 转换为十六进制代码,线程消耗高 cpu (50 %) 在 Matcher.find 处处于可运行状态。 -
@bharathi:这仍然是同一种问题。很可能很多模式都很便宜,但其中一些很昂贵。您必须确定昂贵的那些以集中精力优化这些特定模式。顺便说一句,
Matcher.find
调用了由于分析器的默认过滤规则而未显示的其他方法。更改这些规则以允许查看 JDK 的方法可以揭示匹配的大部分时间(意味着 cpu 负载)在哪里花费。
标签: java regex performance