首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何通过负载测试优化JVM和GC

如何通过负载测试优化JVM和GC
EN

Stack Overflow用户
提问于 2012-01-05 08:09:37
回答 3查看 1.8K关注 0票数 6

编辑:在这个问题已经收到的几个非常慷慨和有帮助的回答中,很明显,当我今天早上问这个问题的时候,我并没有把这个问题的一个重要部分说清楚。到目前为止,我得到的答案更多是关于优化应用程序&在代码级别消除瓶颈。我知道这比尝试从JVM中获得额外的3%或5%更重要!

这个问题假设我们已经尽了一切努力在代码级别优化我们的应用程序架构。现在我们需要更多的内容,下一个要查看的是JVM级别和垃圾收集;我已经相应地更改了问题标题。再次感谢!

我们有一个“管道”风格的后端架构,其中消息从一个组件传递到另一个组件,每个组件在每一步执行不同的进程。

组件位于部署在Tomcat服务器上的WAR文件中。我们总共有大约20个组件在管道中,生活在5个不同的Tomcat服务器上(我没有为每个服务器选择WAR的体系结构或分布)。我们使用Apache来创建组件之间的所有路由,有效地形成管道的“结缔组织”。

我被要求优化运行JVM的每个服务器的GC和一般性能(总共5)。我花了几天时间阅读GC和性能调优,并且很好地处理了每个不同的JVM选项做什么,堆是如何组织的,以及大多数选项如何影响JVM的总体性能。

我的想法是,优化每个JVM的最佳方法不是将其作为一个独立的优化。我“感觉”(这就是我所能证明的!)试图在本地优化每个JVM,而不考虑它将如何在其他服务器(上游和下游)上与其他JVM交互,这不会产生一个全局优化的解决方案。

对我来说,优化整个管道作为一个整体是有意义的。所以我的第一个问题是:同意,如果不是,为什么?

为此,我考虑创建一个LoadTester,它将生成输入并将其输入到管道中的第一个端点。这个LoadTester还可能有一个单独的“监视线程”,它将检查最后一个端点的吞吐量。然后,我可以进行各种处理,检查消息的平均端到端旅行时间、故障前的最大吞吐量等。

LoadTester将一次又一次地生成相同的输入消息模式。本实验中的变量是传递给每个Tomcat服务器的启动选项的JVM选项。我列出了大约20个不同的选项,我想通过JVM,并认为我可以继续调整他们的值,直到我找到了接近最佳的性能。

这可能不是绝对最好的方式,但这是最好的方式,我可以设计的时间,我已经为这个项目(约一周)。

第二个问题:是怎么看待这个设置的?那么如何创建一个“优化解决方案”呢?

最后但并非最不重要的一点是,我想知道我可以使用什么样的度量作为度量和比较的基础。我真的只能想到:

JVM选项配置可以为messages

  • Find生成最快的平均端到端旅行时间,JVM选项配置可以产生最大的卷吞吐量而不会使任何服务器

崩溃。

还有其他人吗?为什么那两个是坏的?

在回顾了剧本之后,我可以看到这可能被解释为一个单一的问题,但我真正想问的是,这样如何才能优化运行在管道上的JVM,并且可以随意裁剪我的解决方案,不管你喜欢它。

提前感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-05 09:15:01

让我提升一个级别,说我在很多年前在一个大型C应用程序中做了类似的事情。它由多个进程组成,通过相互连接的硬件交换消息。我想出了一个两步的方法。

步骤1.在每个过程中,我使用this technique来消除任何浪费的活动。这需要几天的取样、修改代码和重复。这个想法是有一条链的,首先要做的是消除链接中的无效。

第二步,这个部分很费劲,但很有效:生成有时间戳的消息流量日志。将它们合并成一个共同的时间表。仔细查看特定的消息序列。你要找的是

  1. 是必要的消息,还是由于超时或其他可避免的原因而产生的重传?
  2. 何时发送、接收和执行消息?如果在收到和采取行动之间有很大的延误,那么这种拖延的原因是什么?例如,这仅仅是“排在另一个正在执行I/O的进程后面”的问题吗?它是否有不同的进程优先级?

这个活动花了我大约一天的时间来生成日志,组合它们,找到加速的机会,并修改代码。以这种速度,在大约10个工作日后,我发现/修复了一些问题,并大大提高了速度。

这两个步骤的常见之处在于,我没有测量或试图获取“统计数据”。如果某件事情花费了太多的时间,那么这个事实就会暴露给一个扩张的程序员,仔细观察正在发生的事情。

票数 1
EN

Stack Overflow用户

发布于 2012-01-05 08:27:56

首先,我将找到为您的硬件/软件组合指定的最佳推荐jvm值,或者从已经存在的jvm开始。

接下来,我将确保我有适当的监视,以测量业务吞吐量和SLA

如果没有理由,我不会试图调整GC。

首先,您需要找到应用程序中的主要瓶颈。如果是I/O绑定、SQL绑定等。

这里的关键是测量、识别顶级瓶颈、修复瓶颈并使用可重复的负载进行另一次迭代。

嗯..。

票数 0
EN

Stack Overflow用户

发布于 2012-01-05 09:07:57

当在同一台机器上运行多个JVM时,我知道的最大的窍门是限制GC将使用的核心数量。否则,当一个JVM完成一个完整的GC时,它会尝试抓取每个核心,影响所有JVM的性能,即使它们没有执行GC。一种建议是将gc线程的数量限制在5/8或更少。(我不记得它写在哪里了)

我认为您应该对整个系统进行测试,以确保服务之间有实际的交互。但是,我假设您可能需要对每个服务进行不同的调优。

如果无法更改代码,则更改命令行选项非常有用。但是,如果您分析并优化了代码,那么除了调优GC参数之外,您还可以做出更大的改变(在这种情况下,您需要再次更改它们)。

由于这个原因,我只会作为最后手段更改命令行参数,因为在应用程序的代码中几乎没有什么改进。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8745695

复制
相关文章
Kafka如何通过精妙的架构设计优化JVM GC问题
“ 这篇文章,同样给大家聊一个硬核的技术知识,我们通过Kafka内核源码中的一些设计思想,来看你设计Kafka架构的技术大牛,是怎么优化JVM的GC问题的?
chinotan
2019/05/19
1K0
jvm系列(九):如何优化Java GC「译」
本文由CrowHawk(https://crowhawk.github.io/2017/08/21/jvm_4/)翻译,是Java GC调优的经典佳作。 本文翻译自Sangmin Lee发表在Cubrid上的"Become a Java GC Expert"系列文章的第三篇《How to Tune Java Garbage Collection》,本文的作者是韩国人,写在JDK 1.8发布之前,虽然有些地方有些许过时,但整体内容还是非常有价值的。译者此前也看到有人翻译了本文,发现其中有许多错漏生硬和语焉不详
纯洁的微笑
2018/04/19
1.5K0
jvm系列(九):如何优化Java GC「译」
Kafka如何通过经典的内存缓冲池设计来优化JVM GC问题?
大家都知道Kafka是一个高吞吐的消息队列,是大数据场景首选的消息队列,这种场景就意味着发送单位时间消息的量会特别的大,那既然如此巨大的数据量,kafka是如何支撑起如此庞大的数据量的分发的呢?今天我们从 kafka架构 以如何 优化GC 两个方面讲解.
用户5546570
2020/05/27
1.3K0
Kafka如何通过经典的内存缓冲池设计来优化JVM GC问题?
JVM GC 机制与性能优化
与C/C++相比,JAVA并不要求我们去人为编写代码进行内存回收和垃圾清理。JAVA提供了垃圾回收器(garbage collector)来自动检测对象的作用域),可自动把不再被使用的存储空间释放掉,也就是说,GC机制可以有效地防止内存泄露以及内存溢出。
Java廖志伟
2021/01/29
3760
JVM对象分配和GC分布【JVM】
最近在学习java基础结构,刚好学到了jvm,总结了以下并可以结合思维导图认识以下Jvm的对象:
简单的程序员
2020/04/20
5040
JVM 的 GC 优化经验谈
本文转载自:https://www.rowkey.me/blog/2016/11/02/java-profile/
aoho求索
2019/06/24
2.6K0
【性能优化】:JVM GC(垃圾回收)解析
3. 当再次进行Minor GC时,之前作为To Space的S0或S1则转换为From Space,通常存活的对象在Minor GC后并不是直接进入旧生代,只有经历过几次Minor GC仍然存活的对象,才放入旧生代中,这个在Minor GC中存活的次数在串行和ParNew方式时可通过-XX:MaxTenuringThreshold来设置,在ParallelScavenge时则由Hotspot根据运行状况来决定。当ToSpace空间满,剩下的存活对象则直接转入旧生代中。
Luga Lee
2022/03/25
2580
教你如何通过分析GC日志来进行JVM调优
不同的垃圾收集器产生的GC日志大致遵循了同一个规则,只是有些许不同,不过对于G1收集器的GC日志和其他垃圾收集器有较大差别,话不多说,正式进入正文。。。
肉眼品世界
2020/11/11
3.1K0
教你如何通过分析GC日志来进行JVM调优
如何优化Java GC
在第一篇 理解 Java GC 中我们学习了不同GC算法的处理过程,GC是如何工作的,什么是年轻代和老年代,JDK7中的5种GC类型,以及每种GC类型对性能的影响。
码代码的陈同学
2018/07/08
1.1K0
如何优化Java GC
深入理解JVM和GC
先从自定义的ClassLoader看是否有,没有App中看, 在Extension中看,再Bootstrap中看,都没有,Bootstrap看自己能不能加载,不能就交给Extension加载,也不能就交给App加载,也没有就交给自定义加载器加载。 最后还是没有 抛出异常 ClassNotFound。找到就返回
西柚dzh
2022/06/09
5140
深入理解JVM和GC
如何计算 Node.js GC 负载
在 Node.js 中,我们关注的比较的是 CPU 负载,但是在有 GC 的语言中,GC 负载也是需要关注的一个指标,因为 GC 过高会影响我们应用的性能。本文介绍关于 GC 负载的一些内容。
theanarkh
2023/09/02
1530
如何计算 Node.js GC 负载
jvm gc 线程
缺点:对 CPU 资源敏感、无法收集浮动垃圾、标记 —— 清除 算法带来的空间碎片
Dean0731
2020/05/12
9140
JVM GC算法
在判断哪些内存需要回收和什么时候回收用到GC 算法,本文主要对GC 算法进行讲解。 JVM垃圾判定算法 常见的JVM垃圾判定算法包括:引用计数算法、可达性分析算法。 引用计数算法(Reference Counting) 引用计数算法是通过判断对象的引用数量来决定对象是否可以被回收。 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。 优点:简单,高效,现在的objective-c用的就是这种算法。 缺点:很难处理循
武培轩
2018/04/18
1.1K0
JVM GC算法
JVM的GC
将内存分为大小相等两块, 每次只用一块, 当这一块用完了, 就将还存活的对象复制到另一块内存上, 然后把已经使用的左边的内存空间一次性整理
CoffeeLand
2020/04/19
4210
jvm系列--GC
一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发Scavenge GC,对Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区。
Dlimeng
2023/06/29
1710
jvm系列--GC
JVM、GC和常用命令
这是11月份的一个分享,借着组内分享的机会,重新梳理了一遍JVM的一些基本概念和学习资料。在这个PPT中,关于G1的部分比较粗略,最近正在恶补G1的知识,后面可能会单独整理一篇分享出来。
阿杜
2018/08/06
3780
JVM、GC和常用命令
JVM垃圾回收(GC)
对象被引用一次,在它的对象头上加一次引用次数,如果没有被引用(引用次数为 0),则此对象可回收
chenchenchen
2022/01/05
3140
JVM垃圾回收(GC)
GC及JVM参数
这个GC跟JVM内容太多了,理论性东西多些,少年时还能记个八九成,好久没弄,都忘记了。这次权当整理温习,再看看《深入理解JVM虚拟机》,找些过去写的博客挖点东西过来!
码农戏码
2021/03/23
9890
JVM GC回收器
-XX:+UseParNewGC :新生代使用ParNew回收器,老年代使用串行回收器
BUG弄潮儿
2020/08/24
2890
JVM GC回收器
JVM之GC日志
为了方便我们查看 GC 日志,我们来写个方便 GC 发生的程序,参见《深入理解 java 虚拟机》
Coder的技术之路
2021/05/14
3650
JVM之GC日志

相似问题

JMeter / Jvm负载测试

25

集成测试和负载测试:使用相同的场景(JVM)

11

jvm conf,适用于高负载的普通gc

20

如何在jvm gc中优化大的短寿命对象

20

JVM分析-负载测试自动化和比较

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文