弹性架构_实践中的弹性基础架构

弹性架构

几周前,我获得了一个难得的机会,可以在基础设施领域中沾沾自喜。 在JVM内部的深入了解下,我每天的工作经历发生了有趣的变化,我想与您分享动机和成果。 希望它可以启发类似的问题类别。

背景

我将从解释需要解决方案的上下文开始。 如果您知道Plumbr性能监控的全部内容,则可以跳过此部分。 对于其他所有人,我们Plumbr都在构建性能监控解决方案。 我们的方法是独特的,因为我们旨在使所有性能问题都具有源代码的根本原因。

这种问题的较复杂类别之一是其根源隐藏在Java内存分配和管理中。 此类别中的问题包括:

  • 内存不足;
  • 面临太频繁/太长时间的GC暂停;
  • 尝试减少应用程序的内存占用。

我们对此类问题的解决方案是建立在对对象图进行快照并从那里公开最需要内存的数据结构的基础上的。 结果,您将获得运行时透明性,以了解JVM堆中实际发生的情况:

垂直记忆快照示例

上面是我们监视自己的服务时发现的示例。 我们可以看到,在重大GC暂停后的某个时刻,我们占据了70%以上的旧一代。 老一代的高占用率通常会导致长时间的GC暂停,因此Plumbr捕获了快照以显示其中的实际内容。

在这种特殊情况下,我们发现包含ProbeDataProcessingTasks的处理队列的大小已增长到近千兆字节。 了解应归咎于哪些数据结构使解决该问题变得微不足道。 结果,GC暂停的频率和持续时间保持不变。

但是,拍摄这些快照有些昂贵。 捕获快照所需的时间取决于堆中对象的数量以及它们之间的引用。 我们的代理商会仔细安排快照的时间,以避免自己成为性能瓶颈。

综上所述:在我们的基础架构中,此特殊功能导致不可预测的内存快照流入。 更糟糕的是,快照的大小也是不可预测的。 有时我们每小时可能只收到一个微小的快照,然后突然间,我们在很短的时间内被许多10 + G快照轰炸:

记忆快照容量

我们最初的解决方案存在问题

我们构建的第一个解决方案是专用的微服务,用于处理快照的传入流。 我们立即开始面临问题。 首先,我们还无法估算这些快照的大小。 最初配置的4G内存还远远不足以处理流向我们的较大快照。 要分析快照,我们需要将对象图加载到内存中,因此快照越大,分析所需的RAM越多。

因此,我们需要从亚马逊购买更大的计算机。 突然之间,微服务不再是微服务了。 正如我们很快发现的那样,在您的每月账单中实际上可以看到保持m4.10xlarge实例嗡嗡作响的24×7。 除了非常昂贵外,机器有99%的时间几乎处于空闲状态–发生的巨大堆快照很少见,因此经常会超额配置10倍来处理偶尔出现的峰值。

此外,分析持续时间很快就成为瓶颈。 快照需要10秒钟到数十分钟的时间来分析每个快照,因此当在短时间内到达多个大型快照时,队列等待时间成为一个问题:

弹性基础设施的动力

解决方案要求

了解了问题之后,下一步就是将问题简化为解决方案的要求:

  • 分析任务不应在队列中等待数小时。 我们应该能够并行处理它们。 每当一个巨大的快照到达并且需要很长时间进行分析时,其他快照就不应等待它完成。
  • 对于每个快照,我们可以估计执行分析所需的堆空间。 我们希望使用尽可能多的资源,而不会过度配置基础架构。

对于以前建立过弹性环境的人来说,解决方案的要求可能会很明显。 对于那些还没有的人,我将在下一部分中介绍解决方案体系结构和实现的关键案例。

建立解决方案

这些要求有效地指示我们,我们应该维护一个弹性的基础架构,而不是一个单独的专用实例。 实例应按需生成,实例类型应与接收到的快照的大小相对应。

因此,我们继续将快照分析代码包装到docker容器中,并利用AWS ECS将此类容器用作集群中的任务。 这样做之后,我们偶然发现了第一个问题:向外扩展并不像预期的那么琐碎。

仅仅为每个分析生成一个适当大小的新实例并随后立即终止的天真的方法被证明是一个坏主意。 启动实例最多可能需要五分钟,具体取决于实例类型。 此外,AWS每小时执行一次计费,因此,让一个实例运行60分钟比运行十个实例每6分钟便宜十倍。

在这种情况下,典型的方法是使用AWS 自动扩展组。 显然,这不适合我们,因为AWS无法根据ECS任务所需的内存量自动生成实例。 您无法将任务提交给ECS集群,除非该集群已经有足够的资源来容纳它。

我们的解决方案是根据分析任务所需的内存量将其划分为多个存储桶,并为每个存储桶分配一个单独的群集。 收到新快照后,我们检查目标群集是否有足够的可用资源来运行任务。 如果没有,我们将在其自动扩展组中增加所需的实例数。 然后,AWS自动启动一个适当大小的新实例。 因此,从本质上讲,我们最终得到了六个存储桶,每个存储桶包含适当大小的实例,可以根据需求进行扩展:

亚马逊EC2实例大小

第二个问题是通过扩展来解决自身问题。用于扩展的标准CloudWatch警报基于集群利用不足的情况。 如果集群闲置了足够长的时间,我们会减少所需实例的数量。 “空闲”是根据群集中消耗的内存计算的,如果在45分钟内内存使用率一直低于指定的阈值,则立即扩展并终止额外的实例。

这里也有一个警告:在自动扩展组中进行扩展时,AWS选择一种特殊的方式来终止实例。 例如,如果一个群集有两个实例,其中一个实例处于空闲状态,而另一个实例正在运行分析,则完全有可能该活动实例将被杀死而不是空转一个实例。

放大问题的解决方案是,在分析期间,我们为执行该扩展的特定实例设置了放大保护 。 开始分析时,我们设置标志,并在完成后将其删除。 自动缩放不会终止受保护而无法放大的实例。 最后一点就足够了,从那以后我们就开始平稳运行。

找到了两个问题的解决方案,我们得到了预期的结果。 更改后,队列中等待的时间现在如下所示:

弹性基础设施的好处

带走

这是少数情况下的一种,您可以提高应用程序的性能,并减少容量需求以降低成本。 在大多数情况下,您必须为提高性能付出很大的代价,因此人们可以欣赏这些时刻。 现在,按需计算比以往任何时候都容易,因此也许您可以以类似的方式优化应用程序。

而且,如果除了弹性基础架构的有趣案例之外,该帖子还引发了人们对如何获得应用程序内存使用透明性的兴趣,那就继续免费试用Plumbr试用一下。

翻译自: https://www.javacodegeeks.com/2016/05/elastic-infrastructure-practice.html

弹性架构

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

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

相关文章

linux的ctrl alt f6的作用,Linux(Centous6.4)操作系统中,快捷键Alt+Ctrl+F10是什么作用?...

满意答案John_05152017.07.16一些常用快捷键切换到第一个文本终端。在Linux 下你可以有多达六个不同的终端。这个命令的意思是:“同时按住键和键,然后按键,再释放所有的键”。(n1..6):切换到第n个文本终端。(你也可以使用不是很经…

【TCP丢包重传】

TCP丢包重传机制如果在网络状况最糟糕的情况下就会造成极大的延迟。或者超过2min断开连接。如果这种场景下可以采用UDP。UDP需要解决包的重新排序,丢包等问题。

前端H5怎么切换语言_「自学系列一」HTML5大前端学习路线+视频教程完整版

全新Java、HTML5前端、大数据、Python爬虫、全链UI设计、软件测试、Unity 3D、Go语言等多个技术方向的全套视频。面对这么多的知识点,有的盆友就麻爪了……我是谁?我该从哪里开始看?我该怎么看?我该看多少?这&#xff…

r语言在linux下取数据,菜鸟第一步,跪在数据处:R语言读取数据

1. 温故知坑实践是学习知识的最好途径。之前我讲的内容都非常非常基础,包括:(1)什么是R语言?R语言和Rstudio软件的安装,Rstudio的界面介绍;(2)R语言的基本逻辑,基本数据类型;(3)ggplot基础绘图&…

c语言 桌面程序_C语言编程工具:Dev - C++ 简单安装和使用!新手福利!

工欲善其事,必先利其器。——《论语》# 写在前面有关编译器和开发工具可以查看历史文章。# 下载Dev-C操作系统建议Windows 7或10,直接搜索Dev-C下载,或者sourceforge官网下载链接:https://sourceforge.net/projects/orwelldevcpp/…

stub_AccuREST Stub Runner发布

stub最近发布时间不错! 我在Too Much Coding博客上的博客更多是关于发布,然后是关于任何具体主题;) 在作为Brixton RC1的一部分发布Spring Cloud Sleuth之后,我们刚刚发布了AccuREST 1.0.4版本。 我们修复了一些错误,…

kali linux wifi监听模式,无线渗透教程1:监听无线网络

第一:配置管理无线网卡1.1这里,我们使用tplink wn722n, kali linux插上即用,无需安装驱动。1.2Vmare虚拟机配置如下:如网卡插入到电脑后,先将虚拟机设置成桥接模式之后对虚拟机进行配置之后呢,我们在终端窗…

matlab的7.3版本是什么_王者荣耀:玩不好元歌的3大原因,无论什么版本,元歌起码T1.5_电竞...

很多高段位元歌并不是以秀为核心的,而是他们就像一个冷静的杀手,在一闪即逝却又最合适的时机里,他能正确的选择进场的方式,以及击杀的方式。说白了,元歌的进场手段并没有多少,什么时候用傀儡433上去锁人&am…

【WebRTC---入门篇】(一)WebRTC整体架构

1.绿色部分是WebRTC核心部分(核心库) 2.紫色部分是JS提供的API(应用层) 整体是应用层调用核心层。 核心层,第一层 C++ API 提供给外面的接口。最主要的是(PeerConnedtion 对等连接)。 核心层,第二层 Session 上下文管理层(音视频)。 核心层,第三层[最重要的…

python 创建空的numpy数组_数据分析-NumPy内置函数创建数组

微信公众号:yale记关注可了解更多的教程问题或建议,请公众号留言。背景介绍今天学习使用numpy的内置函数arange()、ones()、zeros()、linspace() 等内置函数创建数组,对于使用数据结构和多维列表非常有用,可以节省大量的时间。入门…

使用t-sql语句修改表中的某些数据及数据类型。_数据库基本理论详细介绍

1、数据库范式第一范式:列不可分,eg:【联系人】(姓名,性别,电话),一个联系人有家庭电话和公司电话,那么这种表结构设计就没有达到 1NF;第二范式:有主键,保证完全依赖。eg…

【WebRTC---入门篇】(三)WebRTC运行机制

轨和流 Track 轨:音频轨和视频轨是不相交的 MediaStream 媒体流:中包含多个音视频轨 WebRTC重要类 MediaStream 负责添加N个轨,加入到RTCPeerConnection RTCPeerConnection 核心 RTCDataChannel 非音视频数据,通过RTCP…

a - 数据结构实验之串一:kmp简单应用_【在线教学示范课案例】数据结构(刘航)...

一、教师简介刘航,网络空间安全学院教师,本科生“数据结构”、“算法设计综合实验” 和研究生“算法设计与优化”课程的主讲教师。近年来积极开展了教学与考核模式改革、探究式/研究型课程等课程改革探索,探索课程、学科竞赛和项目相结合的科…

【WebRTC---入门篇】(四)WebRTC设备管理

enumerateDevices API用来获取音视频设备 JS使用单线程处理,为了避免阻塞。使用异步调用Promise。handle为处理函数,处理主要逻辑。成功调用resolve;失败调用reject。Promise可以注册两个方法 then(逻辑处理成功会收到on_resolve) 和 catch(…

【音视频安卓开发 (六)】Android GLSurfaceView播放视频

GLSurfaceView渲染RGB的数据,利用双缓冲空间机制。取出缓冲地址,将要渲染的数据copy到缓冲地址. 获取Surface Java部分: SurfaceView控件设置到界面中显示 SurfaceView定义一个类来实现 package com.example.hello;import android.content.Context; import android…

什么是openstack_您在OpenStack Summit 2016上错过了什么

什么是openstack今年,我第一次参加了4月25日至29日在德克萨斯州奥斯汀举行的OpenStack峰会。 今天结束了,我要回家了,我想回顾一下,从我的角度分享你错过的事情。 作为以应用程序开发人员为重点的技术传播者,转移到包…

python链表实现栈_使用python实现数组、链表、队列、栈

引言 什么是数据结构? 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。 简单来说,数据结构就是设计数据以何种方式组织并存储在计算机中。 比如:列表,集合和字典等都是数据结构 N.W…

drools6.5_Drools 6.4.0.Final提供

drools6.5最新和最出色的Drools 6.4.0.Final版本现已可供下载。 这是我们先前构建的增量版本,对核心引擎和Web工作台进行了一些改进。 您可以在此处找到更多详细信息,下载和文档: Drools网站 资料下载 文献资料 发行说明 请阅读下面的…

【音视频安卓开发 (八)】OpenSLES播放音频步骤和接口讲解

OpenSLES是安卓内部的音频播放和录音 初始化引擎 创建输出设备 配置PCM格式信息 初始化播放器 播放和缓冲队列 本文开源项目下载