RuoYi-Vue前后端分离版代码浅析-服务器监控前言

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

前言

本节介绍RuoYi-Vue的ruoyi-admin模块中的服务器监控模块ServerController 部分的代码,这个接口主要用来展示服务器的情况

代码

   public AjaxResult getInfo() throws Exception {
        Server server = new Server();
        server.copyTo();
        return AjaxResult.success(server);
    }
复制代码

所有的代码都在copyTo()方法中,调用了oshi-core

            <dependency>
                <groupId>com.github.oshi</groupId>
                <artifactId>oshi-core</artifactId>
                <version>${oshi.version}</version>
            </dependency>
复制代码

oshi-core 是个第三方的获取硬件和系统信息的jar包。基于JNA

#  获取cpu信息

        SystemInfo si = new SystemInfo();
        HardwareAbstractionLayer hal = si.getHardware();
        setCpuInfo(hal.getProcessor());

    private void setCpuInfo(CentralProcessor processor)
    {
        // CPU信息
        long[] prevTicks = processor.getSystemCpuLoadTicks();
        Util.sleep(OSHI_WAIT_SECOND);
        long[] ticks = processor.getSystemCpuLoadTicks();
        long nice = ticks[TickType.NICE.getIndex()] - prevTicks[TickType.NICE.getIndex()];
        long irq = ticks[TickType.IRQ.getIndex()] - prevTicks[TickType.IRQ.getIndex()];
        long softirq = ticks[TickType.SOFTIRQ.getIndex()] - prevTicks[TickType.SOFTIRQ.getIndex()];
        long steal = ticks[TickType.STEAL.getIndex()] - prevTicks[TickType.STEAL.getIndex()];
        long cSys = ticks[TickType.SYSTEM.getIndex()] - prevTicks[TickType.SYSTEM.getIndex()];
        long user = ticks[TickType.USER.getIndex()] - prevTicks[TickType.USER.getIndex()];
        long iowait = ticks[TickType.IOWAIT.getIndex()] - prevTicks[TickType.IOWAIT.getIndex()];
        long idle = ticks[TickType.IDLE.getIndex()] - prevTicks[TickType.IDLE.getIndex()];
        long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal;
        cpu.setCpuNum(processor.getLogicalProcessorCount());
        cpu.setTotal(totalCpu);
        cpu.setSys(cSys);
        cpu.setUsed(user);
        cpu.setWait(iowait);
        cpu.setFree(idle);
    }
复制代码

IDLE

CPU闲置且系统没有未完成的磁盘 I/O 请求的时间

IOWAIT

CPU闲置且系统有未完成的磁盘 I/O 请求的时间,在windows里和macos里面不可用都是0。

IRQ(Hardware interrupts)

用于服务硬件中断的 CPU的时间,在macos中不可用,永远为0

NICE

在具有nice优先级的用户级别执行时发生的 CPU 使用率

nice指静态优先值,类unix系统中才有,一经设定,就不会被内核修改,直到被重新设定。

SOFTIRQ

用于服务软件中断的 CPU的时间

STEAL

操作系统分配给系统中其他用户的时间

SYSTEM

系统级别的cpu利用率

USER

用户级别的执行时cpu利用率

在使用Linux的Top命令的时候我们就可以看到上面的这些数据,网站直接在页面上展示有利于服务器数据的监控。

设置服务器信息


    private void setSysInfo() {

        Properties props = System.getProperties();

        sys.setComputerName(IpUtils.getHostName());

        sys.setComputerIp(IpUtils.getHostIp());

        sys.setOsName(props.getProperty("os.name"));

        sys.setOsArch(props.getProperty("os.arch"));

        sys.setUserDir(props.getProperty("user.dir"));

    }

复制代码

获取Java虚拟机信息


   /**

     * 设置Java虚拟机

     */

    private void setJvmInfo() throws UnknownHostException

    {

        Properties props = System.getProperties();

        jvm.setTotal(Runtime.getRuntime().totalMemory());

        jvm.setMax(Runtime.getRuntime().maxMemory());

        jvm.setFree(Runtime.getRuntime().freeMemory());

        jvm.setVersion(props.getProperty("java.version"));

        jvm.setHome(props.getProperty("java.home"));

    }

复制代码