IAm*_*aja 6 java optimization garbage-collection jvm load-testing
编辑:在这个问题已经收到的几个非常慷慨和有帮助的回答中,很明显,当我今天早些时候提出这个问题时,我没有把这个问题的重要部分弄清楚.到目前为止,我收到的答案更多的是关于优化应用程序和消除代码级别的瓶颈.我知道这比尝试从JVM中获得额外的3%或5%更重要!
这个问题假设我们已经完成了在代码级别优化应用程序架构的所有工作.现在我们想要更多,下一个要看的是JVM级别和垃圾收集; 我已相应更改了问题标题.再次感谢!
我们有一个"管道"式后端架构,消息从一个组件传递到下一个组件,每个组件在每个步骤执行不同的过程.
组件存在于Tomcat服务器上部署的WAR文件中.总共有大约20个组件在管道中,存在于5个不同的Tomcat服务器上(我没有选择每个服务器的体系结构或WAR分布).我们使用Apache Camel创建组件之间的所有路径,有效地形成管道的"结缔组织".
我被要求优化运行JVM的每个服务器的GC和一般性能(总共5个).我花了几天时间阅读GC和性能调优,并且很好地处理了每个不同的JVM选项的作用,堆的组织方式以及大多数选项如何影响JVM的整体性能.
我的想法是,优化每个JVM的最佳方法不是将其优化为独立的.我"感觉"(这就是我可以证明这一点!)试图在本地优化每个JVM而不考虑它将如何与其他服务器(上游和下游)上的其他JVM交互,将无法生成全局优化的解决方案.
对我来说,从整体上优化整个管道是有意义的.所以我的第一个问题是:SO是否同意,如果没有,为什么?
为此,我考虑创建一个LoadTester生成输入并将其提供给管道中的第一个端点的方法.这LoadTester可能还有一个单独的" 监视器线程 ",它将检查最后一个端点的吞吐量.然后,我可以进行各种处理,检查消息的平均端到端传播时间,断层前的最大吞吐量等.
它LoadTester会一遍又一遍地生成相同的输入消息模式.此实验中的变量将是传递给每个Tomcat服务器的启动选项的JVM选项.我有一个大约20种不同选项的列表,我想通过JVM,并认为我可以继续调整它们的值,直到我找到接近最佳的性能.
这可能不是绝对最好的方法,但这是我设计的最佳方式,我在这个项目的时间(大约一周).
第二个问题:SO对此设置有何看法?SO如何以不同的方式创建"优化解决方案"?
最后但同样重要的是,我很好奇我可以使用什么样的指标作为衡量和比较的基础.我真的只能想到:
还有其他人?这2个坏的原因是什么?
在回顾了这个剧本之后,我可以看到这可能被视为一个单一的问题,但我真正要问的是如何优化JVM在管道中运行,并随意切割我的解决方案然而你喜欢它.
提前致谢!
让我更上一层楼,说很多年前我在一个大型 C 应用程序中做过类似的事情。它由许多通过互连硬件交换消息的进程组成。我想出了一个两步走的方法。
步骤 1. 在每个流程中,我都使用此技术来消除任何浪费的活动。这花了几天时间进行采样、修改代码并重复。这个想法是有一条链条,首先要做的就是消除环节中的低效率。
第 2 步。这部分很费力但很有效:生成带有时间戳的消息流量日志。将它们合并到一个共同的时间线中。仔细查看特定的消息序列。您正在寻找的是
这项活动花了我大约一天的时间来生成日志、组合它们、找到加速机会并修改代码。照这样下去,大约10个工作日后,我发现/修复了很多问题,速度也大幅度提高了。
这两个步骤的共同点是我没有测量或尝试获取“统计数据”。如果某件事花费了太多时间,这一事实就会让勤奋的程序员仔细观察正在发生的事情。