在 C# 中确定指定进程的磁盘总量 I/O 读取和写入数据(以字节为单位)?
Determine total amount of disk I/O read and write data (in bytes) for specified process in C#?
我想确定磁盘的总量 I/O 为特定进程读取数据和写入数据(以字节为单位)。
不确定这是否可以通过性能计数器完成,因为当我 运行 this 来自 MSDN 的代码示例时,我只看到这些似乎无法检索信息的相关计数器名称我需要,因为它们在 data/sec 中,似乎仅用于计算平均值...
- IO 读取Operations/sec
- IO写入Operations/sec
- IO 数据Operations/sec
- IO 其他 Operations/sec
- IO 读取 Bytes/sec
- IO写入Bytes/sec
- IO 数据Bytes/sec
- IO 其他 Bytes/sec
如果我错了,请解释我需要使用哪些计数器以及我需要如何比较它们的值(使用 PerformanceCounter.NextValue() or PerformanceCounter.NextSample() + CounterSample.Calculate())。
我知道一些任务管理器可以检索到此信息,例如 System Explorer:
我也想这样做。
GetProcessIoCounters()
是 Perf counters/WMI.
的简洁替代品
struct IO_COUNTERS {
public ulong ReadOperationCount;
public ulong WriteOperationCount;
public ulong OtherOperationCount;
public ulong ReadTransferCount;
public ulong WriteTransferCount;
public ulong OtherTransferCount;
}
...
[DllImport(@"kernel32.dll", SetLastError = true)]
static extern bool GetProcessIoCounters(IntPtr hProcess, out IO_COUNTERS counters);
...
if (GetProcessIoCounters(Process.GetCurrentProcess().Handle, out IO_COUNTERS counters)) {
Console.WriteLine(counters.ReadOperationCount);
...
我想确定磁盘的总量 I/O 为特定进程读取数据和写入数据(以字节为单位)。
不确定这是否可以通过性能计数器完成,因为当我 运行 this 来自 MSDN 的代码示例时,我只看到这些似乎无法检索信息的相关计数器名称我需要,因为它们在 data/sec 中,似乎仅用于计算平均值...
- IO 读取Operations/sec
- IO写入Operations/sec
- IO 数据Operations/sec
- IO 其他 Operations/sec
- IO 读取 Bytes/sec
- IO写入Bytes/sec
- IO 数据Bytes/sec
- IO 其他 Bytes/sec
如果我错了,请解释我需要使用哪些计数器以及我需要如何比较它们的值(使用 PerformanceCounter.NextValue() or PerformanceCounter.NextSample() + CounterSample.Calculate())。
我知道一些任务管理器可以检索到此信息,例如 System Explorer:
我也想这样做。
GetProcessIoCounters()
是 Perf counters/WMI.
struct IO_COUNTERS {
public ulong ReadOperationCount;
public ulong WriteOperationCount;
public ulong OtherOperationCount;
public ulong ReadTransferCount;
public ulong WriteTransferCount;
public ulong OtherTransferCount;
}
...
[DllImport(@"kernel32.dll", SetLastError = true)]
static extern bool GetProcessIoCounters(IntPtr hProcess, out IO_COUNTERS counters);
...
if (GetProcessIoCounters(Process.GetCurrentProcess().Handle, out IO_COUNTERS counters)) {
Console.WriteLine(counters.ReadOperationCount);
...