繁体   English   中英

生产中的性能问题

[英]Performance issue in production

嗨,我正在研究基于 web 的 java 工具。 我们有两个我们的工具实例部署在 2 个单独的服务器中——一个在生产环境中(许多客户同时使用),一个在我很少使用的开发环境中。 开发和生产实例都部署在具有相同硬件规格的完全相同的服务器中,具有准确的代码、堆大小、应用程序服务器、版本等。

但是我观察到生产实例的速度慢得多,与开发实例相比,即使在客户使用量为零的夜间奇数小时(我们有工具来监控生产中的客户使用情况)。 这是令人惊讶的,因为所有因素都是相同的。 我假设由于生产实例的使用率很高,因此那里的堆几乎已满且碎片化,而 dev 中的堆相对空闲且未碎片化。 这就是为什么开发实例要快得多的原因,即使一切都是一样的。 这是一个合理的假设,因为碎片化的几乎满堆将花费更多时间创建 object 并因此降低性能?

大多数 GC 执行避免任何碎片的复制和压缩。 只有并发标记扫描可以得到一些碎片,但是在大多数情况下这应该不是问题。

我建议您衡量系统正在做什么,而不是猜测您的问题可能是什么。 理想情况下,您想要分析您的生产系统。 例如在夜间或低负载下。 例如 VisualVM(免费)或 YourKit(更好,不是免费),如果这不是一个选项。 您可以监控其 memory 的使用情况以及它花费了多少时间进行 GC。 例如使用jstat

但是,如果您还没有分析您的应用程序,我建议您这样做,因为您可能可以做一些明显而简单的事情来提高性能,即使您在开发中以相当现实的工作负载运行它也是如此。

您确定您的服务器没有被 web 扫描仪扫描吗? (他们往往不睡觉,可以在白天/晚上的任何时间活动)

为什么假设堆是碎片化的? 您可以使用 VisualGc,一个用于可视 VM 的插件来实时分析 GC 统计信息。 您可以将其中一台生产服务器从流量中取出并对其进行分析。

http://java.sun.com/performance/jvmstat/visualgc.html

在您的分析中需要考虑许多因素。 延迟、网络/磁盘 IO、数据库记录及其大小 + 索引等等等等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM