我想测量一下,一个程序对硬盘的访问量(即读写了多少字节)。我上网查了一下这个问题,发现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
jvisualvm有一个插件叫Tracer-IO Probes,可以统计以下内容。
它将首先显示22字节的1个写数,然后显示22字节的2个读数 ...
......为这个程序写和读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);
我管理 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);