0

0

C#文件系统性能计数器 C#如何监控磁盘的读写速度和队列长度

月夜之吻

月夜之吻

发布时间:2026-03-09 09:03:11

|

431人浏览过

|

来源于php中文网

原创

使用performancecounter获取磁盘读写速度需指定"physicaldisk"类别、"bytes read/sec"或"bytes written/sec"计数器及"_total"等有效实例名,调用nextvalue()两次(间隔≥1秒)才能获得准确字节/秒值;avg. disk queue length计数器反映平均等待请求数,持续>2(hdd)或>1(ssd)提示i/o瓶颈,同样需两次采样。

c#文件系统性能计数器 c#如何监控磁盘的读写速度和队列长度

如何用 PerformanceCounter 获取磁盘读写速度(Bytes/sec)

Windows 系统自带的 PerformanceCounter 类可直接读取磁盘 I/O 速率,无需驱动或第三方库。关键在于选对性能对象(PhysicalDisk)和计数器(Bytes Read/secBytes Written/sec),且必须使用实例名(如 _Total 或具体磁盘编号 0 C:)。

常见错误是直接用 "PhysicalDisk" 不带实例名,导致抛出 InvalidOperationException: Instance 'xxx' does not exist。正确做法是先枚举可用实例,或明确指定 _Total(聚合所有物理磁盘):

var readCounter = new PerformanceCounter("PhysicalDisk", "Bytes Read/sec", "_Total");
var writeCounter = new PerformanceCounter("PhysicalDisk", "Bytes Written/sec", "_Total");
// 调用 NextValue() 两次,间隔至少 1 秒才有有效值
readCounter.NextValue(); // 第一次调用仅初始化
System.Threading.Thread.Sleep(1000);
float bytesReadPerSec = readCounter.NextValue(); // 单位:字节/秒
  • NextValue() 必须调用两次,首次返回 0 或无效值,第二次才给出真实速率
  • 若监控单个磁盘(如 C:),需先查实例名:PerformanceCounterCategory.GetCategories().FirstOrDefault(c => c.CategoryName == "PhysicalDisk")?.GetCounters(),再找含 C: 的实例
  • 返回值为 float,单位是字节/秒;除以 1024² 可转 MB/s

如何监控磁盘队列长度(Avg. Disk Queue Length)

Avg. Disk Queue Length 表示等待磁盘处理的平均请求数(含正在服务的),是判断 I/O 瓶颈的核心指标。它属于同一 PhysicalDisk 类别,但语义与吞吐量不同:持续 > 2 通常意味着磁盘饱和(尤其在 HDD 上)。

注意该计数器是“平均值”,需采样周期足够长才能稳定,不能靠单次 NextValue() 判断:

Generated Photos
Generated Photos

AI人脸头像生成工具

下载
var queueCounter = new PerformanceCounter("PhysicalDisk", "Avg. Disk Queue Length", "_Total");
queueCounter.NextValue();
Thread.Sleep(1000);
float avgQueue = queueCounter.NextValue(); // 典型安全阈值:HDD ≤ 2,SSD ≤ 1
  • 该值不是瞬时快照,而是采样窗口内的滑动平均,依赖系统 PerfMon 计算逻辑
  • 若值长期为 0,可能是计数器未启用——需确认“Windows Management Instrumentation”服务已运行,且用户有 Performance Monitor Users 组权限
  • SSD 场景下队列长度普遍更低,>1 就值得警惕;而 RAID 阵列可能天然拉高该值,需结合吞吐量交叉分析

为什么第一次读数总是 0 或异常?

PerformanceCounter 的设计机制决定:首次 NextValue() 仅采集基准时间戳和原始计数,不计算差值。第二次调用才用新旧差值除以时间差得出速率。跳过首调直接用第二次结果,会得到上一次残留数据或 0。

  • 必须严格遵循“调用 → 等待 ≥1s → 再调用”流程,硬编码 Sleep(1000) 最稳妥
  • 不要用 Console.WriteLine(counter.NextValue()) 连续打印两次——中间没延时,第二值仍是无效的
  • 若需高频采样(如每 500ms),应启动后台线程持续调用 NextValue() 并缓存最近两个值,自行计算 Δt 和 Δvalue
  • 进程退出前务必调用 counter.Close()counter.Dispose(),否则句柄泄漏可能导致后续创建失败

实际部署时权限和兼容性问题

在 Windows Server 或非管理员账户下,PerformanceCounter 常因权限不足静默失败(不抛异常,但 NextValue() 返回 0)。这不是代码 bug,而是系统策略限制。

  • 开发机默认允许,但生产环境需将运行用户加入 Performance Monitor Users 本地组(而非仅 Administrators)
  • .NET Core/.NET 5+ 在 Windows 上完全支持 PerformanceCounter,但 Linux/macOS 不支持——跨平台方案需改用 System.IO.Ports 或 WMI(ManagementObjectSearcher
  • WMI 查询更灵活(如过滤特定磁盘),但性能开销大、延迟高,不适合实时监控;PerformanceCounter 是唯一低开销原生方案
  • 若程序以服务方式运行,确保服务登录身份具备上述性能监视权限,而非默认 Local System

真正难的不是读取数值,而是理解 Avg. Disk Queue LengthBytes/sec 的耦合关系:高吞吐伴随高队列说明磁盘在全力响应;高队列却低吞吐,则大概率是随机小 IO 或锁竞争——这时候看计数器只是起点,得接着查 Split IO/sec 或用 xperf 定位源头。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

594

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

105

2025.10.23

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

953

2023.09.19

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

764

2023.08.10

console接口是干嘛的
console接口是干嘛的

console接口是一种用于在计算机命令行或浏览器开发工具中输出信息的工具,提供了一种简单的方式来记录和查看应用程序的输出结果和调试信息。本专题为大家提供console接口相关的各种文章、以及下载和课程。

420

2023.08.08

console.log是什么
console.log是什么

console.log 是 javascript 函数,用于在浏览器控制台中输出信息,便于调试和故障排除。想了解更多console.log的相关内容,可以阅读本专题下面的文章。

541

2024.05.29

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1452

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1167

2023.07.27

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

59

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11万人学习

C 教程
C 教程

共75课时 | 5.3万人学习

C++教程
C++教程

共115课时 | 21.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号