如何估算内存消耗?

这个故事可以追溯到至少十年之前,当时我第一次接触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/365993.shtml

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

相关文章

python爬取b站403_Python如何爬取b站热门视频并导入Excel

代码如下 #encoding:utf-8 import requests from lxml import etree import xlwt import os # 爬取b站热门视频信息 def spider(): video_list [] url "https://www.bilibili.com/ranking?spm_id_from333.851.b_7072696d61727950616765546162.3" html requests.g…

url文件的格式

[DEFAULT]BASEURL[InternetShortcut]URLWorkingDirectoryShowCommandIconIndexIconFileModifiedHotKey  其中BASEURL、URL和WorkingDirectory这3项的含义是不言而明的。ShowCommand规定Internet Explorer启动后窗口的初始状态:7表示最小化,3表示最大化…

vscode 编辑器常用快捷键

最近,打算换个编辑器,而 vscode 是一个不错的选择。大部分快捷键和 sublime 还是很像的,但有些也不一样。特此整理一份小笔记。 参考: vscode: Visual Studio Code 常用快捷键非常全的VsCode快捷键常用快捷键 主命令:c…

linux sudo永久免密码,linux 免密码 使用sudo 直接使用root权限执行命令

1.切换到root用户下,怎么切换就不用说了吧,不会的本身百度去.百度2.添加sudo文件的写权限,命令是:权限chmod uw /etc/sudoers密码3.编辑sudoers文件文件vi /etc/sudoersvi找到这行 root ALL(ALL) ALL,在他下面添加xxx ALL(ALL) ALL (这里的xxx是你的用户名)sudops:这里说下你能…

Derek解读Bytom源码-创世区块

作者:Derek 简介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom 本章介绍Derek解读-Bytom源码分析-创世区块 作者使用MacOS操作系统,其他平台也大同小异 Golang Version: 1.8 创…

使用调试器进行事后跟踪

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

链表排序c++代码_[链表面试算法](一) 链表的删除-相关题型总结(6题)

在数据结构的最高层抽象里,只有两种结构,数组和链表。这两种结构,是所有其他数据结构实现的基础。队列和栈,可以用链表和数组来实现。图,可以用邻接表和邻接矩阵来实现,其中,邻接表就是链表&…

JS原生方法实现jQuery的ready()

浏览器加载页面的顺序: 1、 解析HTML结构 2、 加载外部脚本和样式表文件 3、 解析并执行脚本代码 4、 构造HTML DOM模型ready() 5、 加载图片等组件 6、 页面加载完毕onload() ready事件是在DOM模型构造完毕时触发 load事件是在页面加载完毕后触发 function…

程序员高效工具列表

FQ必备 *** 文件管理器 wox 或者 Listary , everything 截图软件 Snipaste 下载器 Fish 冰点 Markdown 工具 Typora 图床工具 PicGo 思维导图 Xmind 抓包工具 Wireshark 协议工具 Fiddler 接口测试工具 PostMan 剪切板工具 Ditto 害怕截图丢失? 博客园…

c语言如何空格键返回主菜单,C语言中scanf函数与空格回车的用法说明

众所周知,C语言中的scanf函数的作用是从标准输入设备(通常是键盘)读取输入值,并存储到参数列表中指针所指向的内存单元。下面从几个方面说一下一些稍微细节的东西。下面的实验都在vc6.0中通过。1、scanf的返回值scanf通常返回的是成功赋值(从标准输入设备…

Linear_algebra_03_矩阵

1. 矩阵的线性运算: 2.1 矩阵的乘法:Xik * Ykj Zij 2.2 矩阵乘法性质: 3.1 矩阵的幂次方运算 3.2 矩阵转置的运算律 3.3 方阵运算 4 分块矩阵的运算 5. 矩阵的初等变换 5.1 单位矩阵I经过一次初等变换所得到的矩阵称为初等矩阵. 5.2 初等矩…

在Activiti中执行自定义查询

(这可能最终会出现在Activiti 5.15版本的用户指南中,但是我已经想共享它了) Activiti API允许使用高级API与数据库进行交互。 例如,对于检索数据,查询API和本机查询API的用法很强大。 但是,对于某些用例&a…

jquery ready方法实现原理

先看这两句代码:window.addEventListener(load,loaded,false);document.addEventListener(DOMContentLoaded,loaded,false);总结:load事件是在页面所有元素都加载完后触发;DOMContentLoaded,它是指dom tree加载完就触发;防止了页面加载被堵塞…

js转json工具_菜鸟丨Egert3D微信小游戏发布与Unity工具使用

本次教程将会为大家介绍Egret3D工具导出Unity场景对象的使用,以及发布微信小游戏流程。让大家对Egret 3D有更加熟悉的了解。需求工具:1、Unity场景导出插件;2、微信开发者工具。导出插件的使用一、打开需要导出的Unity场景,并且把…

MySQL----示例知识点整理

示例语句: select count(0),hour(c.created_at) from behavior_client_view c join behavior_share son c.share_uuids.uuidwhere s.agent_uuid(select uuid from user where mobile12606666333 and deleted0)and DATE_FORMAT(c.created_at,%Y-%m) >DATE_FORMAT(…

c语言c1变成e并输出,【图片】(原创)用纯C变了个变色输出字符的程序。。。【c语言吧】_百度贴吧...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#include#includemain(){char c;int i,j,k,l,m,n,o;int x,y;char c1;int a,b,d,e;x35;y8;textcolor(13);gotoxy(35,10),cprintf("photoshop2014");textcolor(11);gotoxy(20,11);cprintf(" My name is zhou …

OI杂记

从今天开始记录一下为数不多天的OI历程 8.25 上 今天举行了难得的五校联考,模拟noip,题目的解压密码竟然是$aKnoIp2o18$,对你没有看错!!! 7:50老师?啊啊啊啊,收不到题目啊&#xff0…

ebpf基础篇(二) ----- ebpf前世今生

bpf 要追述ebpf的历史,就不得不提bpf. bpf(Berkeley Packet Filter)从早(1992年)诞生于类Unix系统中,用于数据包分析. 它提供了数据链路层的接口,可以在数据链路层发送和接收数据.如果网卡支持混杂模式,所有的数据包都可以被接收,即使这些数据包的目的地址是其它主机. BPF最为…

Java,Steam控制器和我

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

unknown column in field list_tf.feature_column的特征处理探究

1. 背景tf.estimator是tensorflow的一个高级API接口,它最大的特点在于兼容分布式和单机两种场景,工程师可以在同一套代码结构下即实现单机训练也可以实现分布式训练,正是因为这样的特点,目前包括阿里在内的很多公司都在使用这一接…