Pflua是一款高性能的包过滤工具,用Lua编写;实现了libpcap的包过滤语言,我们简称为pflang。不同于其它包过滤工具,Pflua使用了libpcap库来编译pflang,编译后的字节码可运行于内核。该项目托管在GitHub上。
为什么选择Lua?
1. 以LuaJIT作为编译器。LuaJIT是一款适时制追踪编译器。追踪在包过滤场合是非常恰当的战略,对比其它任何静态的编译技术能获得更好的性能。
2. 使用了Snabb Switch 。SnabbSwith是一个开源的网络软件,主要是为了帮助用户便捷地创建和部署大规模化网络,SnabbSwith也是采用Lua编写的。与SnabbSwith的整合,能构成一个高性能的过滤操作环境。
实现
Pflua把pflang语句编译成Lua源码,在运行时能被优化为本地机器码。在Pflua中有两种编译管道。
1. 自定义分析,这是一种非常传统的做法,能生成pflang过滤语句的高级AST。例如,如果我们采用该编译管道来编译Pflang语句ip或ip6,得到的Lua源码如下:
2. Berkeley 包过滤虚拟机。Pflua能够载入libpcap库,并且利用它来把pflang语句编译成BPF(Berkeley Packet Filter)。不论你是使用原生的BPF还是pflang语句,BPF都会直接被编译成Lua源码。如果我们采用该编译管道来编译Pflang语句ip或ip6,得到的Lua源码如下:
性能比较
经与LuaJIT的强强联合,Pflua的表现令人满意:
这是一个摹拟的两机之间ping泛滥测试,图中不同pflang执行方式的说明如下:
图中显示了Pflua能以接近测试机内存带宽极值100G/S速度来执行pflang包过滤操作,表明它不俗的包处理能力。
此外,我们还尝试从wingolog.org上进行包过滤测试,wingolog.org大部分时间是作为Web服务器来运作的,测试情况如上图所示。Pflua在这里再次击败了其它对手。
写在最后
如果想更多了解Pflua,不妨选择以下任一方式:有关Snabb中运用Pflua的查询,请访问论坛:snabb-devel。更多内容,请点击:wingolog。