无锁结构在国产防火墙上的应用与研究*
2020-12-23原蓓蓓
李 雷,焦 哲,原蓓蓓,艾 磊
(1.中国电子科技集团公司第三十研究所,四川 成都 610041;2.成都卫士通信息产业股份有限公司,四川 成都 610041)
0 引言
随着网络技术的不断发展,传统的基于内核的报文收发方式造成大量的性能开销,网络传输速率很难得到提高。为了实现网络的高速传输,Intel 设计了高性能的数据包处理框架 DPDK(Data Plane Development Kit)。近年来,通过不断地对dpdk 技术进行改造,在国产申威处理器平台上已实现了网络数据的高速转发[1]。
随着国产多核处理器的普遍使用,高并发数据结构变得越来越重要[2]。为了充分发挥多核处理器的性能,软件人员必须编写可扩展的并发程序才能使其在多核环境下具有高的性能。并发程序编写存在一个重要问题,就是多个线程/进程对共享资源的同步访问问题。网络安全设备多核并行协议栈运行过程中,不可避免地要在核间共享数据,比如:ddos 统计表,nat 转换表,aspf 表等。保证数据一致性的通用方法是加锁,但锁机制的引入带来了数据处理的串行化,大大降低了安全设备的网络转发性能,同时又增加死锁和数据竞争的风险。近年来,工程人员开始对无锁(lockfree)数据结构进行研究,使用CAS(compare and swap)细粒度同步原语的无锁数据结构能够摆脱死锁和数据竞争问题,更重要的是它对多核是可扩展的[3]。
针对以上问题与现状,结合对国产处理器平台的研究与应用[4],本文提出了一种无锁结构在国产防火墙上的应用方案。在并行处理的协议栈间使用无锁结构进行数据共享,减少数据竞争时的等待时间,从而提高网络转发速率。实验表明,该方案在小包(64 字节)数据转发时,吞吐率性能比常规方法提升23.68%。
1 关键技术
程序方法的调用到执行完成需要时间,从某个方法调用事件的开始到执行结束过程中,当这个方法调用事件开始而执行未结束,称其调用是未决的。并发程序方法的执行可以相互重叠,而单线程程序方法的执行总是顺序无重叠的。在一个程序中,当方法的未决调用能够延迟其他方法的未决调用时,我们称其是阻塞的;相反,当方法的未决调用不会延迟其他方法的未决调用时,我们称其是非阻塞的。在一个程序中,一个方法的无限次调用能够在有限次内完成,我们称其是无锁(lockfree)的;一个方法的每次调用都能在有限次内完成,我们称其是无等待(waitfree)的;一个方法调用存在着关于它的操作次数的确定界限,我们称其是有界无等待(waitfree bounded)的[3]。无锁结构实现的方法也是无锁的,其实现的基础是CAS,且大多数国产处理器已硬件实现。CAS 可以保证需要更新的地址在没有被其他线程或进程改动过的情况下安全地写入新数据,保证读写操作的一致性,不出现脏数据。而这个地址内存空间也是我们通常在锁机制中需要加锁重点保护的。
2 国产防火墙无锁结构的实现
2.1 国产防火墙简介
基于dpdk 技术的国产防火墙架构如图1 所示。
图1 国产防火墙架构
该防火墙在国产化多核处理器核和国产化多队列网卡的基础上,对dpdk 技术进行改造,构建一个高速的二层转发平台。在dpdk 驱动上构建一个多核并行运行的用户态协议栈,各协议栈与处理器核绑定且独立运行,并行协议栈间通过共享数据进行传递信息,运用无锁结构及其操作进行数据同步,保证一致性。
2.2 无锁结构的实现方法
(1)初始化
设备上电启动过程中,由协议栈0 所运行的线程或进程在dpdk 大页中使用rte_memzone_reserve方法申请共享内存,并进行初始化。
(2)共享数据的获取
协议栈并行运行时,各个协议栈使用rte_memzone_lookup 方法获取共享内存,再根据其具体使用的数据结构方法获取所需的数据。比如:hash表可通过hash 值获取。
(3)共享数据的更新
各个协议栈在获取共享内存后采用无锁机制对共享数据进行操作。无锁化机制的核心原语为CAS,其在大多数国产处理器中已经实现。比如龙芯平台的CAS 原语实现方法如下:
在应用程序的线程或进程中,对64 位共享数据的更新方法如下:
其中A 为被更新的数据,A*为更新后的数据。
2.3 性能分析
相比于加锁的方式,采用硬件原语CAS 实现的无锁数据结构在进行操作时,将缩短数据竞争时的等待时间,从而提高网络转发速率。在程序运行的整个周期中,数据竞争等待时间减少,则并行可执行部分将变大。著名的阿姆达尔定律指出:数据结构并发程序的优化取决于并发可执行部分占整个程序的比例和并发线程数,其表达式如下[5]:
其中,S为程序加速比,n为并发线程数,P为并发可执行部分。当并发线程数n一定时,并发可执行部分P越大,则程序加速比S越大。
无锁结构降低了数据竞争的等待时间,则增大了程序并发可执行部分,进而提高了程序加速比。程序加速比的提高,使并行协议栈的网络处理能力增强。
3 实验与分析
3.1 实验环境
实验硬件平台采用8 核龙芯3A3000 处理器,主频1399MHz,PCIE 接口为4 口、8 队列SF400T千兆网卡,中标麒麟操作系统。
3.2 吞吐率测试
采用spirent testcenter 仪表进行rfc2544 吞吐率测试。多核并行协议栈环境下,核间数据竞争,将有锁机制与无锁机制下的吞吐率进行对比。实验采用dpdk 提供的共享内存rte_memzone,dpdk 读写锁rte_rwlock_write_lock,cas64 原语及无锁方法。实验分别测试udp 包长为64 字节、128 字节、256 字节、512 字节、1024 字节、1280 字节、1518 字节时的网络吞吐率,其仪表连接关系如图2 所示。
图2 实验仪表连接示意图
Spirent TestCenter 的PORT1 和PORT2 通过直连网线与国产防火墙的ETH1 和ETH2 相连。
实验采用统计UDP 目的端口包数的方法使共享数据产生竞争,处理器核数为8,端口数为4 且仪表使用递增的方式发包,则理论上同一时刻有2个线程或进程竞争一个数据,此时测得结果如表1所示:
表1 吞吐率结果表
防火墙在全速转发的情况下,无锁结构同步机制比加锁结构同步机制的性能在包长64 字节时提升23.68%,包长128 字节时提升22.61%。包长为256、512、1024、1280、1518 时,无锁结构的同步机制与加锁结构的同步机制转发速率均达到限速。
3.3 数据竞争时延测试
按照图2 仪表连接方法,仪表以1Gb/s 速度发送500000 包的同时,防火墙程序记录下并发不可执行部分(更新共享数据)所消耗的时间。程序使用CPU 的运行周期作为时间单位进行统计,将加锁和无锁环境下更新共享数据所消耗的时间进行对比,其测试结果如表2 所示。
表2 时间消耗表
从实验结果可以看出,无锁环境更新共享数据所消耗的时间短于有锁环境,则根据阿姆达尔定律可知,多核并行协议栈并行可执行部分大,程序加速比高,有利于网络转发性能的提高。
4 结语
本文在国产化背景下,提出了一种无锁结构在国产防火墙上的应用方案。实验表明,其提高了防火墙在实际工作中的网络吞吐率,且为后续构建国产化高速网络安全平台提供指导。尤其是无锁化共享数据结构的应用进一步提高了防火墙这类安全设备的实际网络吞吐率。但是,本方案在设计和实验过程中并未针对ABA 问题进行分析,这是后续工作中需要研究的要点之一。