“性能监视器”监视系统性能的基本设置

摘要:
性能监视器是一个Microsoft管理控制台管理单元,提供用于分析系统性能的工具。启动Windows性能监视器:搜索栏输入perfmon--˃回车。性能随此数目的增大而下降。用于监视可能的内存泄漏,或者监视受管或未受管对象的内存使用率是否过大。特定进程中句柄计数的增加可能是发生句柄泄漏的错误进程的症状,这将导致服务器上发生性能问题。指令是在处理器中基本的执行单位,线程是指执行指令的对象。该计数器的值必须为0。

性能监视器是一个 Microsoft 管理控制台 (MMC) 管理单元,提供用于分析系统性能的工具。仅从一个单独的控制台,即可实时监视应用程序和硬件性能,自定义要在日志中收集的数据,定义警报和自动操作的阈值,生成报告以及以各种方式查看过去的性能数据。

启动 Windows 性能监视器:搜索栏输入 perfmon --> 回车。

一、常用计数器

运行截图:

曲线图

常用的监视计数器:

对象

计数器

说明

.NET CLR Exceptions# of Exceps Thrown / sec显示每秒钟抛出的异常数。这包括 .NET 异常和转换为 .NET 异常的未受管异常。性能随此数目的增大而下降。
.NET CLR Memory# Bytes in all Heaps显示其他四个计数器的总和:Gen 0 堆大小、Gen 1 堆大小、Gen 2 堆大小以及大对象堆大小。此计数器表示 GC 堆上当前分配的内存(以字节为单位)。此计数器的值总是比 ProcessPrivate Bytes 的值小,ProcessPrivate Bytes 对进程的 MEM_COMMIT 区域进行计数。Private Bytes minus # Bytes in all Heaps 就是由未受管对象提交的字节数。
用于监视可能的内存泄漏,或者监视受管或未受管对象的内存使用率是否过大。
.NET CLR RemotingRemote Calls/sec显示每秒调用的远程过程调用的数目。远程过程调用是对调用方所在应用程序域之外的任何对象的调用。此计数器不是一段时间内的平均值;它显示最近两个样本观测值的差除以取样间隔所得的结果。
.NET Data Provider for OracleNumberOfFreeConnections连接池中可用连接的数量。
.NET Data Provider for SqlServerNumberOfFreeConnections连接池中可用连接的数量。
Process% Processor Time显示所有进程线程用于执行指令的已用处理器时间的百分比。指令是计算机中的基本执行单位;线程是执行指令的对象;进程是运行程序时创建的对象。此计数中包含了处理某些硬件中断和陷阱条件时执行的代码。如果总的处理器时间较长,请使用此计数器确定导致 CPU 利用率很高的进程。
ProcessHandle Count显示此进程当前打开的句柄的总数。此数字是此进程中的每个线程当前打开的句柄总数。特定进程中句柄计数的增加可能是发生句柄泄漏的错误进程的症状,这将导致服务器上发生性能问题。此问题并不一定会出现,但是在一段时间内对其进行监视以确定是否发生句柄泄漏十分重要。
ProcessThread Count这个进程中正在活动的线程数目。指令是在处理器中基本的执行单位,线程是指执行指令的对象。每个运行的进程至少有一个线程。
SQLServer:General StatisticsUser Connections显示sqlserver目前连接的数量,而不是用户数。如果该计数器超过255,那么你需要将sqlserver的"Maximum Worker Threads" 的配置值设置得比缺省值255高。如果连接的数量超过可用的线程数,那么sqlserver将共享线程,这样会影响性能。"Maximum Worker Threads"需要设置得比你服务器曾经达到的最大连接数更高。
SQLServer:LocksNumber of Deadlocks/sec死锁的数量/秒,死锁对应用程序的可伸缩性非常有害,并且会导致恶劣的用户体验。该计数器的值必须为0。
LogicalDisk% Free Space% Free Space 是所选逻辑磁盘驱动器上总计可用空间所占的百分比。
PhysicalDiskDisk Read Bytes/sec指在读取操作时从磁盘上传送字节的速率。
PhysicalDiskDisk Write Bytes/sec指在写入操作时传送到磁盘上的字节速度。

默认状况下,以下两个计数器的开关是关着的,需要配置下 %WINDIR%microsoft.netFramework64v4.0.30319Configmachine.config 如下开关的(32和64位操作系统的路径不同),否则数据采集不到。

.NET Data Provider for OracleNumberOfFreeConnections
.NET Data Provider for SqlServerNumberOfFreeConnections

增加配置,并重启相应的进程(重启服务 或 重启IIS等)。

<system.diagnostics>
  <switches>
    <add name="ConnectionPoolPerformanceCounterDetail"value="4"/>
  </switches>
</system.diagnostics>
二、用C#采集计数器的数据

虽然Windows自带了perfmon工具,并可以生成报告以及以各种方式查看过去的性能数据,但是有时候我们还是定义自己的一些曲线或者报表,那么就需要将性能监视器的数据收集起来,C#提供了PerformanceCounterCategory(性能对象),PerformanceCounter(性能计数器组件)两个类,提供了操作性能监视器的一些方法,这样我们就能把数据读取出来保存到数据库中或者文件中,可用来随意产生一些曲线或报表,或者报警Mail等。

usingSystem;
usingSystem.Diagnostics;
usingSystem.Threading;
namespaceTestApplication
{
    public classProgram
    {
        static void Main(string[] args)
        {
            Console.WriteLine(GetPerfCount("Process", "% Processor Time", "_Total"));
            Console.WriteLine(GetPerfCount(".NET CLR Memory", "# Bytes in all Heaps", "_Global_"));
            Console.WriteLine(GetPerfCount("SQLServer:General Statistics", "User Connections"));
            Console.Read();
        }
        /// <summary>
        ///获取计数器样本并为其返回计算所得值--有实例的计数器(对于大多数的计数器)
        /// </summary>
        /// <param name="categoryName"></param>
        /// <param name="counterName"></param>
        /// <param name="instance"></param>
        /// <returns></returns>
        public static float GetPerfCount(string categoryName, string counterName, stringinstance)
        {
            PerformanceCounter counter = newPerformanceCounter
            {
                CategoryName =categoryName,
                CounterName =counterName,
                InstanceName =instance,
                MachineName = ".",
                ReadOnly = true
            };
            counter.NextValue();
            Thread.Sleep(200);
            try
            {
                if (counter != null)
                {
                    returncounter.NextValue();
                }
            }
            catch(Exception)
            {
                return -2f;
            }
            return -1f;
        }
        /// <summary>
        ///获取计数器样本并为其返回计算所得值--无实例的计数器
        ///比如categoryName=SQLServer:General Statistics,counterName=User Connections
        /// </summary>
        /// <param name="categoryName"></param>
        /// <param name="counterName"></param>
        /// <returns></returns>
        public static float GetPerfCount(string categoryName, stringcounterName)
        {
            PerformanceCounter counter = newPerformanceCounter
            {
                CategoryName =categoryName,
                CounterName =counterName
            };
            counter.NextValue();
            Thread.Sleep(200);
            try
            {
                if (counter != null)
                {
                    returncounter.NextValue();
                }
            }
            catch(Exception)
            {
                return -2f;
            }
            return -1f;
        }
    }
}

免责声明:文章转载自《“性能监视器”监视系统性能的基本设置》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇HomeKit开发(一)thrift入门(1) 安装配置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

java笔试题

1,有关线程的哪些叙述是对的()A,一旦一个线程被创建,它就立即开始运行。B,使用start()方法可以使一个线程成为可运行的,但是它不一定立即开始运行。C,当一个线程因为抢先机制而停止运行,它被放在可运行队列的前面。D,一个线程可能因为不同的原因停止并进入就绪状态。答案:BCD在抢占式线程模型中,操作系统可以在任何时候打断线程。通常会在它运行了一段时间(...

Java NIO 学习笔记(七)----NIO/IO 的对比和总结

目录:Java NIO 学习笔记(一)----概述,Channel/BufferJava NIO 学习笔记(二)----聚集和分散,通道到通道Java NIO 学习笔记(三)----SelectorJava NIO 学习笔记(四)----文件通道和网络通道Java NIO 学习笔记(五)----路径、文件和管道 Path/Files/PipeJava NI...

sql server中字符串无法替换空格的问题

直接上代码: select case when 'workReport'=LTRIM(RTRIM(' workReport ')) then 'trim去空格成功' when 'workReport'=REPLACE(' workReport ',' ','') then 'replace去空格成功' when 'workReport'=REPLACE('...

多线程处理同一个List测试dome

package com.sysware.p2m.task.op.process; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; public class ThreadTese{ static cla...

Java多线程并发系列之闭锁(Latch)和栅栏(CyclicBarrier)

   JAVA并发包中有三个类用于同步一批线程的行为,分别是闭锁(Latch),信号灯(Semaphore)和栅栏(CyclicBarrier)。本贴主要说明闭锁(Latch)和栅栏(CyclicBarrier)。 1. 闭锁(Latch) 闭锁(Latch)  —— 确保多个线程在完成各自事务后,才会打开继续执行后面的内容,否则一直等待。 计数器闭锁(...

InvokeRequired与Invoke

在多线程应用中将会涉及不同的线程访问同一控件的问题,C#中禁止跨线程直接访问控件。某个控件在被创建时就记下了是谁创建了它,即它的创建线程。如果从另一个线程调用该控件,那么必须使用控件的 Invoke 方法来将调用封送现在调用它的线程。(Invoke方法是控件的方法) 到底是哪个线程要使用该控件呢?需要用InvokeRequired来询问一下,如果当前调用线...