- 最近在总结项目的自动测试相关的技术和知识点.我们项目的自动测试,能够在进行功能测试的同时,一并记录各个功能的CPU和Memory占用情况.此篇博文介绍了我们做的性能监控的程序和涉及到的技术.
- 这里,就做一个简易版的性能监控工具.首先,上图.
- 从运行程序上看,用户需要输入被监控的机器名,进程名,是否监控CPU,是否监控Memory.最后还需要log文件的地址.
- 注意: 由于可以监控非本机的远程机器,所以需要Check Button来测试是否能够正常的监控特定机器中的特定进程.如果能够正常监控,那么会把输入LogFile的button点亮.
- 整个处理流程
- GetProcess,获取指定机器中的所有进程,如果获取成功,将所有的进程名称填入进程名称ComboBox中.
- 核心代码.
1 var processes = Process.GetProcesses(PCName); 2 processes.ToList<Process>().ForEach( 3 p => 4 { 5 if (!string.IsNullOrEmpty(p.ProcessName)) 6 processList.Add(p.ProcessName); 7 }); 8 9 processList.Sort(); 10 11 return processList;
- 核心代码.
-
Check是否能够成功进行监控.
- 核心代码
1 var pcc = new PerformanceCounterCategory("Process", PCName); 2 3 return pcc.GetCounters(ProcessName) != null;
- 核心代码
- 监控
- 首先,我们的做法是每隔一秒钟记录一次性能状态.所以,使用了Timer(System.Windows.Forms.Timer)来进行间隔记录.
1 timer.Tick -= Record; 2 timer.Tick += Record; 3 timer.Interval = Intervalseconds * 1000; 4 timer.Enabled = true;
- 使用PerformanceCounter来进行性能监控.解释一下需要用到的该对象的属性
- CategoryName.获取或设置此性能计数器的性能计数器类别的名称.我们最经常使用到的是“Cache”(缓存)、“Memory”(内存)、“Objects”(对象)、“PhysicalDisk”(物理磁盘)、“Process”(进程)、“Processor”(处理器)、“Server”(服务器)、“System”(系统)和“Thread”(线程).在我们的程序中,使用"Process"来监控进程.
- CounterName.获取或设置与此 PerformanceCounter 实例关联的性能计数器的名称.对于CPU的监控,使用"% Processor Time"来监控CPU的使用率.对于Memory的监控,使用"Working Set"来监控memory的使用量.
- MachineName.获取或设置此性能计数器的计算机名。
- InstanceName.获取或设置此性能计数器的实例名称。
- 核心代码
1 CPUCounter = new PerformanceCounter(); 2 MemoryCounter = new PerformanceCounter(); 3 4 CPUCounter.CategoryName = "Process"; 5 CPUCounter.CounterName = "% Processor Time"; 6 7 MemoryCounter.CategoryName = "Process"; 8 MemoryCounter.CounterName = "Working Set"; 9 10 CPUCounter.MachineName = setting.ComputerName; 11 CPUCounter.InstanceName = setting.ProcessName; 12 13 MemoryCounter.MachineName = setting.ComputerName; 14 MemoryCounter.InstanceName = setting.ProcessName; 15 16 CPUCounter.NextValue(); 17 MemoryCounter.NextValue();
- 记录性能状态.使用PerformanceCounter.NextValue()方法来记录此时的性能状态.
- 核心代码
1 datas.Append(DateTime.Now.ToString("hh:mm:ss") + ","); 2 if (setting.MonitorCPU) 3 { 4 datas.Append(CPUCounter.NextValue().ToString() + ","); 5 } 6 7 datas.Append(DateTime.Now.ToLongTimeString() + ","); 8 if (setting.MonitorMemory) 9 { 10 datas.Append((MemoryCounter.NextValue() / 1048576.0).ToString() + ","); 11 }
- 核心代码
-
停止性能记录动作.
- 核心代码
1 timer.Enabled = false; 2 Thread.Sleep(100);
- 核心代码
- 首先,我们的做法是每隔一秒钟记录一次性能状态.所以,使用了Timer(System.Windows.Forms.Timer)来进行间隔记录.
- GetProcess,获取指定机器中的所有进程,如果获取成功,将所有的进程名称填入进程名称ComboBox中.
-
为了方便大家理解,源代码附上.http://files.cnblogs.com/robyn/PerformanceMonitor.rar