| New file | 
|  |  |  | 
|---|
|  |  |  | 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() ; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|