如何通过Oshi获取磁盘活动时间?Java获取相关参数方法咨询
获取磁盘每秒传输数与访问时间(基于Oshi库)
一、每秒平均传输数的获取
Oshi可以通过磁盘的累计读写操作计数计算每秒传输数,核心思路是通过两次采样的计数差值除以时间间隔得到平均值:
- 先获取磁盘的初始读写操作计数(
getReadCount()、getWriteCount()) - 等待固定时间间隔后,再次获取最新计数
- 计算两次计数的差值,除以时间间隔得到每秒总传输数(读+写操作之和)
示例代码:
import oshi.SystemInfo; import oshi.hardware.HardwareAbstractionLayer; import oshi.hardware.HWDiskStore; import java.util.List; public class DiskTransferCalculator { public static void main(String[] args) throws InterruptedException { SystemInfo systemInfo = new SystemInfo(); HardwareAbstractionLayer hal = systemInfo.getHardware(); List<HWDiskStore> diskStores = hal.getDiskStores(); if (diskStores.isEmpty()) { System.out.println("未检测到磁盘设备"); return; } // 以第一个磁盘为例,可根据需求遍历所有磁盘 HWDiskStore targetDisk = diskStores.get(0); long initialReads = targetDisk.getReadCount(); long initialWrites = targetDisk.getWriteCount(); long startTime = System.currentTimeMillis(); // 采样间隔设为1秒,可根据精度需求调整 Thread.sleep(1000); // 刷新磁盘数据确保获取最新计数 targetDisk.updateAttributes(); long finalReads = targetDisk.getReadCount(); long finalWrites = targetDisk.getWriteCount(); long endTime = System.currentTimeMillis(); // 计算每秒传输数 double elapsedSeconds = (endTime - startTime) / 1000.0; long totalTransfers = (finalReads - initialReads) + (finalWrites - initialWrites); double transfersPerSecond = totalTransfers / elapsedSeconds; System.out.printf("磁盘每秒平均传输数: %.2f%n", transfersPerSecond); } }
二、磁盘访问时间的获取
Oshi本身不直接提供磁盘的标称访问时间(寻道时间+旋转延迟),但有两种可行方案:
- 预存厂商标称值:通过
targetDisk.getModel()获取磁盘型号,查询厂商官方规格文档得到访问时间,将其转换为秒后存储到配置文件,程序运行时直接读取使用。 - 尝试读取SMART数据:部分磁盘的SMART属性包含平均寻道时间等统计值,可通过
getSmartAttributes()获取。示例代码片段:
import oshi.hardware.SmartAttribute; // 获取磁盘对象后 List<SmartAttribute> smartAttrs = targetDisk.getSmartAttributes(); for (SmartAttribute attr : smartAttrs) { // 注意:不同厂商的SMART属性ID不统一,需自行验证 if (attr.getId() == 0xB0) { // 示例ID,仅部分磁盘代表平均寻道时间 System.out.printf("平均寻道时间: %d ms%n", attr.getValue()); } }
该方式兼容性有限,不同品牌、型号的磁盘SMART属性定义差异较大。
补充:磁盘利用率计算
根据IBM文档的公式:
磁盘利用率 = 每秒平均传输数 × 磁盘平均访问时间(单位:秒)
例如,每秒传输数为80,平均访问时间为12ms(0.012秒),则利用率为 80 × 0.012 = 0.96(即96%)。
内容的提问来源于stack exchange,提问作者cardosoOReis
相关产品推荐
相关产品推荐

