如何避免Java资源的过度配置

作为开发人员,我们经常会陷入两难的局面:我们既希望在应用中使用闪亮的新工具或代码库,又忌惮在部署到生产环境之后可能出现的未知问题。毕竟,没有人希望自己的手机老是在半夜叮咚作响,更不用说来自为了保持应用能够以多少个9高可用性运行的压力了。这往往塑造了开发人员在应用构建和编程时具有创新精神,却在运营场景中过于保守的状况。

其中,一种最为典型的现象便是—“过度配置(overprovisioning)”,即:在云计算环境中,为应用的部署配备了过多的算力(通常是CPU和RAM),以确保应用拥有足够的资源,来启动或应对运行过程中出现的峰值。显然,既然是过度,我们就需要设法降低此类过度配置的需求,从而节省大量且宝贵的云服务资源的支出。下面,我将和您一起探讨在Java应用的环境中如何避免过度的配置。

应用负载从来都不稳定

正如大多数开发和DevOps人员切实感受的那样,在一天或一周之内,应用的流量负载随着时间的推移,从来就是不均匀的。在闲时,应用无需为不多的用户请求提供服务或处理数据,而在大量用户频繁对应用产生高利用率时,应用实例会在如下情况下,无法被及时推送给应用,进而出现不稳定的峰值:

  • 响应延迟时间过长,无法满足服务级别协议(SLA)。
  • 内存的过度使用,导致Java虚拟机(JVM)中的垃圾回收器(Garbage Collector,GC)出现抖动。
  • 缺少CPU线程、网络或文件句柄等资源,导致传入的请求被拒绝,更不会被予以处理。

其中,后两个问题会导致应用出现毫无响应的状态,因此在测试过程中,开发人员很容易注意到应用的负载上限,以及时扩展所需要的CPU内核和内存数量。而为了避免再次出现峰值,他们通常会趋向于过度添加CPU和内存的数量,以求安全稳定地满足用户需求。例如,开发团队往往会配置比已发现的峰值高出5%到50%的额外云计算余量。

但是,过度的预配置也会增加应用在运行过程中的大量成本。毕竟对于正在运行的云虚拟机而言,固有的CPU(核心或虚拟CPU)和内存,通常并不会自我弹性调整。这就意味着无论应用是否会完全使用到已配置的容量与算力,您都需要为此付费。

为此,我们需要使用合适的策略,来管控过度的预配,以节省不必要的云计算支出。下面,我将向您介绍“垂直扩展(Vertical Scaling)”和“水平扩展(Horizontal Scaling)”这两种扩展模型,以及每种模型的具体策略。而且此类策略和技术既可以适用于跑在云端的应用,也能够适合本地运行的环境。

垂直扩展

垂直扩展旨在让应用通过简单的策略扩展,以处理更多的负载请求。不过它不如后面讲到的水平扩展那么灵活。垂直扩展意味着向物理或虚拟服务器上的应用,添加更多的CPU内核和更多的内存(如果应用属于I/O密集型,则需要添加更多、更快的SSD存储)。当然,此类扩展往往需要停止并重启应用。而有时候这对于应用来说是不可接受的。

水平扩展

多年来,弹性计算(Elastic Compute)一直被奉为可扩展应用开发的“圣杯”。而水平扩展是弹性计算的基础。水平扩展意味着通过添加更多的服务器(各自具有一套完备的CPU和内存)来增加应用的承载能力,而不是向现有服务器添加更多的CPU内核和内存。

不过,与垂直扩展相比,水平扩展更为复杂,需要更多的规划和更多的外部(对应用而言)设置。而且,由于必须引入路由层,这就意味着会产生更多的处理和网络开销,因此其效率不如垂直扩展。

在针对Java应用的水平扩展部署中,我们可以通过自动检测负载,和启停应用节点实例的方式,按需增减资源,进而避免过度的配置。而且,就算在较短的时间内,出现了被过度预置的资源,其数量也会很少(主要取决于您的配置方式)。

更好的负载测试和估计

性能测试通常被认为是一种最困难的测试类型。它需要开发团队对整个应用及其所有连接的服务,具有深入的了解。他们往往需要通过全面思考和反复调整,才能正确地生成模拟生产环境的负载、以及应用数据。显然,为了与生产环境的特征保持同步,测试环境的性能设置是一项劳动密集型工作。

就Java应用而言,开发人员经常会在确定应用峰值性能要求时,通过执行三项操作,来实现更加贴近真实情况的配置调整:

1. 测量服务器和JVM的CPU和内存的利用率

通常,开发人员需要查看服务器(或虚拟机)的CPU与内存的利用率,以确定二者为处理峰值负载所需的数字。其中,在JVM中,他们可以使用工具去监控如下两项指标,以设置正确的级别:

  • JVM GC监控:它有助于检测那些由于内存太少所导致的、在JVM进入GC场景时CPU的使用率过高的情况。同时,它也有助于检测被分配了过多内存的位置。这些位置因引发GC的暂停时间过长,从而导致延迟时间明显长于预期。对此,减少不需要的内存可以节省此方面的开销。
  • JVM线程监控:它有助于检测何时出现由于CPU不足而导致的响应时间过长或无响应的情况。同时,它也有助于检测那些过多的空闲线程,并能通过减少分配的内核数量,以节省开销。
2. 新的JVM版本比旧版本提供更好的性能

在从JDK 11到17,再到21的测试中,我们发现每个JVM版本的CPU使用率都有所提升。与之相对的应用代码则可能需要稍作调整,特别是当您的应用原先基于早于Java 11的版本时。

同时,不同的GC算法也能提升云端VM的效率,虽然这在很大程度上取决于应用的内存利用率。例如,那些执行大数据处理与转换的应用,会具有与RESTful应用不同的GC配置文件。

3. 了解JVM的工作原理

下图显示了一个典型Java应用,从JVM的启动到它是如何随时间推移而执行的过程。在启动时,由于需要启动JVM、加载各种类,所以其CPU的使用率较高。之后,该应用框架(如,Spring Boot)相继进入启动、初始化并达到“准备处理请求”的状态。

请注意图中峰值上方一行的区域。该区域显示了有多少颗CPU被过度预配置给了该应用的VM部署,以应对突发性高负载。随着JVM的实时(just-in-time,JIT)编译器优化代码的生效,该应用的性能会逐渐提高。也就是说,它能够使用更少的CPU来处理相同数量的负载。最终,在JIT编译器的优化效果下,JVM达到了较低的CPU利用率基准。那么,为应用保留下来的富余资源,就浪费了您为其分配的CPU。显然,这些资金本来是有机会可以被节省的。

鉴于使用高性能JVM可以让您减少(或完全消除)过度配置的可能性,我们有必要通过了解此曲线及其对应用的影响,来减少分配给应用VM实例的资源。也就是说,一旦知晓了长尾峰值的所在位置,我们就可以降低其顶线(即“过度配置”),以便分配更少的CPU内核,并节省云计算的租用成本。

减小应用的体积

我们的应用架构随着从单体模式转为微服务(甚至更小的云服务功能),应用的体积规模也变得越来越小。虽然这些不同的架构各有利弊,但在云服务成本优化的背景下,使用水平扩展来达到弹性计算的缩减无疑是最好的实现方式。

应用体积的缩减,也能够减少需要分配给应用每个实例的CPU和内存的数量。而且,这种增量扩展方式不但实现了更高效的资源使用,也反过来达到了对云计算成本更精细化的控制效果。可以说,部署的单元越小,在纵向扩展时所支付的费用就越少。当然,这里主要讨论的是自动化的扩展方式。

使用自动化扩展

说到自动化扩展,它是一种根据应用负载的增加或减少,自动化地增减应用实例节点的能力。通过云服务成本的优化,我们可以根据所构建的应用群集环境的不同,采用不同的自动化扩展选项。目前,最流行的自动化扩展平台当属Kubernetes。当然,它也给标准的固定分布式集群(fixed-distributed-cluster)部署带来了不小的复杂性。

比Kubernetes更为简单的替代方案是容器即服务(CaaS),例如AWS的Fargate、Google的Cloud Run、以及Microsoft的Azure 容器。这些部署服务提供了一些更加简单的应用部署方法,并通过将Docker容器中的应用提供给服务,来自动处理向上和向下扩缩容。CaaS解决方案的缺点在于,它们的成本会高于标准的VM,并且可能会比托管式的Kubernetes部署的成本还要高。

结论

总的说来,减少过度配置可以帮助我们节省应用在云服务中的成本开销。无论您使用上述哪种策略来减少过度配置,了解Java应用的CPU和内存配置文件,无疑将有助于您掌握应用在启动和运行时的性能状况。目前,有一种Azul Platform Prime不但可以为大中型Java应用部署提供更为高效的高性能JVM,而且具有如下特点:

  • 由于具有先进的C4 GC、底层优化和先进的Falcon JIT编译器,它比其他JVM能够更好地处理峰值负载。
  • 使用ReadyNow以避免JIT加速(即由JIT带来的高CPU使用率)。
  • 其处理峰值方式不但可以处理更高的峰值负载,而且能够提供更低的延迟。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

增加Github访问稳定性

使用 steamcommunity_302软件 官方下载和使用地址: https://www.dogfight360.com/blog/686/#google_vignette

2.2.4 C#中显示控件BDPictureBox 的实现----ROI交互

2.2.4 C#中显示控件BDPictureBox 的实现----ROI交互 1 界面效果 在设定模式下&#xff0c;可以进行ROI 框的拖动&#xff0c;这里以Rect1举例说明 2 增加ROI类定义 /// <summary> /// ROI_single /// 用于描述图片感兴趣区域 /// type: 0:Rect1;1:Rect2;2:Circle ;3:…

SQL Server数据库的组成

《SQL Server 2022从入门到精通&#xff08;视频教学超值版&#xff09;》图书介绍-CSDN博客 对于数据库的概念&#xff0c;没有一个完全固定的定义&#xff0c;随着数据库历史的发展&#xff0c;定义的内容也有很大的差异&#xff0c;其中一种比较普遍的观点认为&#xff0c;…

Java - 程序员面试笔记记录 实现 - Part1

社招又来学习 Java 啦&#xff0c;这次选了何昊老师的程序员面试笔记作为主要资料&#xff0c;记录一下一些学习过程。 1.1 Java 程序初始化 Java 程序初始化遵循规则&#xff1a;静态变量优于动态变量&#xff1b;父类优于子类&#xff1b;成员变量的定义顺序&#xff1b; …

使用TensorFlow进行OCR识别:将表格图片转换为结构化数据

随着人工智能和机器学习技术的不断发展&#xff0c;OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;技术已经成为处理图像中文本信息的强大工具。TensorFlow是一个广泛使用的开源机器学习框架&#xff0c;它提供了丰富的API和工具&#xff…

【源码 +文档+调试讲解】大学生企业推荐系统ssm

大学生企业推荐系统采用B/S结构、java开发语言、以及Mysql数据库等技术。系统主要分为管理员和学生、企业三部分&#xff0c;管理员主要功能包括&#xff1a;首页、个人中心、学生管理、企业管理、招聘信息管理、个人简历管理、应聘职位管理、评价企业管理、交流论坛、系统管理…

IDEA中Maven的配置

目录 1. 安装maven 2. 配置环境变量 3. IDEA中配置Maven 4. 配置仓库目录 1. 安装maven 官网下载地址&#xff1a;Maven – Download Apache Maven 下载后&#xff0c;将zip压缩包解压到某个目录即可。 2. 配置环境变量 变量名称随意&#xff0c;通常为M2_HOME&#xff…

双向广搜——AcWing 190. 字串变换

双向广搜 定义 双向广度优先搜索&#xff08;Bi-directional Breadth-First Search, Bi-BFS&#xff09;是一种在图或树中寻找两点间最短路径的算法。与传统的单向广度优先搜索相比&#xff0c;它从起始点和目标点同时开始搜索&#xff0c;从而有可能显著减少搜索空间&#x…

【MindSpore学习打卡】应用实践-计算机视觉-FCN图像语义分割-基于MindSpore实现FCN-8s进行图像语义分割的教程

图像语义分割是计算机视觉领域中的一个重要任务&#xff0c;它旨在对图像中的每个像素进行分类&#xff0c;从而实现对图像内容的详细理解。在众多图像语义分割算法中&#xff0c;全卷积网络&#xff08;Fully Convolutional Networks, FCN&#xff09;因其端到端的训练方式和高…

vlan基础相关

7.2以太网交换基础 数据链路层也叫2层网络&#xff0c;用的是Mac地址&#xff0c;想到Mac地址就要想到交换机。 以太网协议&#xff08;LAN&#xff09;以太网是建立在CSMA/CD载波监听多路访问/冲突检测&#xff0c;机制上的广播型网络。CSMA工作原理是先监听&#xff0c;在介…

宇宙第一大厂亚马逊云科技AWS人工智能/机器学习证书即将上线,一篇文章教你轻松拿下

据麦肯锡《在华企业如何填补AI人才缺口》研究表明&#xff0c;到2030年人工智能为中国带来的潜在价值有望超过1万亿美元&#xff0c;而随着各大企业进入人工智能化&#xff0c;对该领域的人才需求将从目前的100万增长到2030年的600万。然而到保守估计&#xff0c;到2030可以满足…

「实战应用」如何用图表控件LightningChart JS创建SQL仪表板应用(三)

LightningChart JS是Web上性能特高的图表库&#xff0c;具有出色的执行性能 - 使用高数据速率同时监控数十个数据源。 GPU加速和WebGL渲染确保您的设备的图形处理器得到有效利用&#xff0c;从而实现高刷新率和流畅的动画&#xff0c;常用于贸易&#xff0c;工程&#xff0c;航…

WPS-Word文档表格分页

一、问题描述 这种情况不好描述 就是像这种表格内容&#xff0c;但是会有离奇的分页的情况。这种情况以前的错误解决办法就是不断地调整表格的内容以及间隔显得很乱&#xff0c;于是今天去查了解决办法&#xff0c;现在学会了记录一下避免以后忘记了。 二、解决办法 首先记…

PLC_博图系列☞F_TRIG:检测信号下降沿

PLC_博图系列☞F_TRIG&#xff1a;检测信号下降沿 文章目录 PLC_博图系列☞F_TRIG&#xff1a;检测信号下降沿背景介绍F_TRIG&#xff1a; 检测信号下降沿说明参数示例 关键字&#xff1a; PLC、 西门子、 博图、 Siemens 、 F_TRIG 背景介绍 这是一篇关于PLC编程的文章&a…

中南大学湘雅三院张如旭/刘爱华团队发现牙髓干细胞来源的外泌体减轻脑缺血再灌注损伤的神经保护机制

随着我国人口老龄化的加剧&#xff0c;中风已成为我国主要的公共卫生疾病之一&#xff0c;确定其潜在的分子机制和治疗靶点对于开发有效的预防和治疗策略至关重要。近期&#xff0c;中南大学湘雅第三医院张如旭、刘爱华团队在经典权威期刊《Pharmacological Research》&#xf…

从一次 SQL 查询的全过程了解 DolphinDB 线程模型

1. 前言 DolphinDB 的线程模型较为复杂&#xff0c;写入与查询分布式表都可能需要多个类型的线程。通过了解 SQL 查询的全过程&#xff0c;可以帮助我们了解 DolphinDB 的线程模型&#xff0c;掌握 DolpinDB 的配置&#xff0c;以及优化系统性能的方法。 本教程以一个分布式 …

华清远见人工智能课程:项目优势助力,学习更高效!

在人工智能飞速发展的今天&#xff0c;学习人工智能成为新的高薪赛道。我们都知道人工智能的学习离不开项目练手&#xff0c;只有通过实际项目的操作&#xff0c;才能真正掌握人工智能的核心技能。但遗憾的是&#xff0c;很多人工智能课程只注重理论知识的传授&#xff0c;缺乏…

WEB项目通过浏览器打开windows上的exe应用

一、背景 最近有一个新需求&#xff0c;是通过浏览器打开本地exe应用。因为我们公司的产品是以exe为主&#xff0c;用web项目管理数据&#xff0c;接到的新项目是web为企业门户需要集成所有的应用&#xff0c;前端通过按钮点击打开本地exe应用。一开始还有点懵&#xff0c;因为…

Coze 国际版停止免费开启商业化

昨晚 Coze 国际版没有任何官方通知&#xff0c;悄悄开启了 Premium 服务&#xff0c;API 和 SDK 调用不再免费。 免费版只提供每日 10 条消息&#xff0c;最低的 9 刀套餐&#xff0c;每日最多 100 条消息&#xff0c;GPT-4o 最多 10 条。 国内版目前还是免费的&#xff0c;但…