弹性架构

几周前,我获得了一个难得的机会,可以在基础设施领域中沾沾自喜。 在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自动启动一个适当大小的新实例。 因此,从本质上讲,我们最终得到了六个存储桶,每个存储桶包含适当大小的实例,可以根据需求进行扩展:

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

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

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

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

带走

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

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

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

弹性架构

弹性架构_实践中的弹性基础架构相关推荐

  1. 边缘计算架构_边缘计算与开放基础架构的重要性

    边缘计算架构 古老的科幻电影描绘了计算机如何渗透到未来生活的方方面面. 它已经过去了,并且几乎没有引起我们的注意:它使家用PC变得司空见惯,我们的手机变成了小型智能设备,并且我们的汽车开始由数千个传感 ...

  2. ai系统架构_人工智能中的模糊逻辑系统架构

    ai系统架构 The Fuzzy Logic System is a system which uses Fuzzy logic for reasoning. Fuzzy Logic is a ver ...

  3. 实践中的弹性基础架构

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

  4. ios开发 mvp实践_实践中开发人员的工作流程-我们如何在30天内建立​​MVP

    ios开发 mvp实践 by Léna Faure 莱娜·福雷(LénaFaure) 实践中开发人员的工作流程-我们如何在30天内建立​​MVP (The developer's workflow i ...

  5. mysql not in优化_实践中如何优化MySQL(收藏)

    SQL语句的优化: 1.尽量避免使用子查询 3.用IN来替换OR 4.LIKE前缀%号.双百分号._下划线查询非索引列或*无法使用到索引,如果查询的是索引列则可以 5.读取适当的记录LIMIT M,N ...

  6. spring架构初学者_完整的厨师和基础架构初学者指南

    spring架构初学者 by Mohak Puri 由Mohak Puri 完整的厨师和基础架构初学者指南 (A complete beginner's guide to Chef and infra ...

  7. tmux系统剪切板_实践中的tmux:与系统剪贴板集成

    tmux系统剪切板 by Alexey Samoshkin 通过阿列克谢·萨莫什金(Alexey Samoshkin) 在实践中使用tmux:与系统剪贴板集成 (tmux in practice: i ...

  8. 工厂模式 构建者模式_实践中的构建者模式

    工厂模式 构建者模式 我将不深入讨论该模式,因为已经有大量的文章和书籍对此进行了详细的解释. 相反,我将告诉您为什么以及何时应该考虑使用它. 但是,值得一提的是,这种模式与< 四人帮>一书 ...

  9. tmux 上滚_实践中的tmux:回滚缓冲区

    tmux 上滚 by Alexey Samoshkin 通过阿列克谢·萨莫什金(Alexey Samoshkin) 实践中的tmux:回滚缓冲区 (tmux in practice: the scro ...

最新文章

  1. 「更高更快更稳」,看阿里巴巴如何修炼容器服务「内外功」
  2. MyBatis 插件原理与自定义插件-猜想
  3. C++ 常见崩溃问题分析
  4. 新mac 下第一次 安装 mongodb 步骤
  5. 网络上总结python中的面试题
  6. 李彦宏、王海峰等成为工程院院士候选人选
  7. Alluxio在多级分布式缓存系统中的应用
  8. 《KAFKA官方文档》入门指南(二)
  9. asp. net sql网上书店管理系统设计作品
  10. 吝啬的国度 ---用vector 来构图
  11. 农业知识图谱(KG):农业领域的信息检索,命名实体识别,关系抽取,分类树构建,数据挖掘...
  12. Unity3D基础9:获取鼠标键盘输入
  13. http请求状态码表示的意义
  14. JMeter基础 —脚本录制工具Badboy介绍
  15. html5网页及Cocos中生成二维码
  16. 东方mmd巨大化_爱丽丝玛格特罗伊德 动漫人物资料
  17. 《指导生活的算法》读后感
  18. word文档加密保护不能编辑问题
  19. 八皇后问题(又名: 高斯八皇后)
  20. java version 1.8下载_JDK1.8下载、安装和环境配置教程

热门文章

  1. 不止代码:机器分配(动态规划)
  2. P6295-有标号 DAG 计数【多项式求逆,多项式ln】
  3. Loj#2880-「JOISC 2014 Day3」稻草人【CDQ分治,单调栈,二分】
  4. P3470 [POI2008]BBB-BBB【线段树,贪心】
  5. 2018/7/6-纪中某C组题【jzoj1192,jzoj1397,jzoj1736】
  6. 2021牛客暑期多校训练营7 J-xay loves Floyd(最短路+bitset优化集合交)
  7. 牛客网暑期ACM多校训练营(第十场)F.Rikka with Line Graph
  8. codeforces 884E Binary Matrix 并查集,滚动数组
  9. 十分钟快速了解 ES6 Promise
  10. Java List面试题汇总