实践中的弹性基础架构

几周前,我获得了一个难得的机会,可以在基础设施领域弄脏双手。 在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,一经查实,立即删除!

相关文章

struct和typedef struct

struct和typedef struct 分三块来讲述:   1 首先://注意在C和C里不同     在C中定义一个结构体类型要用typedef:     typedef struct Student     {     int a;     }Stu;     于是在声明变量的时候就可:Stu stu1;…

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等),则在…

5.报错:ImportError: No module named win32api

pip install pypiwin32即可 转载于:https://www.cnblogs.com/caimuqing/p/9016190.html

bind1st bind2nd的使用

bind1st bind2nd的使用 Posted on 2010-07-16 09:14 wanpengcoder 阅读(1882) 评论(0) 编辑 收藏 bind1st和bind2nd函数用于将一个二元算子(binary functor,bf)转换成一元算子(unary functor,uf)。为了达到…

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

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

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

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

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

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

漫谈C++重载运算符

漫谈C重载运算符 1.前置运算符和后置运算符,左值和右值 其实很久以来一直都没有怎么搞清楚左值和右值的区别,只知道左值可以放在等号的左边,也可以放在等号的右边,但是右值却只能放在等号的右边,然后形成一个大概直观…

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…

io和nio的缓冲_IO与NIO –中断,超时和缓冲区

io和nio的缓冲假设有一个系统有时需要将文件复制到几个位置,但是这种方式在响应能力至关重要的情况下。 换句话说,如果由于某种原因文件系统过载,而我们无法在不到一秒钟的时间内写入文件,它应该放弃。 ExecutorService是一项非常…

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

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

强制类型转换简介

强制类型转换简介 强制类型转换当操作数的类型不同,而且不属于基本数据类型时,经常需要强制类型转换,将操作数转化为所需要的类型。强制类型转换具有两种形式,称为显式强制转换和隐式强制类型转换。强制类型转换不改变原来数据的类…

JavaFX实际应用程序:SkedPal

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

url 特殊字符 传递参数解决方法

url 特殊字符 传递参数解决方法 有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了。下表中列出了一些URL特殊符号及编码。十六进制值 1. URL 中号表示空格 %2B 2. 空格 URL中的空格可以用号或者编码 %20 3.…

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翻…

Java中的功能性FizzBu​​zz Kata

不久前,我使用Java 8流和lambda解决了FizzBu​​zz kata问题。 尽管最终结果是可行的,但中间步骤却没有。 我当然可以做得更好。 与往常一样,让我们​​从失败的测试开始: package remonsinnema.blog.fizzbuzz;import static or…

axis2 wsdl2java 使用方式

axis2 wsdl2java 使用方式(2011-04-15 22:41:43) 说明见:http://hi.baidu.com/aotori/blog/item/ee98efcdc6cc300301e92814.html 用wsdl2java简化客户端的编写 也许有很多读者会说“有没有搞错啊,只调用两个WebService方法用要写这么多代码,…

电脑播放视频的时候有杂音

一开始我还以为是视频本身自带的杂音,但是换了一个其它视频播放测试了一下,发现还是一样的结果。不甘心,又播放了一个音频,结果还是有杂音。 于是想是不是无意中把驱动卸载了,于是下载了驱动精灵补驱动。下载安装之后驱…

Axis2错误

Axis2错误 www.MyException.Cn 发布于:2012-09-18 16:21:42 浏览:70次 Axis2异常异常:java.lang.NoClassDefFoundError: org/apache/neethi/PolicyComponent 缺少:neethi-2.0.4.jar 异常:java.lang.ClassNotFound…