You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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本身不直接提供磁盘的标称访问时间(寻道时间+旋转延迟),但有两种可行方案:

  1. 预存厂商标称值:通过targetDisk.getModel()获取磁盘型号,查询厂商官方规格文档得到访问时间,将其转换为秒后存储到配置文件,程序运行时直接读取使用。
  2. 尝试读取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 20:55:20