如何监控服务的内存指标?

简介: 在当今的互联网时代,哪家提供的服务越稳定,这样的的服务越会受到特别的关注。监控服务的各个指标,可以很轻松地了解到当前服务的运行的状态以及是否需要进一步的处理。监控指标是维护一个服务稳定性的必要手段,使用者可以提前地接收到服务的报警以及相关指标的数据变化。最终的目标显而易见,就是维护服务的稳定性。
程序员冈刀,目前就职于美团,java开发工程师,研究生。2022年,毕业于北京邮电大学电子工程学院、电子与通信工程专业。

1. 为什么要监控服务的指标?

在当今的互联网时代,哪家提供的服务越稳定,这样的的服务越会受到特别的关注。监控服务的各个指标,可以很轻松地了解到当前服务的运行的状态以及是否需要进一步的处理。监控指标是维护一个服务稳定性的必要手段,使用者可以提前地接收到服务的报警以及相关指标的数据变化。最终的目标显而易见,就是维护服务的稳定性。

2. 如何维护服务系统的稳定性?

维护系统的稳定性,实际上有很多的手段,在本文中,按照事件发生的事前、事中、事后这样的事件序列依次介绍每个时间段,可以做的事情。

  • 事前:

此刻服务稳定性没有受到核心的影响。此时,可以监控服务的各项指标,例如:JVM新生代、老年代的使用比率,GC次数等等指标。同时,也可以监控核心接口API的TP X(X为50、90、99等等)的响应时间。当某一项指标无法满足心中预期的时候,及时的报警,然后进行处理。

  • 事中:

此刻服务的稳定性正在遭受严重的威胁,如果不进行及时的处理,有可能导致服务的不可用,进而导致服务的雪崩的发生。此刻我们应该做的是尽可能地将损失降到最低。“先止损,再处理” 在这个阶段非常的实用。But,作为新手,完全不知道处理流程岂不是佷蒙蒙的。所以,线上一分钟、线下十年功,注重平时的养成,用于一时。写好各种SOP以及处理的解决方案,势在必行。最后,也应当进行适当的故障演练。

  • 事后:

也就是事件发生之后,服务已经恢复到了原来的可用程度。此刻似乎也没有什么可以做了!No,No,No!!!此刻应该做的是针对此次事件发生做一次完美的复盘。总结自己的不足,不断的训练自己,下次类似事件发生的时候可以迅速的解决这个问题,减少损失,减少处理时间。
所以说,维护一个服务的稳定性并不是很简单的把代码写好就好,还需要考虑很多的事情呢。

3. 如何监控JVM指标?

服务稳定性是一个很大的话题,在本文中,主要针对本身应用如何获取、监控JVM指标进行阐述。使用JDK自带的工具获取信息不是本文的重点,本文的重点是使用Java代码获取JVM的使用。在JDK中,为我们提供了一个管理类,它是ManagementFactory,可以在JVM启动后,获取应用的很多很多属性。例如:堆的使用情况、非堆的使用情况以及这个应用中是否发生了死锁,以及死锁的调用栈等等。那么就简单啦,在你的应用中,仅仅使用ManagementFactory就可以完美的监控一些简单的指标啦。有的人似乎在思考,如果出现OOM应该如何的监控呢?实际上,出现了OOM,此刻服务已经严重的不可用,也就是 “事中” 的阶段了,此刻不应当是监控,而是去处理这个问题以及复盘。监控的意义在于,预知的发现一些有可能导致服务不可用的因素。下面是一个发现应用中死锁的一个例子:


public class JVMTest {

    public static void main(String[] args) throws InterruptedException {
        Object a1 = new Object();
        Object a2 = new Object();
        // dead lock
        new MyThread(a1, a2).start();
        new MyThread(a2, a1).start();
        ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
        while (true) {
            TimeUnit.SECONDS.sleep(1);
            long[] monitorDeadlockedThreads = threadMXBean.findMonitorDeadlockedThreads();
            if (null != monitorDeadlockedThreads) {
                for (long threadId : monitorDeadlockedThreads) {
                    ThreadInfo threadInfo = threadMXBean.getThreadInfo(threadId);
                    System.out.println(threadInfo.getThreadName());
                    System.out.println(threadInfo.getThreadId());
                    System.out.println(threadInfo.getBlockedTime());
                    StackTraceElement[] stackTrace = threadInfo.getStackTrace();
                    for (StackTraceElement stackTraceElement : stackTrace) {
                        System.out.println(stackTraceElement);
                    }
                }
            }

        }
    }

    static class MyThread extends Thread {
        Object a1, a2;

        public MyThread(Object a1, Object a2) {
            this.a1 = a1;
            this.a2 = a2;
        }

        public void run() {
            synchronized (a1) {
                try {
                    TimeUnit.SECONDS.sleep(3);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (a2) {
                    System.out.println("Okkk");
                }
            }
        }
    }
}

4.总结

本文中,简单的介绍了一个JVM使用量的如何监控。如果想要更加完美的平台,可以考虑使用Elasticsearch+Grafana的方式实现,都是开源免费的一些组件。同时Grafana也提供了一些事前的报警行为。

本文根据作者的一些经验书写而成,其中不乏会有一些不正确的地方,望批评指正。

个人公众号

也欢迎关注我的公众号呀,了解最新的动态!!!

相关文章
|
1月前
|
Web App开发 监控 JavaScript
监控和分析 JavaScript 内存使用情况
【10月更文挑战第30天】通过使用上述的浏览器开发者工具、性能分析工具和内存泄漏检测工具,可以有效地监控和分析JavaScript内存使用情况,及时发现和解决内存泄漏、过度内存消耗等问题,从而提高JavaScript应用程序的性能和稳定性。在实际开发中,可以根据具体的需求和场景选择合适的工具和方法来进行内存监控和分析。
|
26天前
|
存储 Prometheus 监控
监控堆外内存使用情况
监控堆外内存使用情况
30 4
|
3月前
|
缓存 Java 测试技术
谷粒商城笔记+踩坑(11)——性能压测和调优,JMeter压力测试+jvisualvm监控性能+资源动静分离+修改堆内存
使用JMeter对项目各个接口进行压力测试,并对前端进行动静分离优化,优化三级分类查询接口的性能
116 10
谷粒商城笔记+踩坑(11)——性能压测和调优,JMeter压力测试+jvisualvm监控性能+资源动静分离+修改堆内存
|
2月前
|
监控 数据可视化 Java
如何使用JDK自带的监控工具JConsole来监控线程池的内存使用情况?
如何使用JDK自带的监控工具JConsole来监控线程池的内存使用情况?
|
3月前
|
监控 Ubuntu API
Python脚本监控Ubuntu系统进程内存的实现方式
通过这种方法,我们可以很容易地监控Ubuntu系统中进程的内存使用情况,对于性能分析和资源管理具有很大的帮助。这只是 `psutil`库功能的冰山一角,`psutil`还能够提供更多关于系统和进程的详细信息,强烈推荐进一步探索这个强大的库。
53 1
|
3月前
|
存储 弹性计算 网络协议
阿里云ECS内存型实例规格族特点、适用场景、指标数据参考
阿里云ECS提供了多样化的内存型实例规格族,专为需要高性能内存资源的应用场景设计。从最新的r8a系列到经过优化的re6p系列,旨在提供稳定、高效且安全的计算环境。这些实例不仅具备强大的计算性能与内存配比,还通过支持ESSD云盘和高效网络协议,显著提升了存储I/O能力和网络带宽,适用于大数据分析、高性能数据库、内存密集型应用等多种场景,为用户带来卓越的计算体验。本文将详细解析阿里云ECS中的多个内存型实例规格族,包括它们的核心特点、适用场景、实例规格及具体指标数据,为用户在云计算资源选型时提供参考。
|
27天前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
211 1
|
16天前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
25天前
|
Java
JVM内存参数
-Xmx[]:堆空间最大内存 -Xms[]:堆空间最小内存,一般设置成跟堆空间最大内存一样的 -Xmn[]:新生代的最大内存 -xx[use 垃圾回收器名称]:指定垃圾回收器 -xss:设置单个线程栈大小 一般设堆空间为最大可用物理地址的百分之80
|
26天前
|
Java
JVM运行时数据区(内存结构)
1)虚拟机栈:每次调用方法都会在虚拟机栈中产生一个栈帧,每个栈帧中都有方法的参数、局部变量、方法出口等信息,方法执行完毕后释放栈帧 (2)本地方法栈:为native修饰的本地方法提供的空间,在HotSpot中与虚拟机合二为一 (3)程序计数器:保存指令执行的地址,方便线程切回后能继续执行代码
21 3