在Java中获取硬盘访问次数

问题描述 投票:1回答:1

我想测量一下,一个程序对硬盘的访问量(即读写了多少字节)。我上网查了一下这个问题,发现Sigar应该可以记录这样的事情,但是继续搜索之后,我没有找到任何可以获得读写次数的数据。在程序启动之前,我做了

sigar = new Sigar();
sigar.enableLogging(true);

而后,我做

sigar.enableLogging(false);
for ( FileSystem fs : sigar.getFileSystemList() )
{
  if ( fs.getType() == FileSystem.TYPE_LOCAL_DISK )
  {
        System.out.println("Dev: " + fs.getDevName() + ": " + sigar.getDiskUsage(fsName).getReads() +" "+ sigar.getDiskUsage(fsName).getWrites());
  }
}

但这并没有返回任何意义(我用一个java程序试过,只写Numbers,它说有硬盘使用情况。

sigar.getDiscUsage 也似乎只显示了文件系统的大部分被使用,而不是有多少访问量。有谁有提示如何测量这个,用sigar或其他库?

先谢谢你DaGeRe

java hard-drive measurement sigar
1个回答
2
投票

jvisualvm有一个插件叫Tracer-IO Probes,可以统计以下内容。

  • 文件IO计数 读写操作的调用次数
  • 文件IO字节数。读写文件的字节数
  • 文件IO大小。每次读写操作的平均字节数。

它将首先显示22字节的1个写数,然后显示22字节的2个读数 ...

jvisualvm IO探头

......为这个程序写和读22个字节的程序

System.in.read();
byte[] bytes = "Writing this to a file".getBytes();
Path path = Files.createTempFile("io-probes-test", ".txt");
path.toFile().createNewFile();
Thread.sleep(2000L);
Files.write(path, bytes);
Thread.sleep(10000L);
Files.readAllBytes(path);
Thread.sleep(2000L);
path.toFile().delete();
Thread.sleep(5000L);

0
投票

我管理 OSHI 项目。 有一个 OSProcess类 有方法 getBytesRead()getBytesWritten() 将返回该程序的磁盘访问情况。

它不返回进程级的确切读写次数,但它会返回设备级的读写次数。HWDiskStore类 有方法 getReads()getReadBytes() 以及同样的写入数据,所以如果你同时测量程序和磁盘,你大概可以得出一个比率,并对程序本身有一个很好的估计。

获取这些数据的代码......从SystemInfo对象开始。

SystemInfo si = new SystemInfo();

得到一个硬盘列表,包括计数和字节数。

HardwareAbstractionLayer hal = si.getHardware();
List<HWDiskStore> disks = hal.getDiskStores();

要得到一个有字节数的进程列表:

OperatingSystem os = si.getOperatingSystem(); 
List<OSProcess> procs = os.getProcesses();

或者,如果你知道你要测量的进程ID:

OSProcess proc = os.getProcess(pid);
© www.soinside.com 2019 - 2024. All rights reserved.