鲲鹏社区首页
中文
注册
鲲鹏平台使能Hyperscan及其优化

鲲鹏平台使能Hyperscan及其优化

安装部署DPI

发表于 2025/06/24

0

作者:龚晓婷

1 背景介绍

Hyperscan是一款高性能的开源正则表达式匹配库,在支持PCRE的大部分语法的前提下,Hyperscan增加了特定的语法和工作模式来保证其在真实网络场景下的实用性。Hyperscan针对不同使用场景设计了多种高效匹配算法,以及结合SIMD指令,实现了正则表达式的高性能匹配。Hyperscan适用于部署在诸如DPI/IPS/IDS/FW等场景中。在鲲鹏平台上,我们将Hyperscan进行了基于neon指令集改造,以适配aarch64架构,同时进行了算法上的进一步优化。

2 环境配置

项目 版本说明说明
CPUKunpeng 920鲲鹏920系列处理器
OSOpenEuler 22.xNA
GCC10.3.0NA
CMake2.8.11及以上必选。
Ragel6.9及以上必选:编译依赖Ragel
Boost1.57及以上必选:编译依赖Boost头文件。
SQLiteSQLite 3可选:Hyperscan tools测试工具hsbench编译依赖SQLite 3。

3 源码获取

通过下面命令获取Hyperscan aarch64版本代码。
git clone https://gitee.com/kunpengcompute/hyperscan.git
鲲鹏平台的优化可从以下链接获取:
https://www.hikunpeng.com/developer/boostkit/library/detail?subtab=Hyperscan

4 源码构建

安装Ragel

编译Hyperscan依赖于Ragel,本文中编译环境采用Ragel 6.10版本。
1. 获取Ragel 6.10源码包。复制
wget http://www.colm.net/files/ragel/ragel-6.10.tar.gz
2. 解压源码包
tar -xzf ragel-6.10.tar.gz
3. 进入Ragel源码目录
cd ./ragel-6.10
4. 编译并安装Ragel
./configure
make
make install
5. 通过检查Ragel版本验证Ragel是否安装成功
ragel -v

配置Boost

编译Hyperscan依赖于1.57版本以上的Boost,本文编译环境采用的是Boost 1.87版本
1. 获取Boost 1.87源码包。
wget https://archives.boost.io/release/1.87.0/source/boost_1_87_0.tar.gz
2. 解压源码。
tar -zxf boost_1_87_0.tar.gz

下载PCRE

Hyperscan tools工具hscollider的编译依赖PCRE 8.41及以上版本,本文采用PCRE 8.43版本。
1. 获取PCRE 8.43源码。
wget https://sourceforge.net/projects/pcre/files/pcre/8.43/pcre-8.43.tar.gz
2. 解压源码 。
tar -zxf pcre-8.43.tar.gz

安装鲲鹏优化包KHSEL

KHSEL是Hyperscan增强软件包,可以提升Hyperscan的scan性能。可从如下链接获取安装包https://www.hikunpeng.com/developer/boostkit/library/detail?subtab=Hyperscan

编译源码

1. 进入Hyperscan源码目录。
cd hyperscan-v5.4.2.aarch64
2. 创建“build”目录。
mkdir -p build
3. 进入创建好的“build”目录。
cd build
4. 执行编译。
编译支持release模式和debug模式,默认为release模式。编译后会生成静态库和动态库,默认生成静态库。
o 编译源码静态库。编译选项默认为release模式编译静态库。
cmake ..
make -j32
o 编译源码动态库。在执行编译命令中增加生成动态库编译选项:-DBUILD_SHARED_LIBS=ON。
cmake .. -DBUILD_SHARED_LIBS=ON
o 编译源码debug模式。在执行编译命令中增加生成动态库编译选项:-DCMAKE_BUILD_TYPE=DEBUG。
cmake .. -DCMAKE_BUILD_TYPE=DEBUG

5 测试工具

hsbench是Hyperscan官方提供的性能Benchmark工具,通过hsbench的测试结果也能够对比使用KHSEL库前后的性能差异。
hsbench有两个必需输入,规则库及语料库。模式库格式:ID:/regex/flags。语料库则必须以语料库数据库的形式提供:这是一种简单的SQLite数据库格式,旨在便于控制语料库如何分成块和流。
1. 进入创建好的“build“目录。
cd build
2. 获取hsbench规则集和输入数据,并解压到“build/hsbench-samples“目录。
获取地址:https://cdrdv2.intel.com/v1/dl/getContent/739375
3. 运行hsbench
./bin/hsbench -e ./hsbench-samples/pcre/snort_literals -c ./hsbench-samples/corpora/gutenberg.db -N -n1

6 工作原理

下面的递归定义反映了Hyperscan看待正则表达式的视角:
regex -> regex str FA | FA | str
这里的str是指可以表示为构成普通字符串的连续字符序列,FA(有限自动机)是表达式中被str部分所隔开的部分。FA里一定存在一个或多个带有正则语法含义的元字符,例如^、$、*、?等。这类组件在实现上表现为有限状态自动机,包括NFA和DFA,以及其他特殊结构,统称为Hyperscan的“引擎”。
Hyperscan的关键思想是将每个正则表达式模式分解为一组不相交的字符串组件和FA组件,并匹配每个组件,直到找到完全匹配为止。从实现的角度看,str对应字符串匹配,FA对应自动机匹配。Hyperscan以自动机理论为基础,其工作流程主要分成两个部分:编译期(compiletime)和运行期(run-time)。

6.1 编译器

Hyperscan 自带C++编写的正则表达式编译器。它将正则表达式作为输入,针对不同的IA平台,用户定义的模式及特殊语法,经过复杂的图分析及优化过程,生成对应的数据库。另外,生成的数据库可以被序列化后保存在内存中,以供运行期提取使用。
编译函数接口:
# include <hs.h>
hs_compile()
hs_compile_multi()
hs_compile_ext_multi()

6.2 运行期

用户需要预先分配一段内存来存储临时匹配状态信息,之后利用编译生成的数据库调用Hyperscan内部的匹配引擎(NFA, DFA等)来对输入进行模式匹配。Hyperscan在引擎中使用鲲鹏处理器所具有的SIMD指令进行加速。同时,用户可以通过回调函数来自定义匹配发生后采取的行为。由于生成的数据库是只读的,用户可以在多个CPU核或多线程场景下共享数据库来提升匹配扩展性。
扫描函数接口:
hs_scan()
hs_scan_vector()
hs_scan_stream()


本页内容