近年来,随着互联网在全球的快速发展和普及,网民数量的不断增加,生活中各方面对互联网依赖的增强,带来互联网访问量的爆炸性增加,催升了诸如google,facebook等巨型站点,国内也有BAT 等几家公司旗下的站点访问量跻身世界前十。
面对需求的不断提高,几年前我们还在为解决C10K 问题而努力,现在已经开始面临C10M 问题的挑战。
C10M意味着什么,一个比较流行的解释如下:
- 承载10million个并发连接
- 传输10million packets/秒
- 新建1million connections/秒
- 10 gigabits/秒
虽然对于某些具体数据,比如10G带宽传输数据是否太少,10M并发连接中有多少活跃连接等,还有待商榷,但是C10M 问题从数量上给我们描绘了一幅前景。
MiddleBox(acomputer networking device that transforms, inspects, filters, or otherwisemanipulates traffic for purposes,参见http://en.wikipedia.org/wiki/Middlebox)作为网络的边界和入口,是流量汇聚和集中的关键位置,会首先面临C10M 问题的考验。MiddleBox在阿里巴巴集团中广泛使用,主要包括4/7层负载均衡设备,4层代理网关等,本文主要分享一些在4层负载均衡设备方面的一些工作和思考。
1、无锁实现:数据平面的无锁化,是通过上述的多队列功能实现了,每个core维护自己的session表,网卡将I/O流分给多个CPU内核做并行处理,无需争用锁。控制平面的无锁化,因为对vip表修改等控制操作在整个周期中占比很小,我们没有必要因为管控命令而对数据平面的操作加锁,我们使用定期poll的方式执行控制命令,这样可以实现控制平面的无锁化。第2点和第3点,解决了C10M多核可扩展性问题。
2、Hugepage:因为网关设备的专用性,我们利用HugePage功能,为AGW分配很多1GB的大页面专门使用,这样可以减少TLBMiss情况,并减少处理TLBMiss所需的内存操作,同时对于频繁分配的数据结构,采用mempool机制。
3、核心数据支持NUMA:现今服务器体系大都是numa架构,处理器能快速的访问在同一个numa单元的内存。在AGW系统设计中,我们将频繁使用的核心数据结构(如session表)分布在各个core对应numa节点的内存中。同时,在多网卡的环境中,网卡绑定pci也会对应到不同的numa节点上,我们多核多队列的架构也利用了这一特性,将同一numa节点的网卡队列和CPU对应起来,避免数据的跨numa节点访问,这样可以缓解总线瓶颈和高速cache争用,提升系统性能。第4,5点解决了C10M的内存可扩展性问题。
在C10K 时代,催生了epoll等技术的出现。对于4层负载均衡技术来说,主要是基于内核netfilter框架来处理网络流量,这种机制在C10M 的情况下有些力不从心,造成性能瓶颈的原因主要有以下几点:
1、网卡中断:linux系统内核通过软中断的方式来中断工作,处理网络数据包。当网卡接收的流量不断增加,系统会处理中断的时间也会随之增长,中断严重影响了服务性能。
2、linux网络协议栈:传统的包处理会经过linux网络协议栈,linux网络协议栈的实现复杂,因此我们需要一个收包,发包的快速路径,更直接的面对数据包。
3、多核的扩展性:面对的cpu核数越来越多,传统的linux内核,协议栈实现并没有很好的支持多核,大量的数据共享使我们不得不使用大量的锁来控制并发,我们期望系统的性能同cpu核数成线性相关,需要的是一个像高速公路的架构而不是一个靠红绿灯控制的十字路口的架构。
所以面对C10M,我们需要解决的问题是主要有几个方面:
- 包的可扩展性
- 多核的可扩展性
- 内存的可扩展性
针对这几个问题,阿里技术保障部的网络产品团队自主研发出产品AGW(AliGateWay),完全在应用层实现,抛弃了传统Linux内核netfilter网络包处理框架,实现了fullnat+synproxy的四层负载功能。AGW系统设计的关键技术主要有以下几点:
1、用户态网卡驱动:利用linuxuio,实现用户态网卡驱动,绕过linux协议栈,使应用程序处理数据包的路径更加直接,不让操作系统来处理数据包,解决了C10M的包可扩展性问题。
2、多核多队列:AGW系统为均衡功能分配专用的CPUcore, 与内核隔离,将CPU和处理线程绑定,poll方式收发包,这样可以避免网卡中断操作以及操作系统进行线程切换所带来的上下文切换开销。另外,网卡支持多队列和RSS,我们利用这一功能,将数据包根据CPU核数进行分流,每个core维护自己的session表,处理一个队列接收到的数据包。
3、无锁实现:数据平面的无锁化,是通过上述的多队列功能实现了,每个core维护自己的session表,网卡将I/O流分给多个CPU内核做并行处理,无需争用锁。控制平面的无锁化,因为对vip表修改等控制操作在整个周期中占比很小,我们没有必要因为管控命令而对数据平面的操作加锁,我们使用定期poll的方式执行控制命令,这样可以实现控制平面的无锁化。第2点和第3点,解决了C10M多核可扩展性问题。
4、Hugepage:因为网关设备的专用性,我们利用HugePage功能,为AGW分配很多1GB的大页面专门使用,这样可以减少TLBMiss情况,并减少处理TLBMiss所需的内存操作,同时对于频繁分配的数据结构,采用mempool机制。
5、核心数据支持NUMA:现今服务器体系大都是numa架构,处理器能快速的访问在同一个numa单元的内存。在AGW系统设计中,我们将频繁使用的核心数据结构(如session表)分布在各个core对应numa节点的内存中。同时,在多网卡的环境中,网卡绑定pci也会对应到不同的numa节点上,我们多核多队列的架构也利用了这一特性,将同一numa节点的网卡队列和CPU对应起来,避免数据的跨numa节点访问,这样可以缓解总线瓶颈和高速cache争用,提升系统性能。第4,5点解决了C10M的内存可扩展性问题。
在阿里巴巴集团,业务和规模驱动技术不断向前,技术保障部网络产品研发团队长期致力于高性能Middle Box的研发,不断满足公司高并发访问的业务需求。AGW系统的开发与上线,可以为双十一提供有力的保障,为业务的快速增长保驾护航。