查看原文
其他

CUP不足,系统硬件资源保护 保护我方输出

我是程序汪 我是程序汪 2021-09-08


系统保护

程序汪最近开发了一个定时调度场景的业务需求,运营妹子点击触发工单任务,但不会立即执行任务,先进入队列表,然后有个定时任务会5分钟轮训 队列表捞取数据触发执行 ,执行本任务的服务器也会同时跑其他任务,于是程序汪搞了一个保护逻辑 代码其实非常简单 


保护我方输出



JAVA通过oshi获取系统和硬件信息


maven 依赖

Java version: 1.8.0_66

Apache Maven 3.1.1

<dependency>
    <groupId>com.github.oshi</groupId>
    <artifactId>oshi-core</artifactId>
    <version>3.4.2</version>
</dependency>


业务场景 定时轮训触发大量任务

当前系统硬件资源不足时需要自我保护

//系统资源监控
 if (isSysAdequacy()) {
     LOG.info("当前系统资源不足 暂停任务执行...");
     return ;
   }
//执行具体的业务代码 可能是多线程执行
execute{
   //业务代码
}


监控系统资源的核心方法

标题写错了 应该是cpu使用率超过90%就停止任务执行

import java.lang.management.ManagementFactory;
import java.lang.management.OperatingSystemMXBean;
import com.sun.deploy.util.SystemUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import oshi.SystemInfo;

public class MySystemInfo {
    /** 资源入口静态对象 */
    private static SystemInfo sysInfo = new SystemInfo();
    static Logger Log = LoggerFactory.getLogger(SystemUtils.class);
    public  static  double CPU_USAGE=0.9;
    /**
     * 当前系统硬件资源不足就降级保护
     * @return
     */

    public static boolean isSysAdequacy(){
        if(getCurrentCpuUsage()>CPU_USAGE){
            return true;
        }
        return false;
    }
    /**
     * 获取当前系统CPU使用率
     * 0.4 表示 使用率 40%
     *
     * @return
     */

    public static double getCurrentCpuUsage() {
        try {
            return  sysInfo.getHardware().getProcessor().getSystemCpuLoad() ;
        } catch (Throwable t) {
            t.printStackTrace();
            Log.info("获取当前硬件CPU使用率时出现未知异常.");
            return 0;
        }
    }
}


               保护我方输出 一样保护我们的系统服务


测试代码

public static void main(String[] args) throws Exception {
        for (int i = 0; i < 2; i++) {
            new Thread(() -> {
                while (true) {
                    long w = 1000000;
                    w = w >> 1;
                }
            }).start();
        }
        while (true) {
            Thread.sleep(5000);
            System.out.println(getCurrentCpuUsage());
        }
    }


输出cup使用率情况



还有其他的方法,我就不一一演示了


/**
     * 获取操作系统整个系统负载
     *
     * @return
     */

    public static double getSystemLoad() {
        try {
            OperatingSystemMXBean osMxBean = ManagementFactory.getOperatingSystemMXBean();
            double systemLoadAverage = osMxBean.getSystemLoadAverage();
            return systemLoadAverage;
        } catch (Throwable t) {
            t.printStackTrace();
            Log.info("获取操作系统整个系统负载出现未知异常");
        }
        return 0;
    }




程序汪往期精彩文章包含答案





程序汪最近整理的BAT大小厂面试题(面试题目录推荐)

目录:我把精华文章都整理出来了

程序员新人刚进公司很懵逼,程序汪给5个建议

6 个接私活的网站,你有技术就有钱!

程序汪粉丝2020春招java后端经验分享小米1万8电网

100多个免费API接口分享 调用完全不限次数

通过一个demo学会互联网API接口的使用

程序汪粉丝拿下腾讯视频字节跳动offer22K面经分享

程序汪本科应届粉丝22K拿下字节跳动和顺丰offer

源码分享 一个基于spring boot的JAVA开源商城系统

推荐3个快速开发平台 项目经验又有着落了

给个[在看],是对程序汪最大的支持
: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存