天天看点

高性能四层负载均衡设备AGW

        转载请注明出处:http://blog.csdn.net/hliyuxin/article/details/40626769

随着站点访问量的急剧增长,服务器集群的规模成倍增长,同时也要求传统的LVS集群的服务器数量成倍增长。传统LVS的负载均衡功能现已很难满足大型公司集群系统的需求,怎样开发出一个高性能、处理超大规模流量的四层负载均衡网关产品,成为整个集团的一个巨大的技术挑战。

传统的LVS 基于linux内核的NetFilter框架实现,实验测试linux 2.6内核netfilter框架,在没有其它功能损耗的情况下,最高能转发600万的小包,也就是说synflood的天花板值600万,按照一次http访问交互最少10个包,每秒http新建的极限值就是60万。造成LVS性能瓶颈的原因主要有以下几点:

1. 网卡中断:linux系统内核通过软中断的方式来中断工作,处理网络数据包。当网卡接收的流量不断增加,系统会处理中断的时间也会随之增长,中断严重影响了服务性能。

2. 上下文切换:LVS工作在系统内核态,每个线程在CPU上运行很短的一段时间,这种线程调度会触发上下文切换,保存线程上下文信息,以及之后再恢复这些状态信息。这些切换操作会花费系统很多时钟,在专用的负载设备上应该尽量避免这种上下文切换。

3. 大量锁的设计: 在LVS中设计了大量自旋锁和原子变量,如LVS中的session表有ip_vs_conn_tab_lock,当访问某个VIP的包进入LVS,都会触发查表操作,查表之前需要锁住该表,在高网络流量的环境下,这种原子操作带来的性能下降很大。

4. 路由开销:现在的LVS经过netfiler的一些hook点,IN和OUT的包都会经过IP层的路由表查找操作,这一流程在现在集团的网络布署环境中是不需要的,增加了性能损耗。

        阿里技术保障部的网络产品团队自主研发出产品AGW,AGW基于DPDK开源软件完全在应用层实现,抛弃了原有的Linux内核netfilter框架,实现了和原LVS类似的fullnat+synproxy的四层负载功能。AGW系统设计的关键技术主要有以下几点:

1.  用户态网卡驱动:利用linux ui,实现用户态网卡驱动,绕过linux协议栈,使应用程序处理数据包的路径更加直接,解决了C10M的包的可扩展性问题。

2. 多核多队列,AGW系统为均衡功能分配专用的CPU core, 与内核隔离,将CPU和处理线程绑定,poll方式收发包,这样可以避免网卡中断操作以及操作系统进行线程切换所带来的上下文切换开销。另外,intel 82599网卡支持多队列和接收端缩放功能(RSS),我们利用这一功能,将数据包根据CPU核数进行分流,每个core维护自己的session表,处理一个队列接收到的数据包。为了保证fullnat模式下同一个session的包,IN和OUT都能到同一个core上,我们利用了网卡的flow director功能,将local address均分绑定到特定的处理core上。

高性能四层负载均衡设备AGW

3. 无锁实现:数据平面的无锁化,是通过上述的多队列功能实现了,每个core维护自己的session 表,网卡将I/O流分给多个CPU内核做并行处理,无需争用锁。控制平面的无锁化,因为对vip表修改等控制操作在整个周期中占比很小,我们没有必要因为管控命令而对数据平面的操作加锁,我们使用DPDK的Ring来收发消息,定期poll的方式执行控制命令,这样可以实现控制平面的无锁化,2,3解决了C10M多核可扩展性问题。

4. 超大页面:因为网关设备的专用性,我们利用DPDK中HugePage功能,为AGW分配很多1GB的大页面专门使用,这样可以减少TLB Miss情况,并减少处理TLB Miss所需的内存操作。

5.  核心数据支持NUMA:现今服务器体系大都是numa架构,处理器能快速的访问在同一个numa单元的内存。在AGW系统设计中,我们将频繁使用的核心数据结构(如session表)分布在各个core对应numa节点的内存中。同时,在多网卡的环境中,网卡绑定pci也会对应到不同的numa节点上,我们多核多队列的架构也利用了这一特性,将同一numa节点的网卡队列和CPU对应起来,避免数据的跨numa节点访问,这样可以 缓解总线瓶颈和高速cache争用,提升系统性能,4,5解决了C10M的内存可扩展性问题。

高性能四层负载均衡设备AGW

在我们的大流量性能测试中。

      AGW系统使用普通服务器平台,9个工作core来处理vip的tcp数据包,性能测试结果显示:(1)单机synflood能打满2个万兆网卡2800 pps,单台服务器能抵御20Gb的synflood攻击(2)每秒接收180w的http新建连接,转发处理接近2000w pps的小包。

继续阅读