如何在Windows中计算与任务管理器一致的当前进程磁盘I/O使用率
解决Windows进程磁盘I/O使用率与任务管理器匹配的问题
一、任务管理器「磁盘」列的计算逻辑
任务管理器中进程的磁盘使用率,基于两个Windows性能计数器的比值计算:
- 目标进程的
\Process(<进程名>)\IO Data Bytes/sec:该进程每秒向文件系统发起的读写请求总字节数(包含缓存命中的操作,无需实际磁盘I/O) - 当前磁盘的
\PhysicalDisk(*)\Disk Bytes/sec:所有进程对该磁盘的每秒总读写字节数(包含缓存操作)
最终百分比 = (进程IO请求字节速率 / 磁盘总IO字节速率) × 100%
若系统有多块磁盘,任务管理器会自动匹配进程I/O对应的磁盘,计算该磁盘下的占比。
二、psutil.io_counters()不准的原因
psutil的io_counters()读取的是Windows内核提供的IO_COUNTERS结构体,其中的read_bytes和write_bytes统计的是实际从磁盘读取/写入的物理字节数,不包含缓存命中的操作。
而YARA这类文件扫描库通常会使用**内存映射文件(Memory-Mapped Files)**读取文件:大部分数据会命中系统文件缓存,无需触发实际磁盘I/O,这部分请求字节数会被任务管理器的性能计数器统计,但不会被IO_COUNTERS记录,导致psutil的结果远小于任务管理器显示值。
此外,若YARA使用异步I/O、或通过系统服务间接发起I/O请求,这部分操作也可能不被IO_COUNTERS关联到目标进程,进一步加剧差异。
三、Python实现匹配任务管理器的方案
使用pywin32库访问Windows性能计数器,直接获取任务管理器依赖的指标。以下是示例代码:
import win32pdh import time def get_process_io_rate(process_name): # 初始化查询进程IO Data Bytes/sec计数器 query = win32pdh.OpenQuery() counter_path = win32pdh.MakeCounterPath((None, "Process", process_name, None, 0, "IO Data Bytes/sec")) handle = win32pdh.AddCounter(query, counter_path) # 第一次采样(初始值) win32pdh.CollectQueryData(query) time.sleep(1) # 第二次采样,计算速率 win32pdh.CollectQueryData(query) _, rate = win32pdh.GetFormattedCounterValue(handle, win32pdh.PDH_FMT_LONG) win32pdh.RemoveCounter(handle) win32pdh.CloseQuery(query) return rate def get_disk_total_rate(): # 初始化查询所有磁盘的总IO速率 query = win32pdh.OpenQuery() counter_path = win32pdh.MakeCounterPath((None, "PhysicalDisk", "*", None, 0, "Disk Bytes/sec")) handle = win32pdh.AddCounter(query, counter_path) win32pdh.CollectQueryData(query) time.sleep(1) win32pdh.CollectQueryData(query) _, total_rate = win32pdh.GetFormattedCounterValue(handle, win32pdh.PDH_FMT_LONG) win32pdh.RemoveCounter(handle) win32pdh.CloseQuery(query) return total_rate if __name__ == "__main__": process_name = "your_process.exe" # 替换为目标进程名 process_io = get_process_io_rate(process_name) disk_total = get_disk_total_rate() if disk_total > 0: disk_usage_percent = (process_io / disk_total) * 100 print(f"进程磁盘使用率: {disk_usage_percent:.2f}%") else: print("磁盘无IO活动")
注意事项:
- 若存在多个同名进程,需通过PID指定(修改
MakeCounterPath的参数,将进程名替换为PID) - 需以管理员权限运行,否则可能无法访问部分性能计数器
- 采样间隔(示例中为1秒)需与任务管理器的采样频率保持一致(默认约1秒)
四、其他可靠解决方案
- Sysinternals Process Explorer:微软官方工具,显示的进程I/O数据与任务管理器完全一致,可直接查看或导出数据
- Windows Performance Monitor:通过添加
Process和PhysicalDisk计数器,自定义监控进程磁盘使用率
内容的提问来源于stack exchange,提问作者Pedram
相关产品推荐
相关产品推荐

