从负载均衡的预热谈到AOT

2023-10-21 14:30
文章标签 负载 均衡 预热 aot 谈到

本文主要是介绍从负载均衡的预热谈到AOT,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在公司内部RPC框架最近的一次提交中看到了这么一个commit,主要是为了

  • 平滑扩容
  • 服务重启
  • 瞬时流量

在这里插入图片描述

点进去之后看到了熟悉的代码,没错儿,这正是Dubbo负载均衡策略中使用的预热(warmup)逻辑

AbstractLoadBalance
getWeight()

我们内部的这次提交连注释都是照搬过来的,在调用方发起请求时,这块代码对服务端列表InvokerList(ProviderList)中配置了warmup时间的服务重新进行权重的计算,对于当前时间戳较新的服务,按比例降低权重,防止瞬时流量RT过长,产生超时甚至打垮服务。

/*** Calculate the weight according to the uptime proportion of warmup time* the new weight will be within 1(inclusive) to weight(inclusive)** @param uptime the uptime in milliseconds* @param warmup the warmup time in milliseconds* @param weight the weight of an invoker* @return weight which takes warmup into account*/static int calculateWarmupWeight(int uptime, int warmup, int weight) {int ww = (int) ( uptime / ((float) warmup / weight));return ww < 1 ? 1 : (Math.min(ww, weight));}

在这里插入图片描述
对于预热场景,目前我了解的包括以下几个方向

  1. 缓存预热
  2. 代码预热
  3. 基于负载均衡的服务端预热
缓存预热

这个场景,大家应该是都比较熟悉的,日常项目中的缓存场景非常普遍,在高并发场景下,或者低延时业务,为了业务的平滑丝滑,上线前或者重启时,我们一般会将高频的配置业务数据提前加载进缓存
如果没有配置,那么刚启动时,热点数据会直接穿透缓存直达DB,首先响应时间会变长,再者初始化时DB的压力也会很大,对于业务的使用者来说会有卡顿的感觉。
提前配置了热点数据之后,系统的响应接口RT会比较稳定,不太有毛刺现象的产生。
举个简单的栗子,我们兼职小程序首页每个专题页的职位在配置线上前,在运营后台都会提前加载专题页进入redis,防止请求直接打到DB。

代码预热

代码预热我认为分为两个方面

  • 基于真实业务流量或者基准测试,在上线前对服务核心链路进行预热,主要为了资源的加载,数据层面的缓存,不过我们服务不是低延时场景,我对此也了解不深,本文不过多叙述
  • JVM的类加载编译

围绕第二点来谈谈,对于一个javaer,JVM的启动速度一直以来都被吐槽诟病。
JVM的口号是 一次编译,处处运行,但是实际上Javac前端编译器编译之后,不同系统对于编译后的字节码文件还是需要解释执行,所以某种程度Java算是半编译半解释型语言,为了提高运行速度,JVM在1.3版本就引入了JIT即时编译这个大杀器。

对于热点代码(热点代码的探测在此不讨论),JIT(JustInTime)编译技术是在通常的编译过程之上做了增强,JVM基于C1、C2编译器,会根据运行过程中代码执行的热点情况,把一些热点代码提前编译成机器码,等下次执行这些热点代码的时候,就不用实时编译成机器码了,而是直接运行机器码即可,这样就提高了Java的运行速度。正所谓Just-In-Time。

但是JIT的重点是在运行过程中对热点代码进行编译缓存,那么JVM启动时的速度仍然很慢,那么JVM在启动这方面有没有什么优化呢,有的,相信大家在看到JIT相关介绍时,往往伴随着另外一项概念AOT(Ahead-Of-Time)提前编译

AOT 见名知意,提前编译,也就是提前在应用启动之前将代码编译成可执行的机器码。有以下优点

  • 在程序运行前编译,可以避免在运行时的编译性能消耗和内存消耗
  • 可以在程序运行初期就达到最高性能,程序启动速度快
  • 运行产物只有机器码,打包体积小

对于C++或者C语言等编译型语言来说,我理解AOT并不是什么新技术,但是对于Java号称一次编译处处运行的特性来说,很明显AOT和Java是站在对立面的。提前编译会破坏处处运行的特性,直接跳过字节码那就牺牲了跨平台的特性。
在JEP 295 提案中, JDK9中JVM确实也引入了AOT编译,目的就是为了减少java应用程序启动的耗时,对代码进行warm up;需要使用新的编译命令jaotc对代码进行编译
在这里插入图片描述

but由于使用适用范围和人数并不广泛在JDK17的时候移除了这项特性。

除了JVM官方,不得不说GraalVM在AOT这项特性的推进,GraalVM现在已经成长为一个比较完善的通用虚拟机,除了Java之外,对JS、Rust、Pthon等等语言方面的高效运行和高质量编译也支持的很好。对于AOT也是GraalVM主推的特性,有这方面需要的应用可考虑使用这个编译器,GraalVM目前比较活跃,各项研究开发进度也很稳定推进。
SpringBoot3去年发布,其中Spring Native也是升级的一个重大特性。
支持使用GraalVM将Spring的应用程序编译成可执行的镜像文件,这可以显著提高内存和启动性能。Spring Native也是Spring在云原生时代的一个展望,是Spring面向未来的有利竞争优势。

基于负载均衡的服务预热

如我开头所说的,在服务层面,为了提高整体服务的可用性,在请求方获取服务列表进行负载均衡时,会将服务的启动时间加入计算,以降低服务的权重,给新加入的服务一些预热时间后,再慢慢承接更多的请求,直到达到相应的权重比例。

这篇关于从负载均衡的预热谈到AOT的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/254976

相关文章

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

一种改进的red5集群方案的应用、基于Red5服务器集群负载均衡调度算法研究

转自: 一种改进的red5集群方案的应用: http://wenku.baidu.com/link?url=jYQ1wNwHVBqJ-5XCYq0PRligp6Y5q6BYXyISUsF56My8DP8dc9CZ4pZvpPz1abxJn8fojMrL0IyfmMHStpvkotqC1RWlRMGnzVL1X4IPOa_  基于Red5服务器集群负载均衡调度算法研究 http://ww

【微服务】Ribbon(负载均衡,服务调用)+ OpenFeign(服务发现,远程调用)【详解】

文章目录 1.Ribbon(负载均衡,服务调用)1.1问题引出1.2 Ribbon负载均衡1.3 RestTemplate整合Ribbon1.4 指定Ribbon负载均衡策略1.4.1 配置文件1.4.2 配置类1.4.3 定义Ribbon客户端配置1.4.4 自定义负载均衡策略 2.OpenFeign面向接口的服务调用(服务发现,远程调用)2.1 OpenFeign的使用2.1 .1创建

MySQL数据库负载均衡

数据库负载均衡是通过将数据库请求分散到多个数据库服务器上,以提高数据库的处理能力和可用性。在高并发的场景下,使用数据库负载均衡器可以有效避免单点故障,提高系统的整体性能和可靠性。 数据库负载均衡器 数据库负载均衡器可以是硬件设备或软件解决方案。在MySQL环境中,一些流行的数据库负载均衡器包括: MySQL Proxy:MySQL Proxy是一个简单的中间件,用于监控、分析或增强对MySQ

redis缓存预热、缓存穿透的详细教程

前言     作此篇主要在于关于redis的缓存预热、缓存雪崩、缓存击穿和缓存穿透在面试中经常遇到,工作中也是经常遇到。中级程序员基本上不可避免要克服的几个问题,希望一次性解释清楚 缓存预热 MySQL加入新增100条记录,一般默认以MySQL为准为底单数据,如何同步给redis(布隆过滤器) 这是100合法数据,mysql有100条新纪录,但是redis无。     为什么需要预热

828华为云征文|基于华为云Flexus X实例搭建Nginx集群负载均衡

目录 前言 一、Flexus云服务器X介绍 1.1 Flexus云服务器X实例简介 1.2 Flexus X实例购买 1.3 登录服务器 三、Springboot集群服务 3.1 部署9901节点服务 3.2 部署9902节点服务 四、Nginx负载均衡配置 五、集群负载调用测试 5.1 负载调用9901端口 5.2 负载调用9901端口 总结 前言 华为云Flexus X实例凭借其

Redis 缓存深度解析:穿透、击穿、雪崩与预热的全面解读

Redis 缓存深度解析:穿透、击穿、雪崩与预热的全面解读 一 . 什么是缓存 ?二 . 使用 Redis 作为缓存三 . 缓存的更新策略3.1 定期生成3.2 实时生成 四 . 缓存预热、缓存穿透、缓存雪崩、缓存击穿4.1 缓存预热4.2 缓存穿透4.3 缓存雪崩4.4 缓存击穿 Hello , 大家好 , 这个专栏给大家带来的是 Redis 系列 ! 本篇文章给大家讲解的是

CUDA:用并行计算的方法对图像进行直方图均衡处理

(一)目的 将所学算法运用于图像处理中。 (二)内容 用并行计算的方法对图像进行直方图均衡处理。 要求: 利用直方图均衡算法处理lena_salt图像 版本1:CPU实现 版本2:GPU实现  实验步骤一 软件设计分析: 数据类型: 根据实验要求,本实验的数据类型为一个256*256*8的整型矩阵,其中元素的值为256*256个0-255的灰度值。 存储方式: 图像在内存中

图像处理:基于直方图矫正的图像色彩均衡

from itertools import chainimport cv2import osimport numpy as npimport datetimeclass BrightnessBalance:def __init__(self):passdef arrayToHist(self,gray):'''计算灰度直方图,并归一化:param gray_path::return:'''

《Nginx 负载均衡详解》

一、引言 在当今互联网时代,随着业务的不断发展和用户量的持续增长,单一服务器往往难以满足高并发的访问需求。为了提高系统的可用性、可靠性和性能,负载均衡技术应运而生。Nginx 作为一款高性能的 Web 服务器和反向代理服务器,提供了强大的负载均衡功能。本文将深入探讨 Nginx 负载均衡的原理、配置方法、算法以及实际应用中的注意事项,帮助读者更好地理解和运用 Nginx 负载均衡技术。