1.PerformanceCounter有很多Category,监控进程时Category为Process。它下面有一些windows已实现的PerformanceCounter

public static void GetCounterNameValueList(string CategoryName, string instanceName){string[] instanceNames;ArrayList counters = new ArrayList();PerformanceCounterCategory mycat = new PerformanceCounterCategory(CategoryName);try{counters.AddRange(mycat.GetCounters(instanceName));foreach (PerformanceCounter counter in counters){Console.WriteLine(string.Format("{0,-30}:{1,20}", counter.CounterName, counter.RawValue));}}catch (Exception){Console.WriteLine("Unable to list the counters for this category");}}

输出:

% Processor Time              :        404226406250
% User Time                   :        388479531250
% Privileged Time             :         15746875000
Virtual Bytes Peak            :          1362882560
Virtual Bytes                 :          1222418432
Page Faults/sec               :           423652248
Working Set Peak              :           741462016
Working Set                   :           613257216
Page File Bytes Peak          :           713129984
Page File Bytes               :           546553856
Private Bytes                 :           546553856
Thread Count                  :                  41
Priority Base                 :                   8
Elapsed Time                  :  130114216825494053
ID Process                    :                4376
Creating Process ID           :                3980
Pool Paged Bytes              :             1098488
Pool Nonpaged Bytes           :              154480
Handle Count                  :                1051
IO Read Operations/sec        :              197726
IO Write Operations/sec       :              777888
IO Data Operations/sec        :              975614
IO Other Operations/sec       :             4481054
IO Read Bytes/sec             :          9662784036
IO Write Bytes/sec            :         14714361072
IO Data Bytes/sec             :         24377145108
IO Other Bytes/sec            :            59853109
Working Set - Private         :           458493952

2.内存值可以调用NextValue直接得到,但Cpu、IO是计数器,需要至少两个时间点的值来计算这段时间的平均值。

private static void PrintProcessInfo(string name){PerformanceCounter PTCounter = new PerformanceCounter("Process", "% Processor Time", name);PerformanceCounter DiskReadCounter = new PerformanceCounter("Process", "IO Read Bytes/sec", name);PerformanceCounter DiskWriteCounter = new PerformanceCounter("Process", "IO Write Bytes/sec", name);CounterSample cpuSample1 = PTCounter.NextSample();CounterSample diskReadSample1 = DiskReadCounter.NextSample();CounterSample diskWriteSample1 = DiskWriteCounter.NextSample();Thread.Sleep(1000);CounterSample cpuSample2 = PTCounter.NextSample();CounterSample diskReadSample2 = DiskReadCounter.NextSample();CounterSample diskWriteSample2 = DiskWriteCounter.NextSample();Console.WriteLine(CounterSampleCalculator.ComputeCounterValue(cpuSample1, cpuSample2));Console.WriteLine(CounterSampleCalculator.ComputeCounterValue(diskReadSample1, diskReadSample2));Console.WriteLine(CounterSampleCalculator.ComputeCounterValue(diskWriteSample1, diskWriteSample2)/1024/1024 + " MByte/s");//内存//PerformanceCounter WSCounter = new PerformanceCounter("Process", "Working Set", name);PerformanceCounter WSCounter = new PerformanceCounter("Process", "Working Set - Private", name);Console.WriteLine("Working Set:" + ((double) WSCounter.NextValue()/1024/1024).ToString());//内存最高值PerformanceCounter MemeryCounter = new PerformanceCounter("Process", "Working Set Peak", name);Console.WriteLine("Working Set Peak:" + ((double) MemeryCounter.NextValue()/1024/1024).ToString());}

3.PerformanceCounter 的构造方法,不能使用进程pid,只能用程序名,多个同名时,第一个是原名,第二个加#1,例如:firefox,firefox#1,firefox#2.....

4.一个完整的示例

using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Threading;
using System.Timers;
using Timer = System.Timers.Timer;namespace Logic
{public class ProcessMonitor{private class ProcessCounterSamples{public CounterSample CpuSample;public CounterSample DiskReadSample;public CounterSample DiskWriteSample;public CounterSample DiskReadWriteSample;}private class ProcessInfo{public float CpuPercentage { get; set; }public float DiskRead { get; set; }public float DiskWrite { get; set; }public float DiskReadWrite { get; set; }public float Memory { get; set; }public float MemoryMax { get; set; }}private const int RowsOfBuffer = 10;private const float Mega = (float)1024 * 1024;private string filePath;private Timer timer;private List<ProcessInfo> monitorResults;private object fileLock=new object();private int timerCount;private ProcessCounterSamples lastSample;private PerformanceCounter cpuCounter;private PerformanceCounter diskReadCounter;private PerformanceCounter diskWriteCounter;private PerformanceCounter diskReadWriteCounter;private PerformanceCounter memoryCounter;private PerformanceCounter memoryMaxCounter;//processName:no path, no extension//statFilePath:absolute path, extensionpublic ProcessMonitor(string processName, string statFilePath, int statInterval){filePath = statFilePath;InitPerformanceCounter(processName);monitorResults=new List<ProcessInfo>();timer = new Timer(statInterval);timer.Elapsed += DoStatistics;}public void StartMonitor(){timer.Start();}public void StopMonitor(){timer.Stop();AppendSave(filePath);}private void DoStatistics(object sender, ElapsedEventArgs elapsedEventArgs){int threadsLeft, dummy;ThreadPool.GetAvailableThreads(out threadsLeft, out dummy);if (threadsLeft < 2) return; ProcessInfo info = GetProcessInfo();monitorResults.Add(info);if (timerCount % RowsOfBuffer == 0) AppendSave(filePath);}private void AppendSave(string fileName){lock (fileLock){using (StreamWriter sw = new StreamWriter(fileName, true)){var list = monitorResults;monitorResults = new List<ProcessInfo>();foreach (ProcessInfo info in list){sw.WriteLine("{0},{1},{2},{3},{4},{5}", info.CpuPercentage, info.Memory, info.MemoryMax, info.DiskRead, info.DiskWrite, info.DiskReadWrite);}sw.Close();}}}private ProcessInfo GetProcessInfo(){ProcessInfo result = new ProcessInfo();ProcessCounterSamples currentSample = new ProcessCounterSamples();currentSample.CpuSample = cpuCounter.NextSample();currentSample.DiskReadSample = diskReadCounter.NextSample();currentSample.DiskWriteSample = diskWriteCounter.NextSample();currentSample.DiskReadWriteSample = diskReadWriteCounter.NextSample();if (lastSample == null){result.CpuPercentage = 0f;result.DiskRead = 0f;result.DiskWrite = 0f;result.DiskReadWrite = 0f;}else{result.CpuPercentage = CounterSampleCalculator.ComputeCounterValue(lastSample.CpuSample, currentSample.CpuSample);result.DiskRead = CounterSampleCalculator.ComputeCounterValue(lastSample.DiskReadSample, currentSample.DiskReadSample) / Mega;result.DiskWrite = CounterSampleCalculator.ComputeCounterValue(lastSample.DiskWriteSample, currentSample.DiskWriteSample) / Mega;result.DiskReadWrite = CounterSampleCalculator.ComputeCounterValue(lastSample.DiskReadWriteSample, currentSample.DiskReadWriteSample) / Mega;}lastSample = currentSample;result.Memory = memoryCounter.NextValue() / Mega;result.MemoryMax = memoryMaxCounter.NextValue() / Mega;return result;}private void InitPerformanceCounter(string processName){cpuCounter = new PerformanceCounter("Process", "% Processor Time", processName);diskReadCounter = new PerformanceCounter("Process", "IO Read Bytes/sec", processName);diskWriteCounter = new PerformanceCounter("Process", "IO Write Bytes/sec", processName);diskReadWriteCounter = new PerformanceCounter("Process", "IO Data Bytes/sec", processName);memoryCounter = new PerformanceCounter("Process", "Working Set - Private", processName);//memorymemoryMaxCounter = new PerformanceCounter("Process", "Working Set Peak", processName);//memory peak
        }}
}

调用:

ProcessMonitor monitor2 = new ProcessMonitor("firefox", "D:\\tempData\\tmp2.csv", 1000);monitor2.StartMonitor();Thread.Sleep(21000);monitor2.StopMonitor();

-----------

用timer写法不正确,可能会造成多线程时计数器同时访问的情况,从而计算出很大的结果。

performanceCounter的访问可能需要管理员权限

http://openpdc.codeplex.com/discussions/247310

http://social.msdn.microsoft.com/Forums/zh-CN/vstswebtest/thread/c54247d9-6035-4d77-9293-e9986517e310

转载于:https://www.cnblogs.com/devourer/archive/2013/05/09/3069165.html

用PerformanceCounter做进程的CPU内存IO监控示例相关推荐

  1. Linux 查看CPU 内存 IO使用率,linux 查看CPU内存 网络 流量 磁盘 IO

    使用vmstat命令来察看系统资源情况 在命令行方式下,如何查看CPU.内存的使用情况,网络流量和磁盘I/O? Q: 在命令行方式下,如何查看CPU.内存的使用情况,网络流量和磁盘I/O? A: 在命 ...

  2. python获取当前进程的CPU内存等信息

    简介: psutil可以获取操作系统的各种信息,本文通过一个简单的示例介绍如何获取当前进程的CPU和内存信息. 安装: pip install psutil 代码示例: import psutil i ...

  3. python glances来监控linux服务器CPU 内存 IO使用

    什么是 Glances? Glances 是一个由 Python 编写,使用 psutil 库来从系统抓取信息的基于 curses 开发的跨平台命令行系统监视工具. 通过 Glances,我们可以监视 ...

  4. linux性能测试cpu内存io,Linux下磁盘IO性能测试工具介绍

    近来想了解一下开发环境的IO性能,分别用dd/orion/iozone/bonnie++四种工具测试了一下 开发环境系统配置如下: Intel SR1625 server, 2 CPU, 32GB内存 ...

  5. linux内存跑分,RaspberryPi 4B 4G版本跑分测|CPU|内存|IO|网络|性能全面测试

    前言 拿到手最新的RaspberryPi 4B 4G版本,新版本的4修复了之前的硬件bug. 直接官方安装软件刷上了最新版本的Linux raspberrypi 4.19.97,MicroSD卡选用的 ...

  6. 虚拟化技术简介--CPU/内存/IO/网络虚拟化介绍

    1. 概述 本文讨论的虚拟化,是指将一台计算机虚拟为多台逻辑计算机.在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响. 2. ...

  7. 优化命令之vmstat——监控虚拟内存、进程、cpu

    目录 一:vmstat概述 1.1物理内存和虚拟内存 1.2虚拟内存原理 二:vmstat命令 2.1vmstat格式 2.2vmstat参数 三:案例 3.1显示虚拟内存使用情况 3.2一秒内显示2 ...

  8. linux监测指定进程的CPU及物理内存消耗情况(c程序)

    近日,由于工作要求,研究了一下如何在linux系统下对某个指定的单个进程进行监测,分析其CPU及物理内存的使用情况,并基于c语言写了一个独立的模块,完整的实现上述功能.现将整个模块的代码贴上,以便日后 ...

  9. centOS7下实践查询版本/CPU/内存/硬盘容量等硬件信息

    https://www.cnblogs.com/zy-plan/p/8617202.html 1.系统 1.1版本 uname -a 能确认是64位还是32位,其它的信息不多 [root@localh ...

最新文章

  1. java thread参数传递_将参数传递给Java Thread
  2. ios 关于block传值报错
  3. Angular-Ui-Router+ocLazyLoad动态加载脚本
  4. ubuntu卡在载入初始化内存盘_Intel傲腾内存揭秘:八路系统可达36TB!
  5. matlab柱状斜线_Matlab小练习:按斜线方向依次赋值矩阵
  6. 【转】WebSocket详解(一):初步认识WebSocket技术
  7. HihoCoder 1323 回文字符串
  8. MyCAT全局序列号-数据库方式
  9. 【转】C#事件和委托的理解
  10. 六安:在线监测 精准调控 构建智慧城市节水管理平台
  11. mysql version 50713_MySQL 5.6 升级为 MySQL 5.7
  12. 七步法计算测量不确定度:第八步
  13. CMMI证书有效期是多久?到期后自己可以办理吗
  14. 委托租赁云服务器协议,委托租赁云服务器协议
  15. JZOJ3426. 封印一击
  16. 用Python写一个简单的api接口
  17. 1032 挖掘机技术哪家强
  18. Form表单 JSON Content-type解析
  19. Websphere8.5.5最新补丁包 :WebSphere Application Server V8.5.5 Fix Pack 15(8.5.5.15)
  20. mysql通用mapper_这就是——通用Mapper

热门文章

  1. H5移动端调取相机或相册
  2. 八年级上册计算机知识点总结,八年级英语上册知识点归纳
  3. C语言课程设计报告税,c语言编写程序,输入月薪数a,计算并输出税率、应缴税款和实得奖金数。工薪所得扣除标 请编写一个个人所得税...
  4. 认证、HTTPS、证书的基本含义
  5. win11 蓝牙耳机连接电脑显示其他设备解决办法
  6. 2011最新《呼啸山庄/咆哮山庄》720p.BD中英双字幕
  7. 2022G2电站锅炉司炉考试题库及答案
  8. spark pairRDD操作
  9. SpringBoot中Service层事务控制
  10. 触摸手势图标大全:48款触摸手势图标免费下载