摘要:如果你是为非常大的公司工作,那么有99.99%的可能性,你可能没有必要说明你的应用程序的内存大小应该是什么,因为这个决定已经由坐着的精英/半神做出在象牙塔上。堆转储基本上是一个文件,它包含有关应用程序内存的所有信息,比如存在的对象,它们的引用是什么,每个对象占用多少内存......大内存大小应用程序的堆转储也往往非常大。

我应该运行我的应用程序,只有很少的实例(即机器)具有大内存大小或许多实例具有较小的内存大小?哪种策略最佳?这个问题可能经常面临。在构建应用程序20年后,在构建JVM性能工程/故障排除工具(GCeasy,FastThread,HeapHero)之后,我仍然不知道这个问题的正确答案。与此同时,我认为这个问题也没有二元答案。在本文中,我想分享我对这个主题的观察和经验。

两个数十亿美元的企业故事

由于我们的JVM性能工程/故障排除工具已在大型企业中得到广泛应用,因此我有机会看到世界级的企业应用程序实施。最近我有机会看到两家超级增长的科技公司(如果我说他们的名字,每个阅读这篇文章的人都会知道它们)。两家公司总部位于硅谷。他们的业务是技术,所以他们知道在工程方面他们在做什么。他们是华尔街的宠儿,享有很高的估价。他们的市值达数十亿美元。他们是现代蓬勃发展的企业的典范。对于我们的谈话,我们称这两家企业为A公司和B公司。

我非常惊讶地看到两家企业在内存大小方面都采用了两个极端*。Company-A将其堆大小(即-Xmx)设置为250gb,而company-B将其堆大小设置为2gb。即company-A的堆大小比Company-B的堆大小大125倍。两家企业都对自己的内存大小设置充满信心。正如他们所说:“证明在布丁中”,两家企业都在扩展和处理数十亿关键业务交易。

这是一个很好的经验,可以看到两家公司在相同的地理区域内进入相同的业务,具有或多或少相同的收入/相同的市值,同时在内存大小方面采用两个极端。鉴于这种真实的体验,什么是正确的答案?大尺寸或小尺寸的内存?我的结论是:如果你有一支优秀的团队,你可以成功采取任何一种策略。

大内存可能会很昂贵

具有少量实例(即机器)的大内存大小往往比小内存大小,更多实例更昂贵。这是一个简单的数学,基于美国东部(弗吉尼亚北部)地区的AWS EC2实例的成本:

m4.16xlarge - 256GB RAM - Linux按需实例成本:3.2美元/小时

T3a小型 - 2GB内存 - Linux按需实例成本:0.0188美元/小时

因此,要拥有256GB RAM的容量,我们必须获得128'T3a small'实例(即128个实例x 2GB = 256GB)。

128 x T3a小 - 2GB RAM - Linux按需实例成本:2.4064美元/小时(即128 x $ 0.0188 /小时)。

它意味着大的内存大小,几个实例的成本比每个实例的小内存大小多0.793美元/小时(即3.2美元到2.4064美元)。换句话说,“具有少量实例的大内存大小”策略的成本要高出33%。

当然,可以提出另一个反驳论点:如果你的机器数量较少,你可能需要更少的工程师,更少的电力,更少的房地产。修补,升级服务器也可能更容易。

业务需求

在某些情况下,业务本身的性质决定了应用程序的内存大小。这是我们遇到的现实事件:当我们构建HeapHero(堆转储分析工具)时,我们工具的内存大小必须大于它解析的堆转储文件。假设堆转储文件大小为100gb,那么HeapHero工具的内存大小必须大于100gb。没有选择。

假设您正在缓存大量(例如200gb)数据以最大化应用程序的性能,那么您的堆大小必须超过200gb。你将无法选择。因此,在某些情况下,业务需求将决定您的内存大小。

性能和故障排除

如果您的内存大小很大,那么垃圾收集暂停时间通常也会很高。垃圾收集是一个在应用程序中运行的过程,用于清除内存中未引用的对象。如果你的内存很大,那么内存中的垃圾量也会很大。因此,清理垃圾所需的时间也很长。当垃圾收集运行时,它会暂停您的应用程序。但是这个问题有解决方案:

你可以使用无休止的JVM(比如'Azul')

需要进行适当的GC调整以减少暂停时间

同样,如果您需要解决任何内存问题,则必须从应用程序捕获堆转储。堆转储基本上是一个文件,它包含有关应用程序内存的所有信息,比如存在的对象,它们的引用是什么,每个对象占用多少内存......大内存大小应用程序的堆转储也往往非常大。分析大型堆转储也很困难。即使是世界上最好的堆转储工具,如Eclipse MAT,HeapHero在解析超过100GB的堆转储方面也面临挑战。在测试实验室中重现这些问题,存储这些堆转储文件,共享这些堆转储文件都是挑战。

情绪第一 - 理由下一步

在阅读了Jonah Lehrer撰写的“我们如何决定”之类的书籍之后 - 我相信您之前的经历,情感在决定应用程序的内存大小方面起着关键作用。我曾经在一家大型金融机构工作。这家金融机构的首席架构师建议我们运行具有非常大内存大小的JVM,他给出的理由是:“ 我们过去常常运行内存非常大的大型机”。

结论

如果你是为非常大的公司工作,那么有99.99%的可能性,你可能没有必要说明你的应用程序的内存大小应该是什么,因为这个决定已经由坐着的精英/半神做出在象牙塔上。可能很难扭转或改变这一决定。

如果您有选择或选择做出决定,您对内存大小的决定很可能会受到您之前的经验和情绪的影响。无论哪种方式,只要您拥有合适的团队,就不会出错(即只需要很少的内存大小实例或大量内存小的实例)。

相关文章