我使用Metrics在jetty 8服务器上实现了一个healthcheck servlet。除了从我们的Load Balancer中轮询之外,还会定期(5分钟)将度量标准写入日志文件。此外,当某些指标(如CPU负载或内存消耗)达到临界限制时,将发送电子邮件通知。
这适用于CPU加载系统内存消耗。但是,为测量JVM内存消耗而定义的度量标准之一通常会超过定义的95%阈值,尽管服务器运行稳定。因此,我们可能不得不重新考虑我们对此特定指标的决定。这是一个在健康检查中使用的好指标吗?是垃圾收集器运行之前我们的Web应用程序是否会定期达到阈值的内存泄漏的指示,还是每个长时间运行的Web应用程序都会出现的正常行为?
感谢您的投入。
这是我们的代码,它推动了JVM内存健康检查。
Java运行时内存
private final Runtime runtime = Runtime.getRuntime();
Result check() throws Exception {
final long freeMem = this.runtime.freeMemory();
// maxMemory() is the value set by the JVM -Xmx (Max HeapSize) parameter
final long maxMem = this.runtime.maxMemory();
final long usedMem = maxMem - freeMem;
final double value = RatioGauge.Ratio.of(usedMem, maxMem).getValue();
final double threshold = 0.95;
if (value < threshold) {
// Everything OK: Memory usage usage is below the threshold.
} else {
// NOT OK: Memory usage is above the threshold.
}
}
答案 0 :(得分:0)
您需要建立基线。只要您的应用程序在所需的负载(请求数/秒,在线用户数等)下工作正常,任何CPU /内存消耗都会或多或少。获得基线后,您可以向代码添加功能,然后检查功能是否会降低或增加功耗并采取相应措施。然后,如果需要,您将优化代码中的位置,这些位置在添加功能后变得更糟(或者您发现没有本地代码更改可以保存您,并且您需要更多hw来支持给定负载下的新功能,或者您需要重新设计一些你的应用程序的组件,但它是另一个故事)。
因此,它不是绝对值最重要的(尽管JVM堆消耗不断在95% 有点令人担忧),但代码之间的变化有所改变。