之前简单说了下IIS的调优和监控,这里还帮朋友做了下 .NET Framework的监控分析并调优 ,插播这篇,留下点记忆。分析改进由于种种原因,Jason之后会换个方式讲述的。
.NET Framework的调优主要是CLR(common language runtime)的调优,而其他实现技术的性能测试流程基本没有什么变化,具体可以参考 性能测试workflow。
CLR的调优主要取决于你的架构和你代码为CLR接受的程度,你的设计要更好的,有效的使用GC。我们怎么做可以提高GC的效率呢。
1.正确的使用合理的处理模式(Dispose pattern)。
2.严格规定事务的生命周期。
而CLR的瓶颈主要有 资源的竞争,资源清理的不有效, 滥用线程池 还有就是老问题内存泄露。
首先我们了解下如何识别CLR的瓶颈:
如果您的机器装了.NET Framework,我们需要在perfmon下添加相应的监控计数器来监控性能并识别性能瓶颈。下面是推荐的计数器:
1.过度的内存消耗:主要由低效率的管理的内存消耗或者未管理的内存消耗导致。
* Process\Private Bytes
* .NET CLR Memory\# Bytes in all Heaps
* Process\Working Set
* .NET CLR Memory\Large Object Heap size
一般情况下,如果Process\Private Bytes不断增长,如果.NET CLR Memory\# Bytes in all Heaps仍然保持不变,那么显示为未管理内存消耗,如果一起增长即为管理的
内存消耗。
2.大工作集合的大小:工作集为现有加载在 RAM 上的内存页的集合。
我们可以通过Process\Working Set来监控。如果值比较大,说明您可能加载了比较多数的assemblies。比较大的值或者值波动的现象出现可能意味着您的内存短缺。
一般情况下高值和波动值伴随着高的内存页错误直接显示了您的服务器内存的不足。
3.大对象区:
一般大于83K的大对象会被分配到大对象区。.NET CLR Memory\Large Object Heap size主要监控1大对象区的情况,2读写buffers的情况。大对象可能造成大的内存堆栈碎片,所有我们要考虑在代码端的recycling.
4.CPU的监控:CPU的usage直接关系到托管代码的写。
* % Time in GC.可以监控是否造成过度过量的GC。
* .NET CLR Exceptions\# of Exceps Thrown /sec.可以监控是否有大量的异常抛出。
* Thread\Context Switches/sec.这个我们需要监控是否有大量的线程产生,这一点与第5点结合将是解决并发问题的主要监控点。
5.线程竞争:
* .NET CLR LocksAndThreads\Contention Rate / sec
* .NET CLR LocksAndThreads\Total # of Contentions
我们需要以上两个监控点来监控相应的线程资源利用情况。
如果线程竞争率或者线程竞争的数量呈明显上升的时候,这时我们需要关注我们应用程序的线程竞争问题了。
我们大多数的分析都建立在这些性能监控点之上,而.NET的WEB应用程序性能的调优,远不止这些,我们还需要在ASP.NET等不少地方下更大的功夫。