分享

C#监控

 _src_ 2020-10-25

监控每个进程占用的cpu,比如任务管理器的进程tab中的CPU

wKioL1YYoXzQUgZVAAVIwUigl-4459.jpg

在代码里,可以通过新建PerformanceCounter来建立监控,其对应的Windows中的自带性能分析工具Perfmon

wKiom1YYoWLCh38FAANUeGgY4ek100.jpg

看下该类的定义中,只要有三个概念:

categoryName:

             The name of the performance counter category (performance object) with which

             this performance counter is associated.

        

counterName:

            The name of the performance counter.

        

instanceName:

             The name of the performance counter category instance, or an empty string

             (""), if the category contains a single instance.

        其对应关系如下:

wKioL1YYo2HxghFnAAKDvJDfbQQ987.jpg

由于instance是变化的,所以每次要根据Process得到instance,那么process跟instance间的关系如何,请看:

PerformanceCounter("Process", "ID Process", instance)这个指标取NextValue()就是ProcessID,就可以跟Process对应起来

但是注意,每个Catagory下面的instance都是不同的,所有Process下的instance到其他Category下就不识别了。

获取instance代码如下:

 

public static string GetInstanceName(string categoryName, string counterName, Process p)
        {
            try
            {
                PerformanceCounterCategory processcounter = new PerformanceCounterCategory(categoryName);
                string[] instances = processcounter.GetInstanceNames();
                foreach (string instance in instances)
                {
                    PerformanceCounter counter = new PerformanceCounter(categoryName, counterName, instance);
                    //Logger.Info("对比in mothod GetInstanceName," + counter.NextValue() + ":" + p.Id);
                    if (counter.NextValue() == p.Id)
                    {
                        return instance;
                    }
                }
            }
            catch (Exception ex)
            {
            }
            return null;
        }

获取cpu占用率的PerformanceCounter:

string instance1 = GetInstanceName("Process", "ID Process", p);
            if (instance1 != null)
            {
                PerformanceCounter cpucounter = new PerformanceCounter("Process", "% Processor Time", instance1);
                if (cpucounter != null)
                {
                    cpucounter.NextValue();
                    System.Threading.Thread.Sleep(200); //等200ms(是测出能换取下个样本的最小时间间隔),让后系统获取下一个样本,因为第一个样本无效
                    return cpucounter;
                }
                else
                {
                    Logger.Info("Name:" + name + "生成CPU监控失败" + instance1);
                }               
            }
            else
            {
                Logger.Info("Name:" + name + "获取cpu监控实例失败" + instance1);
            }

获取GC占用率的PerformanceCounter:

GC选取了PerformanceCounter(".NET CLR Memory", "% Time in GC", instance2)这个counter,但注意,这两个属于不同Category,所以instance不能共用

wKiom1YYpZ-AcMAiAAIoTzg0L0Y925.jpg

代码如下:

// 获取GC占用率 PerformanceCounter            
            string instance2 = GetInstanceName(".NET CLR Memory", "Process ID", p);
            if (instance2 != null)
            {
                PerformanceCounter gccounter = new PerformanceCounter(".NET CLR Memory", "% Time in GC", instance2);
                if (gccounter != null)
                {
                    return gccounter;
                    Logger.Info("Name:" + name + "生成GC监控成功" + instance2);
                }
                else
                {
                    Logger.Info("Name:" + name + "生成GC监控失败" + instance2);
                }
            }
            else
            {
                Logger.Info("Name:" + name + "获取GC监控实例失败" + instance2);
            }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多