社区文章|MOSN 构建 Subset 优化思路分享

MOSN:基于延迟负载均衡算法实现更快速、更稳定的分布式网络 总结起来,MOSN作为一个基于延迟负载均衡算法的分布式网络代理,通过优化请求分发和选择最佳服务器的过程,实现了更快速、更稳定的分布式网络服务。MOSN利用延迟负载均衡算法实现了更快速的请求分发,并且通过一系列的优化措施,保证了系统的稳定性和可靠性。连接池中保存着与后端服务器的连接,当有新的请求到达时,MOSN会从连接池中选择一个可用的连接,并将请求发送到对应的服务器。通过上述的延迟负载均衡算法的实现,MOSN能够快速、准确地选择最佳的服务器,并将请求发送到该服务器,从而提高了系统的处理速度和性能。 阅读详情

图片

文|李旭东(花名:向旭 )

蚂蚁集团技术专家

蚂蚁中间件研发,专注于 SOFARegistry 及其周边基础设施的开发与优化

本文 2098 字 阅读 8 分钟

|前言|

MOSN 使用了 Subset 算法作为其标签匹配路由负载均衡的方式。本文主要介绍 Subset 的原理,包括了在超大规模集群下 MOSN 的 Subset 所遇到的一些性能瓶颈与采用的优化算法。

首先,为什么要优化 Subset 呢?

总体而言,性能瓶颈往往会由于集群规模的增大逐渐暴露出来。在蚂蚁的超大规模的集群上,注册中心推送地址列表会对应用造成一定的开销。

在我所参与过的某一次大规模压测中,核心应用的机器数目非常庞大,当进行发布或者运维的时候,它的地址列表会被推送给所有调用它的应用。

而 MOSN 会接收这份地址列表重新构建自己的路由。当地址列表非常庞大的时候,MOSN 更新 cluster 的性能瓶颈逐渐地暴露出来,出现了较高的 CPU 毛刺,内存在短时间内出现了上涨,gc 频率也大幅度增加。

通过下方的火焰图,我们可以看到这次压测期间对某应用的 MOSN 的 pprof:

- Alloc:

image.png

- CPU:

图片

从 pprof 可以看到,无论是 CPU 还是 alloc 的开销, 构建 SubsetLoadBalancer 都明显占了大头,所以优化这部分的构建是亟待去做的一件事。

最终通过探索优化,我们可以减少 SubsetLoadBalancer 构建过程中 95% 的 CPU 开销和 75% 的 alloc 开销。

下面让我们一起回顾下本次优化的过程与思路。

PART. 1–Subset 基本原理介绍

在一个集群里,通常机器会有不同的标签,那么如何将一个请求路由到指定标签的一组机器呢?

MOSN 的做法是把一个服务下的机器按照机标签组合进行预先分组,形成多个子集。在请求的时候,根据请求中的 metadata 信息可以快速查询到这个请求对应应该匹配到的子集。

如下图所示,可以看到当前有 4 个节点:

图片

标签匹配规则会根据 zone 、mosn_aig 、mosn_version 这 3 个字段进行匹配路由,根据这 3 个 key 的排序进行组合得到以下匹配路径:

图片

相对应的匹配树如下:

图片

假设需要访问 {zone: zone1, mosn_aig: aig1},那么经过排序后查找顺序为 mosn_aig:aig1 -> zone:zone1,查找到 [h1, h2]。

以上就是 Subset 的基本原理介绍。

PART. 2–MOSN 对 Subset 的构建

首先需要输入的参数有两个:

- 带标签的机器列表 hosts,比如 [h1, h2, h3, h4];

- 用于匹配的 subSetKeys, 如下图:

图片

接着我们先带上思路,然后阅读源码来看一下 MOSN 的 SubsetLoadBalancer 是如何构建这棵树的。

核心思路如下:

- 遍历每一个 host 的 labels 和 subSetKeys 递归去创建一棵树;

- 对于树的每一个节点,都会遍历一次 hosts 列表,过滤出匹配这个节点的 kvs 的 subHosts,每个节点创建一个子 load balancer。

我们来看源码图:

图片

整体的构建复杂度是 O (MNK) (M: Subset 树节点个数,N: Hosts 个数, K: 匹配的 Keys)

PART. 3–构建性能瓶颈分析

通过对生产的 profile 分析,我们发现 SubsetLoadBalancer 的 createSubsets 在 CPU 和 alloc 的火焰图中的占比都较高。所以下面我们开始编写 benchmark,来优化这一部分的性能。

我们的输入参数为:

- subSetKeys:

图片

- 8000 个 hosts (每个 hosts 都有 4 个 label, 每个 label 对应 3 种 value) :

图片

接着,我们来看 CPU 和 alloc_space 的占用情况。

- CPU:

图片

- alloc_space:

图片

从上面两张火焰图中,我们可以看出 HostMatches 和 setFinalHost 占用了较多的 CPU_time  和 alloc_space。我们首先来看下 HostMatches:

图片

图片

它的作用是判断一个 host 是不是完全匹配给定的键值对,且判断这个 host 是否匹配这个匹配树节点。

它的开销主要在于执行次数过多:treeNodes * len(hosts) ,所以在集群变大时,这边的运行开销会大幅度上升。

然后我们再来看一下 setFinalHost:

图片

图片

他的主要逻辑是按 IP 进行去重,同时会附带 copy。如果我们在 SubsetLoadBalancer 的顶层进行去重,那么它的任意 Subset 都不需要再次去重。因此,这边可以把它改成不去重。

PART. 4–倒排索引优化构建

在 HostMatches 的这么多次匹配中,实际上有很多的重复操作,比如对 host label 中某个 kv 判断 equals,在构建过程中重复的次数相当之多。

所以优化的思路可以基于避免这部分重复的开销,从预先构建倒排索引出发。具体步骤展开如下:

1. 输入两项参数:

- subSetKeys:

图片

- hosts:

图片

2. 遍历一次 hosts,针对每个 kv 我们用 bitmap 构建倒排索引:

图片

3. 根据 subSetKeys 和倒排索引中的 kvs,构建出匹配树,因为索引中是去重的与 hosts 数目无关,这个操作开销占比很低;

4. 对于树的每个节点,利用倒排索引中的 bitmap 做交集快速得到匹配全部 kv 的 hosts 的索引 bitmap;

5. 使用 bitmap 中存储的 index 从 hosts 中取出对应 subHosts 构建子 load balancer,同时注意此处不需要使用 setFinalHosts 进行去重。

基于上述思路过程开发新的 Subset preIndex 构建算法,可以在 MOSN 的对应 Pull Request 页面查看详情:

https://github.com/mosn/mosn/pull/2010

再分享下添加 benchmark 进行测试的地址:

https://github.com/mosn/mosn/blob/b0da8a69137cea3a60cdc6dfc0784d29c4c2e25a/pkg/upstream/cluster/subset_loadbalancer_test.go#L891

图片

图片

可以看到相对之前的构建方式,构建速度快了 20 倍,alloc_space 减小了 75% 。同时,alloc 次数出现了少量的上升,这是因为需要额外的构建一次倒排索引所致。

下面观察一下 gc:

图片

我们可以发现,相较于之前的构建方式,运行期间的内存更小了,而且 CPU 回收的内存也变少了,同时 gc 并行扫描的时长小幅上涨,STW 时间变的更短。

最后,测试一下在不同 hosts 数目下的优化程度,可以看到在 hosts 数目较多时 (>100) , 新的构建算法都会大幅的优于旧的构建算法。

图片

PART. 5–总结

我们看到在大规模生产环境中,一些以前不会注意到的性能瓶颈往往会暴露出来,但通过压测,我们能提前发现并优化这些问题。

目前,该构建算法已经合并到 MOSN master,作为 MOSN 默认的 SubsetLoadBalancer 构建方式。

在这次优化过程中,我们用到了一些常见的优化手段,如:倒排索引、bitmap。不难看出,这些优化手段虽然基础常见, 但也取得了理想的优化效果,希望能对大家有所帮助。

了解更多

MOSN Star 一下✨:

https://github.com/mosn/mosn

本周推荐阅读

MOSN 文档使用指南

图片

MOSN 1.0 发布,开启新架构演进

图片

MOSN Contributor 采访|开源可以是做力所能及的事

图片

【2022 开源之夏】SOFAStack 和 MOSN 社区项目中选结果

图片

图片

深入了解MOSN云原生网络数据平面源码 v0.21.0 本文还有配套的精品资源,点击获取 简介:MOSN(Mesh Over Service Network)是一个面向服务网格的数据平面,用于提供灵活的服务间通信解决方案。本源码解析文档详细介绍了v0.21.0版本的MOSN,它是一个高度可扩展、高性能的云原生网络代理。文档涵盖了MOSN的设计理念、核心架构、服务发现机制、负载均衡策略、安全特性,以及如何阅读源码和参与社区贡献。此... 阅读详情

相关推荐

QT 面试题汇总

一、讲述Qt信号槽机制与优势与不足 优点:①类型安全。需要关联的信号槽的签名必须是等同的。即信号的参数类型和参数个数同接受该信号的槽的参数类型和参数个数相同。若信号和槽签名不一致,编译器会报错。 ②松散耦合。信号和槽机制减弱了Qt对象的耦合度。激发信号的Qt对象无需知道是那个对象的那个信号槽接收它发出的信号,它只需在适当的时间发送适当的信号即可,而不需要关心是否被接受和那个对象接受了。Qt就保证了适当的槽得到了调用,即使关联的对象在运行时被删除。程序也不会奔溃。 ...

编程菜鸟 4万+

从一次 RPC 请求,探索 MOSN 的工作流程

王程铭(呈铭)蚂蚁集团技术工程师,Apache Committer专注 RPC、Service Mesh 和云原生等领域。本文7368 字,预计阅读15 分钟前言MOSN(Modular Open Smart Network)是一款主要使用 Go 语言开发的云原生网络代理平台,由蚂蚁集团开源并经过了双十一大促几十万容器的生产级验证。MOSN 为服务提供多协议、模块化、智能化、安全的代理...

金融级分布式架构 1763

Excel中如何快速地将成绩按比例来划分为等级?

问题介绍: 记录说明:班级里共有40个人,按最终总平均成绩从高到低划分等级,A等级30%,B等级50%,C等级20%。 部分成绩如下表所示: Excel中相关函数介绍: IF函数 IF函数有三个参数,语法如下: =IF(条件判断, 结果为真返回值, 结果为假返回值) 第一参数是条件判断,比如说“A1=">37”这种,判断TRUE或FALSE。如果判断是TRUE(结果为真)那么IF函数返回值是第二参数,否则(结果为假)返回第三参数。 如果省略了第三参数,则当结果为假时,会返回FALSE。 如果公式

Wendy的博客 1万+

MOSN 反向通道详解

目前例如 SuperEdge、Yurttunnel 等业界知名云边协同开源框架,对于云边通信的实现方案都是基于反向通道。本文将着重介绍 MOSN 之上的反向通道运作流程和原理。

金融级分布式架构 586

“傻瓜”stata入门——熟悉操作界面

小白开始学习stata和matlab,零基础上手

nnpersistent的博客 4457

【Linux命令大全】006.网络通讯之write命令(实操篇)

Linux write命令摘要 write是Linux系统中用于用户间实时通讯的命令工具,允许向其他登录用户的终端发送消息。主要功能包括: 基本使用:通过write username向指定用户发送消息,Ctrl+D结束输入 终端指定:当用户登录多个终端时,可用write username tty指定目标终端 实用技巧: 使用who查看在线用户 通过管道发送单行消息:echo "内容" | write user 支持多行消息发送和简单聊天会话。

yuhuasheng1997的博客 214

MOSN 多协议扩展开发实践

Service Mesh 是当今云原生的关键部分,蚂蚁已经在生产环境完成了大规模的落地,但是业界整体 Service Mesh 改造程度还不高。其中平稳的进行 Mesh 化改造是可以对已上...

金融级分布式架构 462

固定效应模型-以stata为工具

固定效应模型(Fixed Effects Model)是一种面板数据分析方法,通过引入个体固定效应来控制个体间的异质性,并更准确地估计解释变量对因变量的影响。它在许多经济、社会科学和健康研究中被广泛应用。

侯小啾技术博客 2839

SOFA Weekly | 开源人—于雨、本周 QA、本周 Contributor

SOFA WEEKLY | 每周精选筛选每周精华问答,同步开源进展欢迎留言互动~SOFAStack(ScalableOpenFinancialArchitecture Stack)是蚂蚁集团自主研发的金融级云原生架构,包含了构建金融级云原生架构所需的各个组件,包括微服务研发框架,RPC 框架,服务注册中心,分布式定时任务,限流/熔断框架,动态配置推送,分布式链路...

金融级分布式架构 268

计算机组成原理(第三版)唐朔飞-第八章CPU的结构和功能-课后习题

8.1CPU有哪些功能?画出其结构框图并简要说明每个部件的作用。

weixin_45735391的博客 6万+

【毕设实战】基于YOLOv8的HRSC2016船舶智能检测系统开发全指南(含可视化UI界面,打造海事领域高分毕设)

亲爱的同学,通过这篇教程,你已经掌握了“基于YOLOv8的HRSC2016微小船只检测系统”从数据集处理、模型训练到Tkinter界面开发的全流程。这个课题既贴合“海事智能化”的产业战略,又涵盖了“目标检测、深度学习、界面开发”等多个毕设评分点,非常适合作为计算机或海事工程专业的毕业设计。在实践中,你可能会遇到“海面背景复杂导致船只漏检”“微小船只识别精度不足”“UI与模型推理同步卡顿”等挑战——别担心,这些都是技术成长的必经之路。

know_F0727的博客 130

社区文章|MOSN 路由框架详解

文|曹先胜e签宝中间件开发负责 e签宝中间件开发和维护包括 MQ、网关、微服务、数据同步、全链路压测等本文4827字 阅读7分钟01贡献者前言MOSN「 开源就是在使用中,共同...

金融级分布式架构 1212

Android 13.0 Launcher3中去掉Hotseat功能实现

在13.0系统产品定制化开发中,在Launcher3的定制化需求也是特别多的,由产品是小屏幕的产品,所以产品需求Launcher3 页面布局的原因,要求Launcher3 需要去掉Hotseat 不显示Hotseat下面几个图标,而做满屏app的显示,从而达到美观的效果,下面就来分析去掉Hotseat从而实现这个功能

安卓兼职framework和app工程师的博客 1327

云原生网络代理 MOSN 的进化之路

导读:本文是 8 月 15 号在深圳 GIAC 全球互联网架构大会,云原生专场的现场分享实录。王发康(毅松)蚂蚁集团可信原生技术部 技术专家,专注于高性能网络服务器研发,是 MOSN、T...

weixin_45583158的博客 820

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Mosn环境搭建(二)MOSN 开发环境 搭建

MOSN Linux环境开发环境搭建安装Golang环境安装Goland开发工具下载mosn源码新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 安装Golang环境 安装Goland开发工具 下载mosn源码 你好! 这是

ruanjiangjx的博客 1172

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

MOSN 1.0 发布,开启新架构演进

MOSN 是一款主要使用 Go 语言开发的云原生网络代理平台,由蚂蚁集团开源,经过双 11 大促几十万容器的生产级验证。 经过 4 年的蓬勃发展,在 11 位 commiter,100 多个 contributor 和整个社区的共同努力下,经历 27 个小版本的迭代,MOSN 1.0 版本正式发布了。

蚂蚁金服技术团队 590

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

MOSN(Modular Open Smart Network)-06-MOSN 多协议机制解析

云原生网络代理 MOSN 定位是一个全栈的网络代理,支持包括网络接入层(Ingress)、API Gateway、Service Mesh 等场景,目前在蚂蚁集团内部的核心业务集群已经实现全面落地,并经受了 2019 年双十一大促的考验。今天要向大家介绍的是云原生网络代理 MOSN 核心特性之一的多协议扩展机制,目前已经支持了包括 SOFABolt、Dubbo、TARS 等多个协议的快速接入。

1157

云原生网络代理 MOSN 平滑升级原理解析 | 开源

MOSN 是一款使用 Go 语言开发的网络代理软件,作为云原生的网络数据平面,旨在为服务提供多协议,模块化,智能化,安全的代理能力。MOSN 是 Modular Open Smart N...

金融级分布式架构 1304

mosn基于延迟负载均衡算法 -- 走得更快,期待走得更稳

一、前言这篇文章主要是介绍mosn在v1.5.0中新引入的基于延迟的负载均衡算法。首先会对分布式系统中延迟出现的原因进行剖析,之后介绍mosn都通过哪些方法来降低延迟,最后构建来与生产环境性能分布相近的测试用例来对算法进行验证。在开始聊基于延迟的负载均衡算法之前,先介绍下什么是负载均衡什么是负载均衡Wikipedia中Load Balancing (Computing)词条是这样介绍负载均衡的...

京东科技开发者 275

MOSN(Modular Open Smart Network)-07-Sidecar 模式

将应用程序的功能划分为单独的进程可以被视为Sidecar 模式。如图所示,Sidecar 模式允许您在应用程序旁边添加更多功能,而无需额外第三方组件配置或修改应用程序代码。就像连接了 Sidecar 的三轮摩托车一样,在软件架构中, Sidecar 连接到父应用并且为其添加扩展或者增强功能。Sidecar 应用与主应用程序松散耦合。它可以屏蔽不同编程语言的差异,统一实现微服务的可观察性、监控、日志记录、配置、断路器等功能。

1358

MOSN(Modular Open Smart Network)-08-MOSN 扩展机制解析

MOSN 扩展能力和扩展机制的详细介绍;结合示例对 MOSN 的 Filter 扩展机制与插件扩展机制进行详细介绍;MOSN 后续扩展能力规划与展望;欢迎大家有兴趣一起共建 MOSN。在本次演讲中涉及到的示例就在我们的 Github 的目录下,大家有兴趣的也可以下载下来运行一下,关于这些示例我们还做了一些小活动,也希望大家可以踊跃参与。MOSN 作为云原生的网络代理,旨在为服务提供多协议、模块化、智能化、安全的代理能力。

1525

【亲测免费】 MOSN:开源的云原生网络代理项目

MOSN(Modular Open Smart Network)是一个用Go语言编写的云原生网络代理项目。它由蚂蚁集团开源,并在全球十一次大型购物节中经过数十万生产容器的验证。 ## 1. 项目基础介绍与主要编程语言 MOSN是一个模块化、智能化的网络代理,它支持多种协议,并集成了大量云原生组件。MOSN不仅与Istio服务网格集成良好,也可以独立作为L4/L7负载均衡器、API网关和云原生I...

gitblog_00546的博客 583

MOSN(Modular Open Smart Network)-03-流量劫持

应用程序通过注册中心发布/订阅服务时,可结合注册中心劫持流量透明劫持场景中:性能压力不大时使用 iptables redirect大并发压力下使用 tproxy 与 hook connect 结合的方案。

1519

MOSN技术总结

通过其多协议支持、负载均衡、服务发现、流量管理、熔断限流、安全、插件扩展和可观测性等核心功能和特性,MOSN 提供了一种高效、可维护和可扩展的方式来管理和运行微服务架构中的流量和服务治理。它旨在提供高效、可扩展的服务网格解决方案,支持多种协议和插件扩展。适用于服务网格中的数据平面,通过 MOSN 提供高效、可扩展的流量管理和服务治理。提供负载均衡、服务发现、流量管理、熔断限流等功能,提升微服务的可靠性和可管理性。提供负载均衡、服务发现、流量管理、熔断限流等功能,提升微服务的可靠性和可管理性。

weixin_40426261的博客 238

开源之夏经验分享|MOSN 社区韦鑫:做自己认为很酷的事

韦鑫计算机科学与技术学院HTNN 社区贡献者就读于南京航空航天大学,是计算机科学与技术学院研三的同学,研究方向是分布式系统。本文3756字,预计阅读7分钟今天 SOFAStack 邀请到了开源之夏 2024 MOSN 社区的中选学生韦鑫同学!在本项目中,他负责将 Sentinel-golang 流量控制能力集成进 MoE(MOSN on Envoy)生态。希望他分享的这段经历,能让更多人...

金融级分布式架构 1400

LintCode-17: Subsets 和 Subsets II (搜索题中的超级经典!)

这题有4种解法,其中DFS两种,BFS一种,位运算一种。 解法1: DFS 通用解法。 注意: 1) 是每次进入helper()的sol都是一个解,所以不用等到index=nums.size()再存到results里面。 2) vector < vector < int> > results; results的值会是[]。如果想让它变成[[]],

roufoo的博客 1423
上一篇: 【2022 开源之夏】SOFAStack 和 MOSN 社区项目中选结果
下一篇: 【活动报名】SOFAStack × 优快云 联合举办开源系列 Meetup ,6 月 24 日火热开启
SOFAStack
博客等级 码龄7年 747粉丝 389原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值