参赛心得和思路分享:2021第二届云原生编程挑战赛2: 实现一个柔性集群调度机制

关联比赛:  2021第二届云原生编程挑战赛2:实现一个柔性集群调度机制

参赛心得

历时快两个月的第二届云原生编程挑战赛结束了,作为第一次参赛的萌新,拿下了28名的成绩,与第一名差了19万分,因为赛制时间太长,加上期间学业有各种事以及国庆摆烂,没能拿到前十。到最终也不知道差到那19万分哪儿了。这里将我们的思路做一个分享。期待top10大佬的分享!

题目解析

题目背景就不再赘述,这里我们直接看测试过程:
测试过程:
1. PTS 作为压测请求客户端向 Gateway(Consumer) 发起 HTTP 请求,Gateway(Consumer) 加载用户实现的负载均衡算法选择一个 Provider,Provider 处理请求,返回结果。
2. 每个 Provider 的服务能力 (处理请求的速率) 都会动态变化。
3. 三个 Provider 的每个 Provider 的处理能力会随机变动以模拟超售场景
4. 三个 Provider 任意一个的处理能力都小于总请求量
5. 三个 Provider 的会有一定比例的请求处理超时(5000ms)
6. 三个 Provider 的每个 Provider 会随机离线(本次比赛不依赖 Nacos 的健康检查机制,也即是无地址更新通知)
7. 评测分为预热和正式评测两部分,预热部分不计算成绩,正式评测部分计算成绩。
8. 正式评测阶段,PTS 以固定 RPS 请求数模式向 Gateway 发送请求,1分钟后停止;
9. 以 PTS 统计的成功请求数和最大 TPS 作为排名依据。成功请求数越大,排名越靠前。成功数相同的情况下,按照最大 TPS 排名。
解析:
从1可以看出,我们要实现的是Gateway层,在Gateway层实现负载均衡算法。
从2可以看出,我们需要动态维护Provider在一段时间内的信息,并且在这个基础上进行预测。
从3可以看出,我们不能给每个Provider的权重设置为一定。需要动态更新。
从4可以看出,需要给三个Provider负载均衡,以吃下更大的请求量。
从5可以看出,必须处理超时的请求,否则会大幅影响成绩。
对于第6点,我们设计了离线检测,但是对我们的成绩并没有提升。
从7可以看出,我们可以利用预热时间,获取一些有用的信息,设置为参数,然后进入下一个节点。
8、9是成绩评测机制。成功的请求越多,成绩越高。

解题思路

针对以上信息,我们设计了以下策略:
快速失败策略
作用:请求在多久没有完成之后(设这个时间为t)就认为其失败,不再等待返回信息,然后进行重试,可以大幅增加请求处理的数量(测试中有很多执行时间为5000ms的消息干扰,不加快速失败策略只有几万分)。
我们进行了以下尝试:
1、基于历史日志进行一元线性回归预测t值(已失效)。
2、线上基于队列进行一元线性回归预测t值(效果不好)。
3、线上利用近期请求的平均执行时间预测t值(效果最好)。
在A榜阶段,我们解析了日志,然后发现请求量和请求时间是一个线性的关系。处理的步骤如下图所示:


图1 数据处理前

图2 数据处理后


图2 数据处理后
然后对这个数据进行一元回归分析:

 

图3 一元回归预测


图3 一元回归预测
最终将一元回归得出的方程带入超时时间,通过当前的并发量和方程预测请求应该在多长时间内结束,然后将这个时间放宽作为我们的超时时间,这个策略在一段时间内让我们得成绩有所上升。
但是好景不长,没过多久出题方改了评测机制,三个provider出现性能大幅差异以及不再线性,加上后面还会不提供日志,于是我们舍弃了这个思路。

 

enter image description here


 

enter image description here


 

enter image description here


图4-6 改了评测机制后的一元回归
于是我们对每个Provider维护一个队列,队列中存放一个对象,对象包含最近0.1ms的请求的耗时,当前的并发数等信息。然后利用这个队列中的信息进行预测:
1.线上一元线性回归预测
将一元回归的代码整合进代码中,每来一条请求,就利用队列中的近100条信息进行一元回归预测,然后再加上一点时间,从微分的思想上来说,这样也是可以得到一个较好的预测的,但是耗时太长,导致成功的请求数反而有所下降。
2.平均时间预测
我们计算出当前维护的队列中所有的请求的平均耗时,然后将其加上一点点,作为预测的超时时间,作为我们的最终策略。
负载均衡策略
负载均衡策略我们几乎尝试了所有的负载算法,以及自己尝试了很多负载均衡算法。比如:
定义:
weight : 计算中的生产者的权重
originWeight :计算前生产者的权重,每次分发前更新一次(因为测评机制3):min = 10 , middle = 15 , max = 20
totalWeight : 三个生产者的总权重
P : 选中概率
memory : 剩余内存
CPU : 剩余CPU占比
avgTime : 最近0.1ms中的消息的平均处理时间
select : 最终选中的处理请求的生产者
active : 当前活跃数

算法:
1.加权轮询算法
weight = originWeight * memory * CPU * (-Math.log (avgTime) + 9)
P(select) = P(weight / totalWeight)
2.最小连接数算法(最优)
if (count (min(active)) == 1) select = min(active)
else select = Max(weight) in Min(active)
3.加权最小连接数算法
weight = originWeight * memory * cpu * (-Math.log(avgTime) + 9)
select = Min (weight / active)
4.最大空余线程数比例算法
Select = Max((maxActive – active) / maxActive )
5.最大空余线程数算法
Select = Max(maxActive – active)

最终最优的算法是最小连接数算法,我们在使用最小连接数算法前进行了一个判断,如果该provider已经被限流,则不参与本次选举。
限流策略
不限流的话性能比较差的provider会直接被压垮,并且有很多的5000ms的超时请求,所以必须在provider端实现限流。实现的限流类似于限流算法中的计数器算法,就是定义一个最大线程数,定义一个超时时间timeout以及当前活跃的线程数active,当active小于等于max时就不处理正常执行,大于max时等待timeout长的时间,等待里面的请求自动超时,在这期间如果有请求结束,则唤醒一个新请求,如果在这段时间里有请求没有结束,就让正在活跃的请求全部失败。
服务离线策略(未生效)
在官方的赛题说明中,提到三个生产者会随机离线,然后就设计了这个离线策略,但是奇怪的是并没有生效。策略是:如果一个服务上一次成功执行请求的时间距离现在特别长,就让其在一段时间之内不再执行,过一段时间之后再给它恢复正常。如上图所示,如果一个服务上一次请求的时间距离现在很近(比如为500ms),那么就判定该服务正常,让其正常执行,如果一个服务上一次请求成功的时间离现在大于500ms,就将它上一次请求成功的时间设置为当前时间往后的第500ms,在这之后500ms内,服务这个服务不再参加选举。这个离线的时间我们也做过一版动态的,比如第一次离线就让其离线50ms,第二次就让其离线100ms,第三次让其离线150ms。但是无论怎么调整判断离线时间和离线时间的数值,都对成绩没有提升效果。

 

图7 服务离线策略


图7 服务离线策略
利用预热时间探测最佳并发量
在测试时有一分钟的预热时间,我们利用其1分钟探测出服务的最佳并发量。因为服务性能可能会动态变动,所以我们这里可能做得不是很好,期待大佬的帖子。
探测的思路是:
定义变量:
每秒钟成功的请求数successCountPerSecond
当前限流的并发数: max
每秒钟最大成功请求数: bestSuccessCountPerSecond
最佳并发量: bestConcurrency

我们在一个定时器中执行以下代码:

enter image description here


图8 探测最佳并发量
最后快到1分钟时,不再执行这段代码,并将限流的数量设置为探测出来的max。

历时快两个月,最终成绩28名,明年继续努力!

仓库地址:

https://gitee.com/bestanswer/pullbased-cluster



查看更多内容,欢迎访问天池技术圈官方地址:参赛心得和思路分享:2021第二届云原生编程挑战赛2: 实现一个柔性集群调度机制_天池技术圈-阿里云天池

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/53627.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计选题推荐-作品分享交流平台(摄影、绘画、书法)-Java/Python项目实战(亮点:分享作品到微博、浏览历史、数据可视化)

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

局域网一套键鼠控制两台电脑(台式机和笔记本)

服务端(有键盘和鼠标的电脑作为服务端) 下载软件 分享文件:BarrierSetup-2.3.3.exe 链接:https://pan.xunlei.com/s/VO66rAZkzxTxVm-0QRCJ33mMA1?pwd4jde# 配置服务端 一, 二, 客户端屏幕名称一定要和…

yolo txt格式转coco json格式

yolo txt格式转coco json格式 **问题背景:**下载coco128数据集,使用yolov5模型进行推理并使用pycocotools.cocoeval 对预测结果进行精度计算。 coco128 下载地址:https://tianchi.aliyun.com/dataset/108650 解压缩cocozip之后可以看到如下的…

全面掌握信息架构:数字化转型的最佳实践与应用指南

在全球化和信息化高度发展的今天,企业正面临前所未有的挑战与机遇 数字化转型已成为各大企业保持竞争力的必由之路,而成功的数字化转型离不开稳健且灵活的信息架构。《信息架构:商业智能&分析与元数据管理参考模型》正是一本为企业提供全…

数学建模笔记—— 主成分分析(PCA)

数学建模笔记—— 主成分分析 主成分分析1. 基本原理1.1 主成分分析方法1.2 数据降维1.3 主成分分析原理1.4 主成分分析思想 2. PCA的计算步骤3. 典型例题4. 主成分分析说明5. python代码实现 主成分分析 1. 基本原理 在实际问题研究中,多变量问题是经常会遇到的。变量太多,无…

Java中的类加载与卸载机制详解

在Java虚拟机(JVM)中,类加载和类卸载机制是Java运行时环境的重要组成部分。理解类的加载与卸载不仅有助于深入掌握JVM的运行原理,还可以帮助开发者优化程序性能,特别是在内存管理和应用程序生命周期管理中起到关键作用…

《零散知识点 · Kafka 知识拓展》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…

基于单片机的人脸识别的智能门禁系统设计

文章目录 前言资料获取设计介绍功能介绍设计清单核心代码具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等…

教师节特辑:AI绘制的卡通人物,致敬最可爱的人‍

【编号:9】教师节到了,今天我要分享一组由AI绘制的教师节主题卡通人物插画,每一幅都充满了对老师的敬意和爱戴。让我们一起用这些可爱的卡通形象,向辛勤的园丁们致敬! 🎓【教师形象】 这…

并发编程 - NSThread

引言 关于并发编程,我们在前面的博客中已经介绍过了GCD和NSOperation&NSOperationQueue。这两种方案足以覆盖大多数开发场景。然而,理解NSThread仍然是有必要的。虽然它在现代开发中使用较少,但对于理解底层线程管理和并发编程的基础&am…

量化交易backtrader实践(一)_数据获取篇(2)_tushare与akshare

上一节回顾 在上一节中,从股票的基本功能和主要数据进行小结,明确了进行backtrader回测所需要的数据,并且学习了backtrader的数据来源以及PandasData的格式要求,已经做到假设拿到.txt或.csv文件后,能把里面的股票基本…

赎金信--力扣383

赎金信 题目思路一方法一:哈希表思路二方法二 数组 题目 思路一 我们使用哈希表map的思路,A能不能由B组成,说明B包含的元素个数要大于等于A。 所以我们先利用map的key和value分别对magazine中的出现的字符以及出现的次数存储起来。 然后我们…

【射频通信电子线路基础第三讲】射频网络与阻抗匹配包括射频电路与网络、二端口射频网络参数,阻抗匹配解析法

一、射频电路与网络 1、物理等效电路与网络等效电路 (1)物理等效电路:是基于电流电压的等效电路,采用集总参数,反应电路内部的原理 (2)网络等效电路:是基于功率的等效电路&#x…

页面水印的实现以及防删除方案

水印相关 引言绘制一个水印输出背景图封装一点点细节图片加水印防止水印删除问题解决方案 引言 在企业里为了防止信息泄露和保护知识产权,通常会在页面和图片上添加水印 前端页面水印的添加一般有这几种方式:dom 元素循环、canvas 输出背景图、svg 实现…

企业财税自动化解决方案的成本效益分析与投资回报预测

随着企业规模的扩大和业务复杂度的增加,企业在财务管理方面也面临着诸多挑战,传统的财务管理方式逐渐无法满足企业经营需求,借助财税自动化解决方案来提高财务效率和准确性、降低人力成本,为企业带来长期的效益提升,已…

通过战略性SEO整合提升B2B内容的可见性、权威性和投资回报率

精明的市场营销者知道,尽管B2B营销的重点是推动商业采购,但归根结底,商务买家依然是消费者。无论你是针对返校购物的父母的鞋子品牌,还是寻找新的内容制作合作伙伴以扩大内容计划的市场营销领导者,搜索引擎优化&#x…

航空航天混合动力(2)电动飞机发展中的电气连接挑战

航空航天混合动力(2)电动飞机发展中的电气连接挑战 1.概述2.更高的电压(千伏)和功率(兆瓦)2.缓解局部放电/电晕效应3.提高可靠性,更恶劣的环境,频繁的维护和检查,冲击和振动4.减重5.抗电弧跟踪和液压油阻力6.严格的可燃性,毒性和烟雾要求7.海拔和气压的影响8.工作温度范围…

远程存储 RDMA

什么是 RDMA RDMA(Remote Direct Memory Access)指的是远程直接内存访问,这是一种通过网络在两个应用程序之间搬运缓冲区里的数据的方法。 Remote:数据通过网络与远程机器间进行数据传输。 Direct:没有内核的参与&am…

【区块链 + 人才服务】CERX- 基于联盟链的研学资源交换网络 | FISCO BCOS应用案例

CERX 是定位于面向高校科学研究与教学的分布式研学资产交换网络,构建一个用于数据、算法模型、论文和课程的研学资源价值流转平台。该平台采用 FISCO BCOS 联盟链为核心区块链层。 CERX 基于“交叉学科”的人才培养生态,围绕“科研、课件、课程、证书”…

Linux基础3-基础工具1(什么是工具,yum,vim基础)

目录 一.什么是工具 二.yum 2.1 yum基础 2.2 yum拓展 2.3 rzsz 三.vim基础 四.下章内容 1. vim 插入模式,底行模式,命令模式下详解。vim基础配置 2. gcc/g 基础 一.什么是工具 工具的本质是也是指令。通过工具我们能快速的实现某些功能 二.yum 2.1…