实践中的弹性基础架构

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

背景

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

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

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

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

垂直记忆快照示例

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

在这种特殊情况下,我们发现包含ProbeDataProcessingTasks的处理队列的大小已增长到近1 GB。 了解应归咎于哪些数据结构使解决该问题变得微不足道。 结果,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/353700.shtml

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

相关文章

notepad++插件实现json、xml格式化

notepad比较出色的免费的数据编辑、格式化工具。。。 现在json、xml文件很流行、格式化也是必须的,方便查看关键信息! 01、下载notepad及相关插件 npp_7.5.5-x86: https://files.cnblogs.com/files/xiaochina/npp_7.5.5-x86.zip npp-json:…

ActiveMQ 5.x中的消息持久性

我被问了很多关于ActiveMQ如何存储消息(或在某些情况下不存储)的基本知识。 这是它的高级解释。 注意,上下文在JMS中。 如果您使用ActiveMQ的非JMS客户端(即STOMP,AMQP,MQTT等),则在…

一个select元素自定义设计的新思路:appearance: none之后利用符号制造小箭头

最近工作时解决了一个前端小问题(如下图所示):在Safari中,select的控件之上有不和谐的灰色部分。 刚开始时我以为是backgrand或是border设置不当之类产生的问题,在搜索了很久之后终于找到了问题所在:这个灰…

调整HashMap的大小:未来的危险

最近,我偶然发现了一个错误,该错误是由于多个线程对java.util.HashMap的使用不当引起的。 该错误是抽象泄漏的一个很好的例子。 只有了解数据结构的实现级别详细信息,才能帮助我解决当前的问题。 因此,我希望分享我所面临的问题将…

别的程序员是怎么读你的简历的

别的程序员是怎么读你的简历的 2009年11月9日 陈皓 下面这个图片来源国外,是一个关于程序员面试时的简历,被人事部门和程序员本身评审的角度不同的图片。当然,这是一个从国外面试的视角制作的图片,不过,可以看出&#…

Zabbix linux agent 安装

系统:Linux Centos 7.3 x64 服务:Zabbix_agent 3.0.16 一.安装Zabbix_agent 服务 1.安装zabbix 3.0 yum源 rpm -ivh http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm 2.安装Zabbix_agent yum install zabbix-agen…

直接在apk中添加资源的研究

原文 http://blog.votzone.com/2018/05/12/apk-merge.html 之前接手过一个sdk的开发工作,在开发过程中有一个很重要的点就是尽量使用代码来创建控件,资源文件最好放到assets目录下,如果必须使用res资源,需要通过 getResources().g…

JavaFX实际应用程序:SkedPal

“真实世界的应用程序”系列中的一个新条目。 这次是SkedPal ,这是一个用于智能管理忙人生活的应用程序。 我一直在咨询SkedPal团队有关JavaFX的事宜,并且在他们决定开始使用我的CalendarFX框架来满足他们的日历要求时,我也在咨询他们。 在下…

chromium之histogram.h

histogram不知道是干啥的 // Histogram is an object that aggregates statistics, and can summarize them in // various forms, including ASCII graphical, HTML, and numerically (as a // vector of numbers corresponding to each of the aggregating buckets). google翻…

viewobject_只读ViewObject和声明性SQL模式

viewobject介绍 声明式SQL模式被认为是基于实体的视图对象的最有价值的优点之一。 在这种模式下,根据UI中显示的属性在运行时生成VOSQL。 例如,如果某个页面包含一个只有两列EmployeeId和FirstName的表,则查询将生成为“从Employees中选择Emp…

MyEclipse6.0 安装axis2插件, 调用加密的SAP webservice

MyEclipse6.0 安装axis2插件, 调用加密的SAP webservice 6人收藏此文章, 我要收藏 发表于1个月前(2013-06-06 09:41) , 已有116次阅读 ,共0个评论 首先鄙视一下自己,还在用myeclipse,竟然还是6.0版本,没办法,用习惯了&#xff0c…

Eclipse中要导出jar包中引用了第三方jar包怎么办

Eclipse中要导出jar包中引用了第三方jar包怎么办 (2009-07-20 15:28:44) 转载▼标签: it 分类: Eclipse 今天做个小的java程序,想要先将其导出成一个可执行的jar包!向往常一样,单击菜单栏中的 File -> export,弹出…

拖动滑块拼图背景图没显示_计划B? 那是计划N…没什么。 拼图于2015年问世

拖动滑块拼图背景图没显示真是一天 当典型的欧洲人逐渐破产时,美国的人们开始喝咖啡。 这就是为什么我在Mark Reinhold最近的新闻中睡个好觉的原因。 他在题为“ Project Jigsaw:火车晚点 ”的帖子中建议将Project Jigsaw推迟到下一个版本Java 9。 在最近…

java keytool证书工具使用小结

Keytool 是一个Java数据证书的管理工具 ,Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中在keystore里,包含两种数据:密钥实体(Key entity)-密钥(secret key&a…

在Kafka中发布订阅模型

这是第四个柱中的一系列关于同步客户端集成与异步系统( 1, 2, 3 )。 在这里,我们将尝试了解Kafka的工作方式,以便正确利用其发布-订阅实现。 卡夫卡概念 根据官方文件 : Kafka是一种分布式的&…

深入理解C++中的mutable关键字

2006-12-16 05:00 来源:BLOG 作者:寒星轩 责任编辑:方舟yesky 评论(32)推荐:经典教程专区mutalbe的中文意思是“可变的,易变的”,跟constant(既C中的const)是反义词。在C中&…

使用Boxfuse为您的REST API设置https

在我的上 一篇 文章中,我展示了在Boxfuse的帮助下,基于Spring Boot框架建立REST API并在AWS上运行非常容易 。 下一步是利用SSL与API进行通信。 通过使用SSL,我们确保在REST API服务器和API客户端之间的传输过程中保存了数据 。 要为Spring B…

Python类与对象实验

一、任务描述 本实验任务主要对Python类与对象进行一些基本操作,通过完成本实验任务,要求学生熟练掌握Python类与对象的关系,并对Python类与对象的基本操作进行整理并填写工作任务报告。 二、任务目标 1、掌握Python类的创建 2、掌握类对象 三…

matlab 五点三次平滑算法

(2012-04-23 21:01:31) 转载▼标签: 杂谈 分类: matlab http://www.ilovematlab.cn/thread-71818-1-1.html 这里提供一个函数mean5_3(五点三次平滑算法)对数据进行平滑处理: load V1.mat subplot 211; plot(V1); ylim([2000 7000]); grid; y…

您在2016年OpenStack峰会上错过的事情

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