面向C10M时代的MiddleBox之 - 高性能四层负载均衡设备AGW

简介: 面对需求的不断提高,几年前我们还在为解决C10K 问题而努力,现在已经开始面临C10M 问题的挑战。

近年来,随着互联网在全球的快速发展和普及,网民数量的不断增加,生活中各方面对互联网依赖的增强,带来互联网访问量的爆炸性增加,催升了诸如google,facebook等巨型站点,国内也有BAT 等几家公司旗下的站点访问量跻身世界前十。

面对需求的不断提高,几年前我们还在为解决C10K 问题而努力,现在已经开始面临C10M 问题的挑战。

C10M意味着什么,一个比较流行的解释如下:

  • 承载10million个并发连接
  • 传输10million packets/秒
  • 新建1million connections/秒
  • 10 gigabits/秒

虽然对于某些具体数据,比如10G带宽传输数据是否太少,10M并发连接中有多少活跃连接等,还有待商榷,但是C10M 问题从数量上给我们描绘了一幅前景。

image.png

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核数成线性相关,需要的是一个像高速公路的架构而不是一个靠红绿灯控制的十字路口的架构。

image.png

所以面对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系统的开发与上线,可以为双十一提供有力的保障,为业务的快速增长保驾护航。

相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
5月前
|
负载均衡 应用服务中间件 Linux
Nginx系列教程(14) - LVS+KeepAlived+Nginx实现高性能负载均衡集群
Nginx系列教程(14) - LVS+KeepAlived+Nginx实现高性能负载均衡集群
175 0
|
9月前
|
缓存 负载均衡 算法
Nginx:为什么高性能?Master&worker如何配合?负载均衡算法有哪些?七层和四层负载均衡了解吗?
Nginx:为什么高性能?Master&worker如何配合?负载均衡算法有哪些?七层和四层负载均衡了解吗?
|
负载均衡
《负载均衡是如何支撑几亿手机微博用户访问的 -高性能负载均衡研发和应用实践》电子版地址
负载均衡是如何支撑几亿手机微博用户访问的 -高性能负载均衡研发和应用实践
61 0
《负载均衡是如何支撑几亿手机微博用户访问的 -高性能负载均衡研发和应用实践》电子版地址
|
负载均衡 网络协议 算法
不懂高性能的负载均衡设计?没关系,架构师带你飞
在软件系统的架构设计中,对集群的负载均衡设计是作为高性能系统优化环节中必不可少的方案。负载均衡本质上是用于将用户流量进行均衡减压的,因此在互联网的大流量项目中,其重要性不言而喻。
1295 0
|
负载均衡 前端开发 Docker
HAProxy高性能软负载均衡器
现在公司实现高可用已经成为必不可少的一环,在众多的负载均衡集群方案中,Haproxy是比较有名的一个。它可以实现TCP或Http的负载均衡。优点如下: 免费开源,与硬件负载均衡相比划算很多 最高可以维护40000~50000个并发,作为软件级别的负载均衡来说,实在强大 支持多种负载均衡算法,同时支持session保持 支持虚拟主机 拥有服务器监控页面,可以了解系统的实时运行状态 借用官网的图,图中的HA即为Haproxy软件,下面的PROXY为要代理的服务器,客户端只需要访问HA,相当于在访问PROXY。
1122 0
|
10天前
|
负载均衡 算法 应用服务中间件
面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
字节跳动面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
28 0