首页 > 代码库 > 性能监控

性能监控

  • 最近在总结项目的自动测试相关的技术和知识点.我们项目的自动测试,能够在进行功能测试的同时,一并记录各个功能的CPU和Memory占用情况.此篇博文介绍了我们做的性能监控的程序和涉及到的技术.
  • 这里,就做一个简易版的性能监控工具.首先,上图.
  • 从运行程序上看,用户需要输入被监控的机器名,进程名,是否监控CPU,是否监控Memory.最后还需要log文件的地址.
    • 注意: 由于可以监控非本机的远程机器,所以需要Check Button来测试是否能够正常的监控特定机器中的特定进程.如果能够正常监控,那么会把输入LogFile的button点亮.
  • 整个处理流程
    1. GetProcess,获取指定机器中的所有进程,如果获取成功,将所有的进程名称填入进程名称ComboBox中.
      1. 核心代码.
         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;        
        GetProcess
    2. Check是否能够成功进行监控.

      1. 核心代码
        1 var pcc = new PerformanceCounterCategory("Process", PCName);
        2 
        3 return pcc.GetCounters(ProcessName) != null;
        CheckCanMonitor
    3. 监控
      1. 首先,我们的做法是每隔一秒钟记录一次性能状态.所以,使用了Timer(System.Windows.Forms.Timer)来进行间隔记录.
        1 timer.Tick -= Record;
        2 timer.Tick += Record;
        3 timer.Interval = Intervalseconds * 1000;
        4 timer.Enabled = true;
        Timer
      2. 使用PerformanceCounter来进行性能监控.解释一下需要用到的该对象的属性
        1. CategoryName.获取或设置此性能计数器的性能计数器类别的名称.我们最经常使用到的是“Cache”(缓存)、“Memory”(内存)、“Objects”(对象)、“PhysicalDisk”(物理磁盘)、“Process”(进程)、“Processor”(处理器)、“Server”(服务器)、“System”(系统)和“Thread”(线程).在我们的程序中,使用"Process"来监控进程.
        2. CounterName.获取或设置与此 PerformanceCounter 实例关联的性能计数器的名称.对于CPU的监控,使用"% Processor Time"来监控CPU的使用率.对于Memory的监控,使用"Working Set"来监控memory的使用量.
        3. MachineName.获取或设置此性能计数器的计算机名。
        4. InstanceName.获取或设置此性能计数器的实例名称。
        5. 核心代码
           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
      3. 记录性能状态.使用PerformanceCounter.NextValue()方法来记录此时的性能状态.
        1. 核心代码
           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                 }
          RecordPerformance
      4. 停止性能记录动作.

        1. 核心代码
          1 timer.Enabled = false;
          2 Thread.Sleep(100);
          StopRecord
  • 为了方便大家理解,源代码附上.http://files.cnblogs.com/robyn/PerformanceMonitor.rar