【问题标题】:Multiple short rules pattern matching algorithm多短规则模式匹配算法
【发布时间】:2012-06-25 13:42:31
【问题描述】:

随着标题的推进,我们希望获得一些关于可用于具有以下约束的模式匹配的最快算法的建议:

长字典:256

短但不固定长度的规则(从 1 到 3 或最多 4 字节深度)

少量 (150) 条规则(如果 3 字节)或中等 (~1K) 如果 4

比 Snort 中使用的当前 AC-DFA 或 Snort 再次使用的 AC-DFA-Split 性能更好

基于软件(最近的 COTS 系统,如 E3 或 E5) 理想情况下希望使用一些 SIMD / SSE 的东西,因为目前它们是 128 位宽,并且在不久的将来它们将是 256 位,而 CPU 的 64 位

我们通过使用 Sigmatch 论文中显示的算法对 Snort AC 进行预过滤来开始这个项目,但遗憾的是结果并没有那么令人印象深刻(使用 GCC 编译时提高了约 12%,但使用 ICC 则没有)

之后我们尝试通过 IPP 库利用 SSE 4.2 中存在的新模式匹配功能,但根本没有性能提升(猜测直接在机器代码中执行会更好,但肯定会更复杂)

所以回到最初的想法。现在我们正在沿着 Head Body Segmentation AC 的路线工作,但我们知道除非我们替换建议的用于头部的 AC-DFA,否则很难获得改进的性能,但至少能够支持更多的规则而无需性能显着下降

我们知道使用位并行的想法会为长模式使用大量内存,但问题范围已减少到最多 3 或 4 个字节,因此使其成为可行的替代方案

我们特别找到了 Nedtries,但想知道你们的想法或是否有更好的选择

理想情况下,源代码应使用 C 语言并在开源许可下。


恕我直言,我们的想法是搜索一次移动 1 个字节的内容以处理不同的大小,但通过利用 SIMD / SSE 可能实现的大多数并行性并尝试减少分支,从而非常有效地做到这一点可能

我不知道这样做是明智的还是字节明智的


回到正确的键盘:D

本质上,大多数算法都没有正确利用当前的硬件功能或限制。它们非常缺乏缓存,非常分支,更不用说它们没有利用 COTS CPU 中现在存在的功能,这些功能允许您拥有一定程度的并行性(SIMD、SSE、...)

这正是我们正在寻找的,一种能正确考虑所有这些的算法(或现有算法的实现),其优点是不试图覆盖所有规则长度,只是较短的

例如,我看到一些关于 NFA 的论文声称,由于适当的缓存效率、增强的并行性等原因,现在它们的性能可以与内存需求少得多的 DFA 相提并论

【问题讨论】:

  • 嗨,巴克斯特,感谢您的及时回复。我会尽快阅读它们,但只是快速浏览第一个似乎目标长度不太小(在论文 m 值中),这不是我们的情况(m = 1)。这是所有开窗或跳过算法的问题,我们的最小长度值太短,扼杀了它们的超线性性能
  • 抱歉双重评论。顺便说一句,当我说超线性时,我的意思是亚线性:)
  • 您可以删除重复的评论。我理解亚线性:-}

标签: algorithm pattern-matching


【解决方案1】:

请看: http://www.slideshare.net/bouma2 对 1 和 2 字节的支持与上面 Baxter 所写的类似。尽管如此,如果您可以提供您希望在数据库中的单字节和双字节字符串的数量,以及您希望处理的流量类型(互联网、公司等),这​​将有所帮助 - 毕竟,也是许多单字节字符串可能最终会匹配每个字节。 Bouma2 的想法是允许将发生统计数据纳入预处理阶段,从而降低误报率。

【讨论】:

    【解决方案2】:

    听起来您已经在使用高性能模式匹配。除非你有一些聪明的新算法,或者可以指出数据或规则中的一些统计偏差,否则很难加速原始算法。

    您可以考虑将 pairs 个字符视为模式匹配元素。这将使状态机的分支因子变得巨大,但您可能并不关心 RAM。这可能会给您带来两倍的收益。

    当算法上的动力不足时,人们经常求助于在汇编程序中仔细的手工编码,包括巧妙地使用 SSE 指令。一个可能有助于处理发现的唯一序列的技巧是对元素进行一系列比较,并通过与/或而不是条件分支形成布尔结果,因为分支很昂贵。 SSE 说明在这里可能会有所帮助,尽管它们的对齐要求可能会迫使您将它们复制 4 或 8 次。

    如果您要搜索的字符串很长,您可能会将规则子集分配到单独的 CPU(线程)。对规则进行分区可能很棘手。

    【讨论】:

    • 嗨,我看过一些关于超现实想法的论文,但我担心有些模式只有 1 个字节长
    • 查看“1 字节”模式的一种方法是它们是 2 字节模式,其中第二个字符是通配符。
    • 嗯,没错,但也意味着进入正则表达式领域而不是精确的模式匹配。无论哪种方式,我都不需要具有巨大 ram 要求的双字节自动机对缓存效率有好处 :( 抱歉,我正在从 iPhone 上做 cmets,而且肯定看起来不是最友好的工具 :(
    猜你喜欢
    • 1970-01-01
    • 2012-07-17
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多