aws高额账单_取消堆放以提高延迟并减少AWS账单

aws高额账单

大多数性能问题可以通过几种不同的方式解决。 多数人都容易理解和应用许多适用的解决方案。 一些解决方案(例如从JVM管理的堆中删除某些数据结构)更加复杂。 因此,如果您不熟悉此概念,我建议您继续学习我们最近如何减少应用程序的延迟以及如何将Amazon AWS费用减少一半。

我将从解释需要解决方案的上下文开始。 如您所知, Plumbr密切关注每次用户交互。 这是使用部署在处理交互的应用程序节点旁边的代理来完成的。

这样做时,Plumbr代理会从此类节点捕获不同的事件。 所有事件都发送到中央服务器,并组成我们称为事务的事务。 事务包含多个属性,包括:

  • 交易的开始和结束时间戳;
  • 执行交易的用户的身份;
  • 执行的操作(将项目添加到购物车,创建新发票等);
  • 该操作所属的应用程序;

在我们面临的特定问题的背景下,重要的是概述仅将对实际值的引用存储为事务的属性。 例如,不是存储用户的实际身份(例如电子邮件,用户名或社会保险号),而是在交易本身旁边存储对此类身份的引用。 因此,事务本身可能如下所示:

ID 开始 结束 应用 操作方式 用户
#1 12:03:40 12:05:25 #11 #222 #3333
#2 12:04:10 12:06:00 #11 #223 #3334

这些参考与对应的人类可读值对应。 通过这种方式,可以维护每个属性的键-值映射关系,从而可以将ID为#3333和#3334的用户分别解析为John Smith和Jane Doe。

这些映射在运行时期间使用,当访问事务的查询将用人类可读的引用数据替换引用时:

ID 开始 结束 应用 操作方式 用户
#1 12:03:40 12:05:25 www.example.com /登录 约翰·史密斯
#2 12:04:10 12:06:00 www.example.com /购买 简·多伊

天真的解决方案

我敢打扰,我们的读者中的任何人都可以闭上眼睛来想出一个简单的解决方案。 选择一个自己喜欢的java.util.Map实现,将键值对加载到Map并在查询期间查找引用的值。

当我们发现我们选择的基础架构(具有存储在Kafka主题中的查找数据的Druid存储)已经通过Kafka查找开箱即用地支持此类Maps时,觉得容易的事情变得微不足道。

问题

幼稚的方法为我们服务了一段时间。 一段时间后,随着查找映射的大小增加,需要查找值的查询开始花费越来越多的时间。

我们在吃自己的狗粮并使用Plumbr监视Plumbr本身时注意到了这一点。 我们开始看到在Druid Historical节点上,GC暂停越来越频繁且更长,为查询提供服务并解决查找问题。

显然,一些最有问题的查询必须从地图中查找超过100,000个不同的值。 这样做的时候,查询被GC启动打断,并且超出了以前不到100ms的查询持续时间,超过了10秒钟。

在寻找根本原因的同时,我们让Plumbr从此类有问题的节点公开了堆快照,确认长时间的GC暂停后大约70%的已用堆已被查找表完全消耗了。

同样明显的是,该问题还需要考虑另一个方面。 我们的存储层基于节点集群,集群中为查询提供服务的每台计算机都运行多个JVM进程,而每个进程都需要相同的参考数据。

现在,考虑到所讨论的JVM具有16G堆并有效地复制了整个查找映射,因此这也已成为容量规划中的一个问题。 支持越来越大的堆所需的实例大小开始在我们的EC2账单中付出了代价。

因此,我们不得不提出一种不同的解决方案,既减轻了垃圾收集的负担,又找到了一种降低Amazon AWS成本的方法。

解决方案:编年史地图

我们实施的解决方案基于Chronicle Map构建。 编年史地图在内存键值存储区中处于堆外状态。 正如我们的测试所示,存储的延迟时间也非常长。 但是,我们选择Chronicle Map的主要优势在于它能够跨多个流程共享数据。 因此,除了将查找值加载到每个JVM堆之外,我们只能使用集群中不同节点访问的映射的一个副本:

在进入细节之前,让我为您提供编年史地图功能的高级概述,我们发现它特别有用。 在编年史地图中,数据可以保存到文件系统中,然后由任何并发进程以“查看”模式访问。

因此,我们的目标是创建一个具有“编写者”角色的微服务,这意味着它将将所有必需的数据实时持久地保存到文件系统中,并作为“读取器”的角色(即我们的Druid数据存储)。 由于Druid不支持现成的Chronicle Map,因此我们实现了自己的Druid扩展 ,该扩展能够读取已经持久保存的Chronicle数据文件,并在查询期间以人类可读的名称替换标识符。 以下代码提供了一个有关如何初始化编年史地图的示例:

ChronicleMap.of(String.class, String.class)
.averageValueSize(lookup.averageValueSize)
.averageKeySize(lookup.averageKeySize)
.entries(entrySize)
.createOrRecoverPersistedTo(chronicleDataFile);

在初始化阶段需要此配置,以确保Chronicle Map根据您预测的限制分配虚拟内存。 虚拟内存预分配不是唯一的优化,如果像我们一样将数据持久化到文件系统中,您会注意到创建的Chronicle数据文件实际上是稀疏文件 。 但这将是一个完全不同的帖子的故事,因此我不会深入探讨这些。

在配置中,您需要为尝试创建的编年史地图指定键和值类型。 在我们的例子中,所有参考数据都是文本格式,因此我们为键和值都指定了String类型。

在指定键和值的类型之后,Chronicle Map初始化还有更多有趣的部分是独特的。 正如方法名称所暗示的, averageValueSizeaverageKeySize都要求程序员指定期望存储在Chronicle Map实例中的平均键和值大小。

通过方法条目,您可以为Chronicle Map提供可以存储在实例中的预期数据总数。 也许有人会怀疑,如果随着时间的推移,记录数量超过预定义的大小会发生什么? 显然,如果超过了配置的限制,则在最后输入的查询上可能会遇到性能下降。

当超出预定义的条目大小时,还要考虑的另一件事是,如果不更新条目大小,则无法从Chronicle Map文件中恢复数据。 由于Chronicle Map在初始化期间会预先计算数据文件所需的内存,因此,如果条目大小保持不变,并且实际上文件中包含的内容(比如说多4倍的条目),则数据将无法容纳到预计算的内存中,因此Chronicle Map初始化将失败。 如果要在重启后正常运行,请务必牢记这一点。 例如,在我们的场景中,当重新启动持久化来自Kafka主题的数据的微服务时,在初始化Chronicle Map实例之前,它会根据Kafka主题中的消息量动态计算数量条目。 这使我们能够在任何给定时间重新启动微服务,并使用更新的配置恢复已持久保存的Chronicle Map文件。

带走

使Chronicle Map实例能够在几微秒内读写数据的不同优化立即开始产生良好的效果。在发布基于Chronicle Map的数据查询后几天,我们已经看到了性能改进:

此外,从每个JVM堆中删除查找映射的冗余副本可以显着减少存储节点的实例大小,从而在我们的Amazon AWS账单中产生明显的凹痕。

翻译自: https://www.javacodegeeks.com/2017/02/going-off-heap-improve-latency-reduce-aws-bill.html

aws高额账单

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

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

相关文章

Iphone 手机如何导入/导出通讯录

打开苹果云官网,选择「通讯录」,点击左下角的「设置」,可以看到导入/导出菜单 点击进入 icloud 官网

intellij远程调试_IntelliJ中的远程调试Wildfly应用程序

intellij远程调试远程调试Java应用程序意味着使用本地开发环境连接到远程运行的应用程序。 Java开箱即-agentlib:jdwp[options]支持远程调试:目标应用程序必须使用-agentlib:jdwp[options]选项执行, -agentlib:jdwp[options]选项加​​载Java调试线协议&…

微信小程序注册/登录接口开发

文章目录后端有关说明前端有关说明接口设计小程序注册/登录接口APP 注册/登录接口PC Web 端的注册/登录接口小程序注册/登录序列图校验 token后端有关说明 登录和注册的逻辑要独立抽取写成2个接口:注册接口、登录接口 小程序、APP、PC端的登录接口和注册接口要分开…

couchbase_使用Portworx和Couchbase的有状态容器

couchbase容器本应是短暂的,因此可以很好地扩展以用于无状态应用程序。 有状态的容器(例如Couchbase)需要区别对待。 管理Docker容器的持久性概述了如何管理有状态容器的持久性。 该博客将说明如何使用Docker Volume Plugins和Portworx创建有…

在 MyEclipse 中配置 tomcat

在 IDE 配置 tomcat 实则就是让 IDE 来管理 tomcat 配置 步骤 1 点击工具栏上的“Run/Stop/Restart MyEclipse Servers”图标旁边的下拉箭头 步骤 2 选择“Configure Server” 步骤 3 在弹出的对话框“Preferences”中展开“MyEclipse” – “Servers” – “Tomcat”–“To…

java 中怎么加汉字,jquery怎么向body里面增加文字

jquery如何向里面增加文字jsp代码是这样的:我想在页面加载时动态的将一行文字增加到里面,不知道为什么总是加不进去,js代码如下:$(document).ready(function(){if($("#type").val()"MESSAGE") {$(".ke-t…

MacBook 推出移动硬盘时总是提示有程序在使用它,如何解决?

如下图所示: 先使用命令 df -lh 在终端查看当前系统的所有硬盘,命令如下: liaowenxiongliaowenxiongdeMacBook-Air ~ % df -lh Filesystem Size Used Avail Capacity iused ifree %iused Mounted on /dev/disk1s5s1 234Gi…

java登录界面命令_Java命令行界面(第5部分):JewelCli

java登录界面命令细算在Java命令行处理与Apache的百科全书CLI , args4j , jbock和命令行中先前的文章,我把注意力转向在这个岗位使用JewelCli完成的命令行参数相似的处理Java中。 几个Java命令行处理库使用批注来定义命令行选项。 到目前为止…

matlab 三维图像配准,[转载]Matlab实现多种图像配准(转)

本文讲述如何利用Matlab Image Processing Toolbox中的图像配准工具实现线性正投影、仿射、投影、多项式、分段线性、局部加权平均配准的过程。实验平台X86 PC,Windows XP sp2, Matlab 7.1资源的获取matlab工具的使用方法:查看帮助mage Processing Toolb…

oauth2和jwt_OAuth2,JWT,Open-ID Connect和其他令人困惑的事物

oauth2和jwt免责声明 如果觉得我必须从一个重要的免责声明开始这篇文章: 不要太相信我要说的话。 我之所以这样说,是因为我们正在讨论安全性。 而且, 当您谈论安全性时,除了100%正确的陈述外,还有冒任何其他…

matlab的exec程序,C++调用Matlab画图的一段程序

劳动节闲来无事,写了一天程序,just for fun.看,这是C调用Matlab画图的一段程序。暂时不想多解释了,有兴趣的话,看看下面的代码吧。以下几段代码由上到下,越来越旧。最上面的是最新更新的版本。#include#inc…

java args_Java命令行界面(第2部分):args4j

java args在上一篇文章中 ,我研究了使用Apache Commons CLI在Java应用程序中解析命令行参数。 在本文中,我将使用另一个库args4j进行相同的操作。 args4j采用了一种不同于Commons CLI的方式来指定Java应用程序应期望的命令行参数。 尽管Commons CLI期望…

apache camel_Apache Camel中的短重试与长重试

apache camel《骆驼设计模式》一书介绍了20种模式以及用于设计基于Apache Camel的集成解决方案的众多技巧和最佳实践。 每种模式都基于真实的用例,并提供了Camel特定的实现细节和最佳实践。 为了让您有这本书的感觉,以下是该书的重试模式摘录&#xff0c…

mega5安装包_[MEGA DEAL] 2017年完全Java捆绑包(95%折扣)

mega5安装包深入了解编程奥德赛(58小时!),进入最常用的编程语言 嘿,怪胎, 本周,在我们的JCG Deals商店中 ,我们提供了一个极端的报价 。 我们提供的2017 Complete Java Bundle 仅…

matlab计算微分ppt,matlab-ch013(数值计算-微积分)20090923.ppt

matlab-ch013(数值计算-微积分)20090923.ppt 第13讲 数值计算 —微积分,张建瓴,13.1 数值积分,在工程教学和应用中,除了进行数据逼近外,还要求逼近曲线下面的面积,这就是积分问题。,一、数值积分方法,典型的数值积分方法有:用常数…

JDK 9中不推荐使用Java的Observer和Observable

在博客文章《 应用JDK 9 Deprecated增强功能》中 ,我讨论了JDK 9中 Deprecated批注中对forRemoval()和since()可选元素(方法)的添加 。 我在那篇文章中说:“在Java SE API上应用新的…

WorkPlus一站式协同解决方案,助力企业降本增效

在企业数字化转型的过程中,很多企业都会遇到一个共同问题:重复建设基础功能,耗费大量时间和资源。为解决这一难题,WorkPlus已经将一些通用、基础且有技术门槛的功能进行了集成与开发,如IM(即时通讯&#xf…

linux在oracle新建表,Oracle创建表及管理表

1. Oracle表的创建及管理创建表包括三个要素,表名,列名,数据类型。每个表都有对应不同的列,每个列都有唯一对应的数据类型。常用数据类型简介:数据类型描述CHARACTER(n)字符/字符串。固定长度 n。INTEGER(p)整数值(没有…

Linux 命令之 top -- 实时显示进程动态/查看进程信息

文章目录介绍常用选项交互命令参考示例示例 1:直接输入命令 top 就可以动态显示进程信息统计参数信息详解进程属性说明(即进程列表的字段说明)其它1.在 top 基本视图中,按键盘数字 1 可以监控每个逻辑 CPU 的状况2.敲击键盘 b&…

oracle同步恢复目录,Oracle创建恢复目录(catalog)

Oracle创建恢复目录(catalog),在catalog数据库上创建cat用户的表空间。Oracle创建恢复目录1.在catalog数据库上创建cat用户的表空间SQL> create tablespace cat datafile /home/oracle/oradata/orcl/cat.dbf size 512M;2.创建cat用户SQL> Create user cat ide…