You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 02:05:18