Hsbench的Hyperscan性能分析

Hyperscan是Intel的一个正则表达式匹配引擎,其重点是高性能,大规模匹配和流模式操作。本文主要介绍Hyperscan的性能测试工具,并包含了可以在您自己的机器上重现的一些测试用例。

简介

Hyperscan 4.4及更高版本包含了标准的性能测试工具hsbench,旨在提供一种简便的方法来测量在特定的规则集和语料库下的Hyperscan性能。
Hsbench工具已在Hyperscan Developer Reference 中有所介绍。本文旨在阐明如何使用Hsbench在一系列不同的应用场景中测试Hyperscan的性能。
为此,我们提供了许多样本测试规则集和语料库作为示例。
值得注意的是Hyperscan的性能取决于许多不同的因素:

  • 1、规则的数量和组成:这将会影响Hyperscan在构建编译数据库时选择的实现策略。
  • 2、扫描的数据:例如,性能可能受到数据中的匹配率或近似匹配率的影响。
  • 3、规则的标志:某些规则标志(如SOM或UTF8模式)会对性能产生影响。
  • 4、扫描模式:Hyperscan在块模式下需要扫描的数据量是已知的,可以进行相应的性能优化,而在流模式下则不适用。 类似地,模式需要在流边界时对匹配信息进行保存,而在块模式下不需要。
  • 5、硬件平台:在平台支持的情况下,Hyperscan受益于对指令集的使用,例如Intel®AVX2和 Intel®BMI2 指令集。

因此,Hyperscan的性能或资源需求(数据库大小,流状态大小等)没有一个标准的度量。重要的是它如何在您的应用程序中被使用,如何使用您的规则集对相应数据进行匹配。我们推荐用户在自己的使用场景下进行Hyperscan的性能测试。
希望以下示例对您有所帮助。

规则集

我们在这篇文章中对三个样本规则集进行测试。这三个模式集可以从Hyperscan网站下载。

snort_literals

这是从Snort 3网络入侵检测系统自带的样本规则集中提取的一组3316个纯字符串规则,可在https://github.com/snortadmin/snort3查看。其中一些标记有HS_FLAG_CASELESS标志,以便它们不区分大小写进行匹配,并且都使用HS_FLAG_SINGLEMATCH来限制每个模式的每次扫描只匹配一次。

snort_pcres

这是从包含Snort 3的样本规则集中提取的一组847个正则表达式集,取自针对HTTP流量的规则。值得注意的是,这些只是从规则的“pcre:”选项中提取的规则,并且Hyperscan的匹配在语义上和Snort当中的匹配会有所不同。这个样本旨在展示Hyperscan在同一时间匹配一个正则表达式集的能力。

teakettle_2500

这是由一个脚本生成的2500个合成的有限复杂度规则集,它们主要由字典单词组成,并在单词间插入重复的字符集和分隔符。
这些模式集的格式是一个文本文件,每行都有一个ID和表达式。 例如,teakettle_2500集的前几行是):

语料库

Hyperscan网站上提供了两个hsbench语料库文件作为扫描的数据样本:

gutenberg.db

来自Gutenberg的英文文本集合,我们将其分成多条大小为10240字节数据流,每条流包含多个2048字节的数据块。

alexa200.db

通过浏览Alexa上列出的常用网站以PCAP形式捕获的大规模流量。该文件包含130957个块(对应于原始报文),且仅包括发送至或来自80端口的流量。
这些文件是SQLite数据库文件,旨在方便地将任意输入转化为hsbench语料库。其格式在Hyperscan Developer Reference中已进行描述,且Hyperscan包含一些样本脚本,用于从常用输入构建语料库,例如文本文件和PCAP文件。

使用HSBENCH进行性能测试

Hsbench可以用给定的一个规则文件和一个语料库来执行单线程测试,如下所示:

上述-N参数指示hsbench以块模式扫描;默认情况下,hsbench将使用流模式。
默认情况下,语料库会被扫描二十次,并且根据执行所有二十次扫描所花费的总时间和扫描的总字节数来计算总体性能。我们可以使用-n参数更改重复次数,如果指定了–per-scan参数,则将显示每次扫描所需的时间。
对于之前未接触Hyperscan API的用户,下面是以上输出字段的简要介绍:

  • Hyperscan info: Hyperscan的版本信息,使用的平台指令集(本示例中为“AVX2”)和扫描模式(“BLOCK”)。
  • Expression count: 提供文件中的规则数量。
  • Bytecode size: 规则集对应的Hyperscan数据库的大小。这是一个编译产生的数据结构,用于在扫描期间匹配完整的模式集。数据库一旦构建就是不可变的,可以在扫描线程之间共享。
  • Database CRC: 数据库的CRC32信息。
  • Scratch size: 根据数据库扫描数据所需的可变“scratch”空间的大小。每个扫描的上下文都需要其自身的“scratch”空间。
  • Compile time: 从规则集编译生成Hyperscan数据库所需的时间。
  • Peak heap usage: 编译过程的最高内存使用率。

Hsbench输出中的其余字段是扫描性能统计信息。

性能测试示例

在以下例子中,测试数据是在以4.2 GHz运行的Intel Core i7-6700K平台上使用Hsbench和Hyperscan4.4.1获得的。
在这些命令中,我们使用Linux taskset工具将进程固定到系统的第一个CPU核上。

块模式下针对HTTP流量对Snort纯字符串进行匹配

块模式下针对HTTP流量对Snort PCRE规则进行匹配

流模式下针对Gutenberg文本对Teakettle合成规则进行匹配

下表显示了具体测试结果。

注意:这些结果仅显示Hyperscan在单核上运行情况。 要在多核上运行测试,可以使用-T参数来创建多个线程:例如,-T 0,1,2,3将运行四个扫描线程,每个线程独占一核。
利用Hyperscan网站提供的规则集和语料库,您可以使用上面的 hsbench命令在自己的机器上重现这些性能结果。

相关链接

Hyperscan Developer Reference:
http://01org.github.io/hyperscan/dev-reference/
Hyperscan网站:
https://01.org/downloads/sample-data-hyperscan-hsbench-performance-measurement
Gutenberg:
https://www.gutenberg.org/
Alexa:
http://www.alexa.com/
模式集和语料库:
https://01.org/downloads/sample-data-hyperscan-hsbench-performance-measurement

原文:DPDK开源社区

发表评论

电子邮件地址不会被公开。 必填项已用*标注