随着标题的推进,我们希望获得一些关于可用于模式匹配的最快算法的建议,并具有以下约束:
长字典: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 相媲美