3

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

长字典:256

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

小(150)条规则(如果是 3 个字节)或中等(~1K)如果是 4

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

基于软件(最近的 COTS 系统,如 E5 的 E3) 理想情况下希望使用一些 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 相媲美

4

2 回答 2

2

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

于 2012-06-25T05:42:31.807 回答
1

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

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

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

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

于 2012-05-05T07:23:02.257 回答