liurunyu
2025-03-21 fb50c6c8111fffd16091ce25d5d389ea3fcc560f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package com.dy.common.util;
 
import lombok.Data;
import oshi.hardware.CentralProcessor;
import oshi.util.Util;
 
/**
 * @Author: liurunyu
 * @Date: 2024/8/2 11:17
 * @Description
 */
public class SysCpuUtil {
 
    private static final int OSHI_WAIT_SECOND = 1000;
    /**
     * 得到CPU信息
     */
    public static CpuInfoVo info(CentralProcessor processor){
        /**
         * 获取系统范围内的CPU负载计数器。返回一个包含八个元素的数组,表示在用户(0)、尼斯(1)、系统(2)、空闲(3)、
         * IOwait(4)、硬件中断(IRQ)(5)、软件中断/DPC(SoftIRQ))(6)或窃取(7)状态下花费的毫秒数。使用
         * {@link-shi.hardware.TickType#getIndex()}检索相应的索引。通过测量一个时间间
         * 隔内滴答声之间的差异,可以计算出该时间间隔内的CPU负载。
         * 在某些逻辑处理器数量可变的操作系统上,此阵列的大小可能会发生变化,并且可能与其他每处理器方法不一致。
         * 请注意,虽然滴答计数器以毫秒为单位,但它们可能会随着(依赖于平台的)时钟滴答声以更大的增量前进。例如,默认
         * 情况下,Windows时钟节拍为1/64秒(约15或16毫秒),Linux时钟节拍取决于分布和配置,但通常为1/100秒(10
         * 毫秒)。
         * Windows上没有Nice和IOWait信息,macOS上没有IOWait和IRQ信息,因此这些标记将始终为零。
         * 要使用此方法计算总空闲时间,请同时包括Idle和IOWait标记。同样,应将IRQ、SoftIRQ和Steal标记添加到系统值
         * 中以获得总和。系统计时还包括执行其他虚拟主机(窃取)的时间。
         * *
         * @return一个由8个长值组成的数组,表示在User、Nice、System、Idle、IOwait、IRQ、SoftIRQ和Steal状态下花费的时间。
         */
        long[] prevTicks = processor.getSystemCpuLoadTicks();
        Util.sleep(OSHI_WAIT_SECOND);
        long[] ticks = processor.getSystemCpuLoadTicks();
        long nice = ticks[1] - prevTicks[1];
        long irq = ticks[5] - prevTicks[5];
        long softIrq = ticks[6] - prevTicks[6];
        long steal = ticks[7] - prevTicks[7];
        long cSys = ticks[2] - prevTicks[2];
        long user = ticks[0] - prevTicks[0];
        long ioWait = ticks[4] - prevTicks[4];
        long idle = ticks[3] - prevTicks[3];
 
        /*
        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;
 
        CpuInfoVo vo = new CpuInfoVo() ;
        vo.cores = processor.getLogicalProcessorCount() ;
        vo.totalRate = totalCpu ;
        vo.sysRate = cSys ;
        vo.userRate = user ;
        vo.waitRate = ioWait ;
        vo.freeRate = idle ;
        return vo ;
    }
 
    @Data
    public static class CpuInfoVo{
        /**
         * 核心数
         */
        public int cores;
        /**
         * CPU总的使用率
         */
        public double totalRate;
        /**
         * CPU系统使用率
         */
        public double sysRate;
        /**
         * CPU用户使用率
         */
        public double userRate;
        /**
         * CPU当前等待率
         */
        public double waitRate;
        /**
         * CPU当前空闲率
         */
        public double freeRate;
 
        public String toString(){
            StringBuilder sb = new StringBuilder() ;
            sb.append("   CPU信息:\n");
            sb.append("      核心数:" + cores + "\n");
            sb.append("      CPU总的使用率:" + totalRate + "\n");
            sb.append("      CPU系统使用率:" + sysRate + "\n");
            sb.append("      CPU用户使用率:" + userRate + "\n");
            sb.append("      CPU当前等待率:" + waitRate + "\n");
            sb.append("      CPU当前空闲率:" + freeRate + "\n");
 
            return sb.toString() ;
        }
 
    }
}