串行内存消耗 并行内存_如何估算内存消耗?

串行内存消耗 并行内存

这个故事可以追溯到至少十年之前,当时我第一次接触PHB时遇到一个问题:“在生产部署中,我们需要购买多大服务器”。 我们正在构建的新的,闪亮的系统距离生产开始还有9个月的时间,显然该公司已承诺提供包括硬件在内的整个解决方案。

天哪,我有麻烦了。 凭借几年的经验,我几乎可以掷骰子了。 尽管我确信我完全缺乏信心是显而易见的,但我仍然不得不想出答案。 四个小时的谷歌搜索之后,我想起坐在那里,同样的问题仍然徘徊在我眼花bed乱的脸前:

“如何估算对计算能力的需求?”

在本文中,我为您提供了有关如何估算全新Java应用程序的内存需求的粗略指导,从而开始了这一主题。 对于不耐烦的用户,答案是从大约等于5 x [Live Data占用的内存量]的内存开始,然后从那里开始进行微调。 对于那些对背后的逻辑更加好奇的人,请留在我身边,我将带您进行推理。

首先,我只能建议避免在没有详细信息的情况下回答这样的问题。 您的答案必须基于性能要求,因此,即使没有先澄清这些要求也不要开始。 我的意思不是太含糊的“系统需要支持700个并发用户”,而是考虑到数据量和使用模式而提出的有关延迟和吞吐量的更多具体说明。 也不要忘记预算-我们所有人都可以梦到亚毫秒级的延迟,但是那些没有HFT银行骨干预算的人们-不幸的是,这只是一个梦想。

现在,假设您已具备这些要求。 下一站将是创建模拟用户行为的负载测试脚本。 如果现在可以同时启动这些脚本,那么您已经为答案奠定了基础。 正如您可能已经猜到的那样,下一步涉及我们通常建议的不要猜测的建议。 但是要注意。

实时数据大小

即,我们追求最佳内存配置需要捕获实时数据大小。 捕获了这一点之后,我们就可以进行微调的基线配置了。

如何定义实时数据大小? Charlie Hunt和Binu John在他们的“ Java Performance ”书中给出了以下定义:

实时数据大小是在稳定状态下运行应用程序所需的一组长期对象消耗的堆大小。

有了定义,我们准备在打开GC日志记录的情况下对应用程序运行负载测试(-XX:+ PrintGCTimeStamps -Xloggc:/tmp/gc.log -XX:+ PrintGCDetails),并可视化日志(使用例如gcviewer的帮助)来确定应用程序达到稳定状态的时间。 您所追求的类似于以下内容:

规划能力

我们可以在熟悉的双锯齿图形中看到GC在次要GC和Full GC运行中都能完成工作。 在第21秒运行第一个完整GC之后,该特定应用程序似乎已经达到稳定状态。 但是,在大多数情况下,需要10到20个完整GC运行才能发现趋势变化。 在运行了四个完整的GC之后,我们可以估计实时数据大小大约等于100MB。

前面提到的Java Performance书现在表明,在典型的Java EE应用程序中,“实时数据大小”与最佳内存配置参数之间存在很强的相关性。 该领域的证据也支持他们的建议:

将最大堆大小设置为3-4 x [实时数据大小]

因此,对于当前的应用程序,我们应该将-Xmx设置为介于300m和400m之间,以进行初始性能测试,然后从那里开始进行测试。

我们对本书中的其他建议有不同的看法,建议将最大永久代大小设置为1.2-1.5 x [永久代的实时数据大小],并将-XX:NewRatio设置为[[实时数据大小]。 目前,我们正在收集更多数据以确定正相关性是否存在,但是在此之前,我建议您将生存和简化配置的决定基于监视分配率。

您现在可能会问为什么要打扰。 的确,有两个原因不引起立即关注:

  • 在撰写本文时,8G内存芯片的价格不到100美元
  • 虚拟化,特别是在使用大型供应商(例如Amazon AWS)时,使调整容量变得容易

这两个原因都是部分有效的,并且肯定减少了精确配置的需求。 但是他们两个仍然把你置于危险区域

  • 当“以防万一”投入大量内存时,您很可能会显着影响延迟-进入8G以上的堆时,引入跨越数十秒的Full GC暂停非常容易。
  • 当以“稍后再调整”的思想进行过度配置时,“后期”部分趋向于永不满足。 正因为如此,我面对了许多在预置环境上运行的应用程序。 例如,我发现在Amazon EC2 m1.xlarge实例上运行的上述应用程序使该公司每年每实例花费4,200美元。 将其转换为m1.small可以使实例的账单减少到520美元。 如果您的部署规模很大,则可以从您的运营预算中看到8倍的成本降低,请相信我。

摘要

不幸的是,我仍然看到太多的决策完全像十年前我被迫做的那样。 这会导致容量规划不足和规划过度,两者都是同样糟糕的选择,尤其是在您无法享受虚拟化优势的情况下。

我很幸运,但是您可能不会与您的客户见面,所以我只建议您使用本文中描述的简单框架进行实际计划。

参考: 如何估算内存消耗? 由我们的JCG合作伙伴 Nikita Salnikov Tarnovski在Plumbr Blog博客上获得。

翻译自: https://www.javacodegeeks.com/2014/01/how-to-estimate-memory-consumption.html

串行内存消耗 并行内存

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

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

相关文章

Java,JavaFX的流畅设计风格滑块

JMetro的Java,JavaFX主题版本刚刚提高到4.2版。 此版本为Slider控件带来了新样式。 除此之外,您现在还可以看到一个弹出窗口,向您显示滑块的当前值。 新滑块样式 以下是旧的JMetro Slider样式: 滑块OLD JMetro灯光主题 滑块OLD…

如何利用ide进行跟踪调试_使用调试器进行事后跟踪

如何利用ide进行跟踪调试我最近一直在使用的大多数调试器的好功能是能够在断点上记录信息。 这对于理解代码而无需修改是非常有用的,因为它涉及字节码修改。 让我们考虑一下这种非常琐碎且效率低下的函数实现,以返回斐波那契数列中的第n个数字。 publi…

马尔可夫Markov决策过程 MDP、马尔可夫奖励过程MRP

引言 在概率论及统计学中,马尔可夫过程(英语:Markov process)是一个具备了马尔可夫性质的随机过程,因为俄国数学家安德雷马尔可夫得名。马尔可夫过程是不具备记忆特质的(memorylessness)。换言…

母函数(Generating function)、矩母函数(Moment Generating Function)

1. 简介 在数学中,某个序列的母函数(Generating function,又称生成函数)是一种形式幂级数,其每一项的系数可以提供关于这个序列的信息。使用母函数解决问题的方法称为母函数方法。 母函数可分为很多种,包括普通母函数、指数母函…

Lambda表达式Java教程

在本文中,我们提供了全面的Lambda Expressions Java教程。 1. Lambda Expressions Java教程–简介 Lambda表达式被认为是Java 8中引入的最好的功能之一。Lambda表达式被认为是Java进入函数式编程世界的第一步 。 可以将其视为无需类即可创建的函数。 它也可以像参数…

随机过程

第一部分:为什么要研究随机过程? 人类认识世界的历史,就是一认识和描绘各种运动的历史,从宏观的天体运动到分子的运动,到人心理的运动-我们通称为变化,就是一个东西随时间的改变。 人们最成功的描绘运动的…

java steam_Java,Steam控制器和我

java steam您是否想过是否可以将现有的东西用于新的东西? 我看了一些所谓的“蒸汽控制器”(从现在开始为SC)的镜头,并看着我的游戏手柄。 问我自己是否有可能以类似蒸汽的方式使用它,我找到了一些Java库并创建了一个项…

如何在STS中创建Spring Boot项目

你好朋友, 在本教程中,我们将逐步介绍如何在STS(Spring工具套件)中创建Spring Boot项目。 步骤1: 如果您尚未从相应的操作系统的以下链接中下载Spring工具套件,请下载: https://spring.io/to…

置信区间(confidence interval)

要理解置信区间,就要从统计学最基本最核心的思想去思考,那就是用样本估计总体。 置信水平(Confidence level)是指总体参数值落在样本统计值某一区内的概率; 而置信区间(confidence interval)是指在某一置信水平下&…

卫星运动轨道

地球的自转轴与地球公转平面并不垂直,因此,黄道面和地球赤道面并不重合,而是有大约23.4的夹角,通常被称为黄赤交角,也称为转轴倾角、倾角(obliquity)或轴交角(axial inclination&…

随机过程:指数分布、泊松过程、更新过程(renewal process)+大数定律

笔记主要基于中文版《应用随机过程 Introduction to Probability Models 》(Sheldon M. Ross),只有非常少的一部分是我自己的注解。写这个笔记的目的是自己复习用,阅读需要一定的微积分和概率论基础。本人为初学者,且全部为自学,如…