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-Program 试过了,它只写数字,它说有硬盘使用。

sigar.getDiscUsage似乎也只显示文件系统的大部分被使用了,而不是访问了多少。有没有人暗示如何用 sigar 或另一个图书馆来衡量这个?

在此先感谢 DaGeRe

4

2 回答 2

2

有一个名为 Tracer-IO Probes for jvisualvm 的插件,可以计算以下内容:

  • 文件 I/O 计数:读/写操作的调用计数
  • 文件 I/O 字节:读取或写入文件的字节数
  • 文件 I/O 大小:每次读/写操作的平均字节数

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

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);
于 2020-05-12T16:32:27.440 回答
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);
于 2020-05-28T05:54:36.967 回答