DPVS – 小米高性能负载均衡器

随着互联网的快速发展,负载均衡也承担着越来越重要的角色,对于小米这种快速发展中的年轻公司来说,负载均衡的稳定及高性能更是重中之重。

本文将主要介绍小米基于 DPDK 的高性能负载均衡软件 DPVS(Data Plane Virtual Server)。

负载均衡简介

负载均衡是指通过一台负载均衡器将客户端请求分散到不同的服务器上形成集群模式。早期的负载均衡主要是针对某个域名利用 DNS 轮询解析出不同的 IP 地址,以此来实现最简单的轮询式负载均衡。而目前,负载均衡主要包含四层和七层的负载均衡,四层负载均衡多用于转发,七层负载均衡主要用于代理。

小米负载均衡现状及面临的问题

小米在初期选择了开源四层负载均衡软件 LVS,前期也对 LVS 的部署模式进行了一些探索,以下是几种模式的优缺点对比

在几种模式的权衡中,我们选择了 FULLNAT + OSPF-ECMP(一致性 hash)模式部署,这种模式适合大规模的集群化部署,也能够实现单机 LVS 故障时的平滑迁移。而随着公司业务的进一步发展,LVS 集群需要频繁的进行扩容操作,服务器数量从几十台增长到了几百台,日常运维的痛点也随之而来:

  • 硬件成本居高不下
  • 集群管理难度越来越大
  • LVS 本身不再维护,故障排查困难

在这种背景下,我们自研了高性能的 DPVS 来替代现有的 LVS。

高性能 DPVS

什么是dpdk

DPDK 全称是数据平面开发套件 (Data Plane Development Kit),由 6WIND,Intel 等多家公司开发,主要基于 Linux 系统运行,用于快速数据包处理的函数库与驱动集合,可以极大提高数据处理性能和吞吐量,提高数据平面应用程序的工作效率。

2

dpvs特性

    支持 SYNPROXY

    运行在 FULLNAT 模式下且支持 TCP/UDP

    支持 OSPF、ICMP 协议

    支持 PERSISTENT

DPVS 如何实现高性能的四层 LB

避免中断

linux 系统使用中断方式来通知 CPU 来处理数据包,在大流量的场景下,中断会占据大量的时间,影响数据包的转发效率,在 DPVS 中使用了 DPDK 提供的 PMD 驱动通过轮询方式收发包,避免了在大流量场景下的中断开销。同时由于 PMD 驱动的存在,使得数据包不再经过内核协议栈,这对于提高包转发效率也至关重要。

2

Memory Pool

Memory pool 即为内存池,也被称为动态内存分配,内存池能够有效的避免内存碎片,并且 mempool 提供了一些其他可选服务,例如核本地缓存和内存对齐辅助器,内存对齐辅助器可确保对象被均匀地填充到所有 DRAM 或 DDR3 通道上(对象被均匀的放在通道上,会提高存取速度)。

3

无锁化

无锁化队列

DPDK 实现了 ring library 来提供一个无锁的、有限大小的环形 FIFO 队列,它支持多消费者或单消费者出队和多生产者或单生产者入队,同时也支持批量、爆发 (burst) 出、入队。相比于链表,每次的入队或出队只需比较 void * 大小的数据并且只需执行一次 CAS(Compare-And-Swap)操作且该操作是原子的。

session 表无锁化
对于多队列网卡,RSS 能够根据数据报的元信息将数据包分散到不同的网卡队列上,每个网卡对应的 CPU 会从网卡队列中读取数据包进行处理。但对于 FULLNAT 模式而言,其入向流量和出向流量在经过 RSS hash 后可能会分布在不同 CPU 绑定的网卡队列上,例如:入向数据包携带的元信息为(cip1,cport0,vip1,vport1),此时 RSS(cip1,cport0,vip1,vport1)= hash_value1 → cpu0;出向数据报携带的元信息为(rip1,rport1,lip1,lport1),此时 RSS(rip1,rport1,lip1,lport1)= hash_value2 → cpu1。在不同的 CPU 上处理意味着 session 表需要加锁(可能引发并发操作)。为了无锁化,需要使入向和会向数据包经过同一网卡队列即同一 CPU(同一 CPU 将串行处理两个方向的数据包,session 表无需加锁)。DPVS 的实现是利用 INTEL 网卡的对称 RSS,选择合适的 RSS_KEY 保证 RSS(rip1,rport1,lip1,lport1)→ cpu0,此时入向数据包和出向数据包都经过 cpu0 处理,而无需加锁。

cpu亲和

在 NUMA 系统下,CPU 访问它自己的本地存储器比非本地存储器更快。在分配内存时,使用 DPDK 提供的 API 可以分配某个 CPU 所在 NUMA 的内存,在初始化网卡收发队列时,同样可以控制网卡和 CPU 和亲和性。

巨页

操作系统会对物理内存分成固定大小的页,按照页来进行分配和释放,编程时只使用虚拟内存进行编程,不用关系物理内存的映射,而处理器在寄存器收到虚拟地址之后,需要根据页表把虚拟地址转换成真正的物理地址。TLB(translation lookaside buffer)是一种小、专用、快速的硬件缓冲,它只包括页表中的一小部分条目,利用虚拟地址查找物理地址时,先根据页号在 TLB 查找,如果命中则得到页内地址,访问内存;否则则在内存中的页表中得到页内地址,将其存入 TLB,访问内存。从虚拟地址到物理地址的转换逻辑我们知道:如果一个程序使用了 512 个内容页也就是 2MB(512*4KB=2048KB=2MB)大小,那么需要 512 个页表表项才能保证不会出现 TLB 不命中的情况。

通过上面的介绍,TLB 是有限的,随着程序的变大或者程序使用内存的增加,势必会增加 TLB 的使用项,最后导致 TLB 出现不命中的情况。因此,大页的优势就显现出来了。如果采用 2MB 作为分页的基本单位,那么只需要一个表项(2MB/2MB=1)就可以保证不出现 TLB 不命中的情况;对于消耗内存以 GB 为单位的大型程序,可以采用 1GB 为单位作为分页的基本单位,减少 TLB 不命中的情况。

集群化部署

图1 多运营商单一部署

图2 多运营商混合部署

对于 DPVS 部署方案我们的选型是 OSPF+ECMP(一致性 hash)。ECMP 能够将不同流的数据报转发到集群的不同节点上,同时通过 OSPF 协议的心跳包保证了在某台服务器异常时能够动态的将其剔除出集群(如图 1)。但是这种模式还存在一定的优化空间:单台服务器只能承担单个运营商的流量,而不同运营商的流量可能是不均的,也就是说有一部分服务器资源被浪费了,为了提高服务器的使用率,我们利用 linux vlan 以及 PBR 在单台服务器上起多个 OSPF 进程,每个 OSPF 进程对应一个运营商线路(如图 2),这样我们能够保证每台服务器上的流量都均分了每个运营商的流量。

性能测试

1

测试环境

CPU:Intel(R) Xeon(R) CPU E5-2620 v2 @ 2.10GHz,24 个逻辑核

内存:128G

网卡:Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection

操作系统:Ubuntu 16.04.1

内核版本:4.4.0-92-generic

dpvs 版本:v0.4

拓扑

三台测试机,dpdk03 模拟 lvs 服务器,运行 dpvs;dpdk01 模拟客户端,运行 dpdk-pktgen,往 lvs 服务器发送数据包;dpdk02 模拟 real server,运行 dpdk-pktgen,从 lvs 服务器接收数据包。所有的网卡都接在同一台交换机上。

dpvs 上配置 1 个 vip,10 个 real server IP,10 个 local address,LVS 连接数为 1000。

性能指标

丢包率:

负载为 10000Mbit/s 的情况下,60s 内没有转发的包占收到的包的百分比。

吞吐量:

不丢包的情况下,每秒转发包的数量(单位 Mpps)。

测试方法

测试包大小为 64、128、256、512、1024 字节

测试包为 UDP 包

DPVS配置

使用 16 个逻辑核作为 worker,对应 16 个网卡队列,2 个逻辑核作为发送 IO 核,3 个逻辑核作为接收 IO 核,根据 vip、local address、real server 数量及连接数,dpvs 配置如下:

内存池大小:

         – mbuf 2560000

         – svc 1024

         – rs 1024

         – laddr 1024

         – conn 2048

哈希表大小:

         – conn 2^11

         – svc 2^8

         – rs 2^4

– worker CPU 数量:16

– tx CPU 数量:2

– rx CPU 数量:3

– ring_sizes:1024, 1024, 1024, 1024

– burst_sizes:(144,144),(144,144),(144,144)

测试流程

    1)在 dpdk03 上启动 dpvs,按照上述配置要求,准备测试环境

    2)在 dpdk02 上启动 dpdk-pktgen,监控网卡,准备收包

    3)在 client 上启动 dpdk-pktgen,按要求设置,准备发包

    4)开始发包,收集测试结果

测试结果

丢包率:发包速率为 10000Mbit/s 时,60s 内发送包数量、数据量与接受包数量、数据量:

发包速率为 10000Mbit/s 时,丢包率与包大小的关系:

吞吐量:万兆网卡上,不同大小的数据包吞吐量的理论值与实际值

总结

本文介绍了负载均衡的相关知识,以及小米对于高性能 4 层负载均衡的实践 —DPVS。DPVS 开发利用了 DPDK,充分发挥和利用 DPDK 的优势,并且结合一些内部生产环境需求进行了一些优化和调整。并且介绍了一种 DPVS 的部署方式,希望能够对大家有所帮助。

小米运维

和我们一起,成为更酷的运维工程师

Image placeholder
winnke
未设置
  34人点赞

没有讨论,发表一下自己的看法吧

推荐文章
Talos网卡负载优化:基于个性化一致性哈希的负载均衡

本文将详细介绍基于个性化一致性哈希的流量均衡方法。 目录  业务增长带来的流量均衡需求基于一致性哈希的调度策略个性化一致性哈希的负载均衡流量均衡在Talos中的实现前文《小米消息队列的实践》介绍了小米

Nginx 负载均衡

负载均衡策略 1.轮询(默认):每一个来自网络中的请求,轮流分配给内部的服务器,从1到N然后重新开始。此种负载均衡算法适合服务器组内部的服务器都具有相同的配置并且平均服务请求相对均衡的情况。 2.加

Go语言高级编程_6.5 负载均衡

6.5负载均衡 本节将会讨论常见的分布式系统负载均衡手段。 6.5.1常见的负载均衡思路 如果我们不考虑均衡的话,现在有n个服务节点,我们完成业务流程只需要从这n个中挑出其中的一个。有几种思路: 按顺

Ambassador 0.52 新特性:会话亲和性、负载均衡控制、gRPC-Web

本文由公众号EAWorld翻译发表,转载需注明出处。作者:RichardLi 译者:白小白 原文:http://t.cn/E6cZoyG现时的云原生应用由多种异构的服务或者微服务组成,服务间、服务与客

Elasticsearch负载均衡节点

Elasticsearch负载均衡节点elasticSearch的配置文件中有2个参数:node.master和node.data。这两个参数搭配使用时,能够帮助提供服务器性能。组合一:该node服务

PHP 高性能 Excel 扩展 1.2.7 发布

为什么使用php-ext-excel-export xlswriter是一个PHPC扩展,可用于在Excel2007+XLSX文件中写入多个工作表的文本,数字,公式和超链接。 它支持以下功能: 100

为高性能优化 PHP-FPM

PHP是无处不在的,可以说是互联网Web应用上使用最广泛的语言。 然而,它的高性能并不为人所知,尤其是在涉及到高并发系统时。这就是为什么对于这样特殊的用例,正在被Node(是的,我知道,它不是一种语

Kafka 优秀的架构设计!它的高性能是如何保证的?

应大部分的小伙伴的要求,今天这篇咱们用大白话带你认识Kafka。Kafka 基础消息系统的作用大部分小伙伴应该都清楚,这里用机油装箱举个例子:所以消息系统就是如上图我们所说的仓库,能在中间过程作为缓存

探秘K1 Power:如何打造一台坚若磐石的高性能小型机?

熟悉服务器领域的朋友,必然对浪潮K1小型机或多或少有所了解。在当年关键业务主机市场寡头垄断的格局下,浪潮400多位工程师耗费4年时间,于2010年成功研制出了K1小型机,为市场注入一股新的血液。使得中

NVIDIA再放“大招”,拓宽高性能计算边界

11月19日,在丹佛2019全球超级计算大会(SC19)上,NVIDIA创始人兼首席执行官黄仁勋进行了主题演讲,并宣布了NVIDIA在高性能计算领域的最新动态与成果。这些成果表明,NVIDIA正在将自

基于JS的高性能Flutter动态化框架MXFlutter

导语:18年10月份,手机QQ看点团队尝试使用Flutter,做为iOS开发,一接触到Flutter就马上感受到,Flutter虽然强大,但不能像RN一样动态化是阻碍我们使用她的唯一障碍了。看Goog

京东云和英特尔“花样”升级高性能云硬盘

数据,已成为这个时代的基调。当我们因为数据带来新的机遇而喜不自胜的时候,也常常会不可避免地遇到一些随之而来的困扰。与如何更好地使用数据相比,数据的存储和管理是更棘手的问题所在。面对海量数据爆炸式的增长

干货 | 揭秘京东数科强一致、高性能的分布式事务中间件JDTX

导读:在分布式数据库、云原生数据库、NewSQL等名词在数据库领域层出不穷的当今,变革——在这个相对稳定的领域已愈加不可避免。相比于完全革新,渐进式增强的方案在拥有厚重沉淀的行业则更受青睐。同所有分布

干货丨爱奇艺CDN IPv6系统配置

1.背景  IPv6是“InternetProtocolVersion6”(互联网协议第6版)的缩写,是互联网工程任务组(IETF)设计的用于替代IPv4的下一代IP协议。IPv4地址资源紧缺严重制约

物联网可以推动IPv6的部署吗?

IPv6具有IPv4所缺乏的特性,这使得它在物联网部署方面具有优势,例如支持大型物联网网络、有助于延长物联网设备的电池寿命,减少其管理和维护负担。那么物联网能否有助于推动企业网络中的IPv6应用?IP

BootstrapVue快速入门

Vue.js是一个流行的JavaScript库,用于在短时间内开发原型。这包括用户界面、前端应用、静态网页和本机移动应用。它以易用的语法和简单的数据绑定功能而闻名。最近,Vue.js生态系统发布了一个

Reactor系列(十九)StepVerifier测试

java#reactor#flux#StepVerifier测试视频讲解:https://www.bilibili.com/vide...FluxMonoTestCase.javapackagecom

AWS vs K8s 是新时代的 Windows vs Linux?

作者:IanMiell是开源程序员、演讲师、作家和博客写手以前……如果你与我一样,年过四十,又在IT行业工作,恐怕还记得每个人使用Windows,一小群但越来越多的人在业余时间埋头编译Linux的年代

最新安卓零日漏洞被曝出,或影响谷歌、华为和小米等品牌手机

近日,据外媒BleepingComputer报道,谷歌威胁分析团队(TAG)称,一个最新的安卓0day漏洞或被用于攻击谷歌Pixel、华为、小米和三星以及OPPO等智能手机。 该漏洞是由谷歌Pro

小米办公Wi-Fi选型最看重什么?

以“体验智能边缘,尽享无限商机”为主题的Aruba中国第一届合作伙伴大会暨InstantOn新品发布会在京举行。会上,Aruba分享了最新的技术和产品信息,以及行业解决方案。小米作为Aruba成功案例

两个月三项成果,对标谷歌!独家对话小米AutoML团队,如何让模型搜索更公平

大数据文摘出品作者:曹培信机器学习自动化(AutoML)正在引领机器学习的下一个时代,而要想让机器自己学会“炼丹”,其中最关键的步骤就是,找到最合适的算法模型,也即自动化神经架构搜索(NeuralAr

万亿级消息背后: 小米消息队列的实践

目录业务背景架构与关键问题性能与资源优化平台化效率小米消息中间件的规划与愿景前文《消息队列价值思考》讲述了消息中间件在企业IT架构中的重要价值,本文将呈现这些价值在落地小米业务过程中的遇到的问题和实践

Kubernetes监控在小米的落地

本文介绍了高可用、持久存储、可动态调整的Kubernetes监控方案的实现过程。小米的弹性调度平台(Ocean)以及容器平台主要基于开源容器自动化管理平台kubernetes(简称k8s)来提供服务,

小米Kylin平滑迁移HBase实践

根据美团等其他公司在Kylin社区的公开分享资料,跨HBase集群升级方案需要在新集群重新构建历史的Cube,或者有一段时间的服务停止。小米在Kylin生产环境的跨HBase集群迁移中实现了无中断的平

wordpress无法加载css

wordpress无法加载css出现这种情况是因为wordpress安装时用http://localhost访问来安装,局域网访问时,加载css的路径不对,所以会出现css无法加载,只显示文字。解决方