zoukankan      html  css  js  c++  java
  • Performance Counter的使用

    一 PerformanceCounter 基本介绍
    1 简介
    表示 Windows NT 性能计数器组件
    命名空间:System.Diagnostics
    程序集:System(在 system.dll 中)
    2 构造函数(仅仅介绍本文要用到的)
    PerformanceCounter (String, String, String)
    功能:
    初始化 PerformanceCounter 类的新的仅仅读实例,
    并将其与本地计算机上指定的系统性能计数器或自己定义性能计数器及类别实例关联
    參数说明:
    public PerformanceCounter (
     string categoryName,
     string counterName,
     string instanceName
    )
    categoryName
    性能计数器关联的性能计数器类别(性能对象)的名称。
    counterName
    性能计数器的名称。
    instanceName
    性能计数器类别实例的名称,或者为空字符串 ("")(假设该类别包括单个实例)。
    二 演示样例方法:
    须要引用命名空间

    using System.Diagnostics;
    using System.Threading;
    using System.Collections;

    1 获取性能计数器类别列表
    尽管系统中有非常多可用的计数器类别,但与之交互最频繁的可能是“Cache”(缓存)、“Memory”(内存)、
    “Objects”(对象)

    、“PhysicalDisk”(物理磁盘)、“Process”(进程)、“Processor”(处理器)、
    “Server”(server)、“System”(系统
    )和“Thread”(线程)等类别

            public static void GetCategoryNameList()
            {
                PerformanceCounterCategory[] myCat2;
                myCat2 
    = PerformanceCounterCategory.GetCategories();
                
    for (int i = 0; i < myCat2.Length; i++)
                {
                    Console.WriteLine(myCat2[i].CategoryName.ToString());
                }
            }

    2 获取性能计数器类别下的实例的名称实例下的性能计数器的名称

            public static void GetInstanceNameListANDCounterNameList(string CategoryName)
            {
                
    string[] instanceNames;
                ArrayList counters 
    = new ArrayList();
                PerformanceCounterCategory mycat 
    = new PerformanceCounterCategory(CategoryName);
                
    try
                {
                    instanceNames 
    = mycat.GetInstanceNames();
                    
    if (instanceNames.Length == 0)
                    {
                        counters.AddRange(mycat.GetCounters());
                    }
                    
    else
                    {
                        
    for (int i = 0; i < instanceNames.Length; i++)
                        {
                            counters.AddRange(mycat.GetCounters(instanceNames[i]));
                        }
                    }
                    
    for (int i = 0; i < instanceNames.Length; i++)
                    {
                        Console.WriteLine(instanceNames[i]);
                    }
                    Console.WriteLine(
    "******************************");
                    
    foreach (PerformanceCounter counter in counters)
                    {
                        Console.WriteLine(counter.CounterName);
                    }
                }
                
    catch (Exception)
                {
                    Console.WriteLine(
    "Unable to list the counters for this category");
                }
            }

    3 依据categoryName,counterName,instanceName获得性能情况显示

            private static void PerformanceCounterFun(string CategoryName, string InstanceName, string CounterName)
            {
                PerformanceCounter pc 
    = new PerformanceCounter(CategoryName, CounterName, InstanceName);
                
    while (true)
                {
                    Thread.Sleep(
    1000); // wait for 1 second 
                    float cpuLoad = pc.NextValue();
                    Console.WriteLine(
    "CPU load = " + cpuLoad + " %.");
                }
            }

    4 调用方法3显示cpu使用率

    PerformanceCounterFun("Processor""_Total""% Processor Time");

     

     

     

    Performance Counter的使用

     

    client性能測试通过performanceCounter监控client性能指标

         PerformanceCounter PTCounter = new PerformanceCounter("Process",
                                            "% Processor Time",
                                             "AliIM");
                logfile("% Processor Time:" + PTCounter.NextValue().ToString());
                //
    内存

                PerformanceCounter WSCounter = new PerformanceCounter("Process",
                                                                        "Working Set",
                                                                         "AliIM");
                logfile("Working Set:" + ((double)WSCounter.NextValue() / 1024).ToString());

                //内存最高值
                PerformanceCounter MemeryCounter = new PerformanceCounter("Process",
                                                                        "Working Set Peak",
                                                                         "AliIM");
                logfile("Working Set Peak:" + ((double)MemeryCounter.NextValue() / 1024).ToString());


                //
    虚拟内存
                PerformanceCounter PBCounter = new PerformanceCounter("Process",
                                                                  "Private Bytes",
                                                                   "AliIM");
                logfile("Private Bytes:" + ((double)PBCounter.NextValue() / 1024).ToString());

                //句柄数
                PerformanceCounter HCCounter = new PerformanceCounter("Process",
                                                      "Handle Count",
                                                       "AliIM");
                logfile("Handle Count:" + HCCounter.NextValue() .ToString());

                //线程数Thread Count
                PerformanceCounter TCCounter = new PerformanceCounter("Process",
                                          "Thread Count",
                                           "AliIM");
                logfile("Thread Count:" + TCCounter.NextValue() .ToString());

    //补充得到GDI OBJECTS

                Process process;
                process = System.Diagnostics.Process.GetProcessesByName("AliIM")[0];
               
                logfile("GDI Objects Count:" + GetGuiResources(process.Handle, 0));

            [DllImport("User32")]

            extern public static int GetGuiResources(IntPtr hProcess, int uiFlags);

     

     

     

    通过编码方式使用性能计数器来进行性能计数的一个简单样例

    比方我们有这样一个需求:
    我要编码方式记录我们当前编写的程序每秒钟抛出异常数

    假设我们直接使用 Performance 工具,就是採用下图方式依次选择:



    1
    、选择要做性能測试的计算机
    2
    、选择要用那个 Proformance object; 这里我们选择: .NET CLR Exceptions
    3
    、选择 须要的计数项,这里我们选 # of Exceps Thrown / sec
    4
    、选择你要对那个程序进行測试(也就是那个进程产生的异常),在这里就请选择你要測试的程序名字

    假设我们希望用编码方式来实现这个功能的话,也非常easy:
    System.Diagnostics.PerformanceCounter
    就是编码获得性能计数的核心
    这部分的代码例如以下:

    System.Diagnostics.PerformanceCounter pc = new PerformanceCounter();

    // 获取或设置此性能计数器的性能计数器类别的名称。

    pc.CategoryName = ".NET CLR Exceptions";

    // 获取或设置与此 PerformanceCounter 实例关联的性能计数器的名称。

    pc.CounterName = "# of Exceps Thrown / sec";

    // 获取或设置此性能计数器的实例名称。

    pc.InstanceName =

        System.IO.Path.GetFileNameWithoutExtension(AppDomain.CurrentDomain.SetupInformation.ApplicationName);

    pc.ReadOnly = true;

     

     

    Console.WriteLine(pc.RawValue);

    Console.WriteLine(pc.NextValue());

    int num = 30;

    for (int i = 0; i < num; i++)

    {

        try

        {

            throw new Exception("test Exception");

        }

        catch (Exception)

        {

        }

    }

    // 获取或设置此计数器的原始值(即未经过计算的值)。

    Console.WriteLine(pc.RawValue);

    // 获取计数器样本并为其返回计算所得值。

    Console.WriteLine(pc.NextValue());

    Console.WriteLine("===========");


    上述代码仅仅是一个超简单的样例,实际性能计数能够写得比这个更复杂。
    这时候,你能够參考下面几个类:

    说明

    System.Diagnostics.PerformanceCounter

    表示 Windows NT 性能计数器组件。使用该类读取现有提前定义的或自己定义的计数器并向自己定义计数器公布(写入)性能数据。

    System.Diagnostics.PerformanceCounterCategory

    提供与计数器交互的几种方法以及该计算机上计数器的类别。

    System.Diagnostics.PerformanceCounterInstaller

    指定 PerformanceCounter 组件的安装程序。

    System.Diagnostics.PerformanceCounterType

    指定用于计算 PerformanceCounter NextValue 方法的公式。




    附:

    我们这个样例中须要做的性能计数器:

    # of Exceps Thrown / Sec
    (引发的异常数/秒)

    显示每秒引发的异常的数目。它包含 .NET 异常和转换成 .NET 异常的非托管异常。比如,从非托管代码返回的 HRESULT 转换为托管代码中的异常。
    此计数器包含已处理和未处理的异常。此计数器不是一段时间内的平均值;它显示在最后两个样本(以取样间隔持续时间来划分)中观察到的值之间的差异。此计数器是一个潜在性能问题(假设引发多于 100 个的较多数目的异常)的指示器。

     

     

     

    Performance Counter的使用误区

    2008-07-11 20:42

    非常多人在使用PerfomanceCounter的时候直接new PerfomanceCounter实例,然后就去调用NextValue()方法。这样往往得到的值是0.00,今天我也犯了这么错误,找个了半天,最终发现,performance counter在计算值得时候,须要两个样本,假设我们获取到PerformanceCounter后直接调用NextValue()方法,则仅仅会获取到第一个样本的值,该值往往会是0

    以下告诉大家正确的代码是:
    PerformanceCounter pc = new PerformanceCounter();
                pc.CategoryName = cataName;
                pc.CounterName = counter;
                pc.InstanceName = instance;
                pc.MachineName = ".";
                pc.ReadOnly = true;
               
               pc.NextValue();
                System.Threading.Thread.Sleep(1000); //
    1秒,让后系统获取下一个样本

               return pc.NextValue();

    事实上,假设你的对象不销毁,下次再获取的时候就不会为0了,也就不须要再sleep(1000),仅仅要你两次调用NextValue的时间间隔大于1秒。
                

     

  • 相关阅读:
    typora 页内跳转
    shell脚本搭建redis集群
    Html
    python json模块
    jenkins 问题合集
    day05 每日一行
    day04 每次一行
    day03 每日一行
    day02
    day02 每日一行
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4469883.html
Copyright © 2011-2022 走看看