确定 C# 中指定进程的磁盘 I/O 读写数据总量(以字节为单位)?

Posted

技术标签:

【中文标题】确定 C# 中指定进程的磁盘 I/O 读写数据总量(以字节为单位)?【英文标题】:Determine total amount of disk I/O read and write data (in bytes) for specified process in C#? 【发布时间】:2019-07-12 02:55:08 【问题描述】:

我想确定特定进程的磁盘 I/O 读取数据和写入数据(以字节为单位)的总量。

不确定这是否可以通过性能计数器来完成,因为当我从 MSDN 运行 this 代码示例时,我只看到这些相关的计数器名称,它们似乎无法检索我需要的信息,因为它们在数据中/sec 似乎仅用于计算平均值...

IO 读取操作/秒 IO 写入操作/秒 IO 数据操作/秒 IO 其他操作/秒 IO 读取字节/秒 IO 写入字节/秒 IO 数据字节/秒 IO 其他字节/秒

如果我错了,请解释我需要使用哪些计数器以及如何比较它们的值(使用PerformanceCounter.NextValue() 或PerformanceCounter.NextSample() + CounterSample.Calculate())。

我知道一些任务管理器可以检索到这些信息,例如System Explorer:

我也想这样做。

【问题讨论】:

不开始手动监控 ProcessCounters 自己计算总 IO Read 字节数不是解决办法吗? 你可以 p/invoke GetProcessIoCounters() 这是一个简单的调用来获取基本的统计数据。 @Alex K. 这解决了我的问题和需求,谢谢。随意发布建议使用该 wndows API 功能的答案。顺便说一句,如果我没有问太多,你知道是否存在与处理器时间等效的本机函数吗? (相当于“% Processor Time”性能计数器)检索进程的平均 CPU 使用百分比。再次感谢。 我不知道有什么实用功能,WMI 可以很容易地做到这一点:***.com/questions/22195277/… 【参考方案1】:

GetProcessIoCounters() 是 Perf 计数器/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);
    ...

【讨论】:

以上是关于确定 C# 中指定进程的磁盘 I/O 读写数据总量(以字节为单位)?的主要内容,如果未能解决你的问题,请参考以下文章

(服务运维)I/O流程和模型

对常用I/O模型进行比较说明

性能案例分析 | 查看哪些进程在大量读写磁盘-I/O很高问题排查

如何避免物理磁盘 I/O

Linux服务器 I/O 原理和流程

磁盘I/O高居不下,通过什么来查看占用I/O的进程?