构建高性能ASP.NET站点 第六章—性能瓶颈诊断与初步调优(上篇)—识别性能瓶颈

简介:
构建高性能ASP.NET 站点  第六章性能瓶颈诊断与初步调优(上 篇)识别性能瓶颈
 
    前言:从本篇开始就真正的进入了性能调优的阶段,在之前的文章中提到了页面加载过慢的四个性能问题,其中第一个问题就是:服务端解析.aspx 页面的时间过长,本篇就分析这个问题,给出一些方案,因为涉及到的问题很多,的在后续文章会逐个详细介绍。
 
    因为本篇的篇幅过长,所以划分为了多篇。 
   本篇的议题如下:
   识别和分析服务端的性能瓶颈( )
  内存
  缓存
   CPU
  处理请求线程
提高性能的一些改进措施(下)
          部署优化( 前篇)
          不必要回传( 中篇)
          不必要的请求( 后篇)
        
在服务端有很多可以优化的地方,优化的话题也很多,在本篇中我们主要关注:如果让服务端更快的生成页面,同时也关注如果更快的让生成的页面更快的到达客户端浏览器。
其实我们就是在优化下面的时间线:
 
 
 
要缩短上面的那条时间线,就需要服务端更好的利用它的资源,例如更好的利用和分配内存资源,CPU 资源等。如何好的充分利用这些资源,一定程度上与我们写的代码的质量息息相关,一段好的,高效的代码往往可以让我们少花钱去更多的硬件设备(所以代码的质量非常重要)。 
          下面我们就来看看服务端一般可能出现的性能瓶颈:
          内存不足
          缺乏缓存
         CPU 压力
          处理请求线程问题
 
接下来会介绍如何采用系统的性能诊断工具来辨明:到底是哪种性能瓶颈导致了服务端解析页面过慢。在用性能诊断工具找出了问题之后,然后针对问题再次做详细的分析,同时收集数据,根据这些数据来采用对应的措施,对症下药。至于每一种性能问题如何采取何种措施解决,我们后面的文章会一章章的详细详述,请大家稍安勿躁,在此我们先学会发现问题。发现站点的可能出现了性能问题之后,首先不要立刻的修改站点或者服务器,而是要先诊断出瓶颈出现在哪里。 J

      内存

          首先要判断服务器是否内存不足。因为如果内存不足,那么会增加服务器的CPU 压力和磁盘的IO 读写操作,发过来说,如果解决了内存不存的问题,自然而然的就减少了CPU 和磁盘IO 读写操作。
 
          为什么内存不存会增加CPU 的压力和磁盘的IO 读写操作?
          当系统的内存不足的时候,系统就会把原来需要放在内存的一些数据转移保存在磁盘上面,保存为pagefile.sys 。当这些数据被需要的时候,那么系统就会去读写磁盘。读写磁盘的操作会消耗CPU 资源,同时增加了磁盘的IO 操作。
 
          下面我们就来看看,如何识别内存不足性能瓶颈。
          我们主要讲述如何在Window 服务器系统中诊断这个问题。
 
         Window Server 2003
          在系统的命令行中输入perfom。就会弹出如下的窗口。然后点击工具栏上面的”+” 按钮,在Performance object下拉框中选择Memory,然后再选择Pages/sec计数器。如果这个值很大,就说明CPU 在内存和磁盘之间不断的交换数据。
 
 
         
   
         Windows Vista, Server 2008, Window 7
          Windows Vista Windows Server 2008 Window 7 中不仅 可以运行”perfmon” ,打开性能监视窗口。而且可以运行resmon来开启资源监视窗口,从这个窗口看,可以更加直观。在资源监视窗口中看到硬错误/ ”(Hard Faults/sec). 然后检查每个进程的这个值,如果进程的硬错误/ 数值很高,那么就说明服务器已经是内存不足了。(我们将会在后续的文章讲述如何解决这个问题,此处我们先讲述如何找出这个问题)
 
 

     

     缓存 

          大家都知道,在适当的实用缓存策略可以极大的提高服务端的性能。我们一般把数据缓存在内存中,例如浏览器的内存,代理服务器的内存等。而且可以把一些常用的对象,部分的页面,甚至整个页面缓存起来。
 
          缓存的好处有很多,如下:
                   缩短服务端的响应时间
                  减少CPU的使用压力
                  避免频繁的读取数据库
                  如果把数据缓存在浏览器或者代理服务器,还可以减少不必要的回传。     
 
          一般来说,我们把一些使用很频繁的数据或者每次生成都要花费大量资源的数据缓存起来。
      但是如何才算得上是使用很频繁
      没有一定的标准了,还是那句话:看情况!例如,如果一个页面在1 秒钟之内被请求了10 次,可能相比较其他的页面而言,这个页面的请求不算”” 频繁(其他的页面在1 秒之内请求100 ) ,但是如果把这个页面缓存1 秒,也是对性能的极大提升,因为可以一秒之内,有90% 的请求都是由缓存响应的。大家可以去参看一下缓存的5 分钟法则。至于如何进行缓存,在后面的文章讲解。

  CPU

   还是和之前内存诊断一样,我们可以运行perfmon命令,然后在Processor分类下面选%Processor Time计数器。如下:
 
 
   
    同时,我们还可运行resmon来打开“资源监视窗口”来看:
 
   
 
 
     大家可以看到第一个标红色框的CPU列,其实这个就是反应了 %Processor Time计数器监控的结果。一般来说,如果某个进程的这个值高于了80% ,那么就说明这个进程对CPU 资源有很大的消耗。如果是w3wp.exe 这个进程消耗了80% ,就说你的站点消耗了大量的CPU 。我们会在后续的文章讲述:如果减小CPU 的压力。
 
  处理请求线程
 
我们知道:发送到服务器的每一个请求,都是有应用程序池中的一个线程来处理的。而且用来处理请求的线程的数量是有IIS 来控制的,如果应用程序池中没有空闲的线程来处理新的请求,那么这个请求就被放在请求队列中进行等待。如果在服务端的请求队列太长了,服务器忙不过来,那么新来的请求很有可能被服务器拒绝。
 
          一般来说,一个应用程序池中的可用的线程数量由服务端安装的.NET Framework 的版本和IIS 的一些设置来决定的。
.NET Framework Version
默认的可用线程数
1.1
20*CPU 的数量-8
2.0
12* CPU 的数量
3.5, 4.0
IIS 7 经典模式:12* CPU 的数量
 
IIS 7  集成模式: 100* CPU 的数量
 
   如果在服务端没有足够的线程来处理请求,这种情况就是所谓的线程饥饿。我们可以通过系统的性能计数器来检查站点的服务端是否发生了这种情况:
1.        在命令窗口运行perfmon”. 如下:
 
2.        在打开的性能监视窗口中,选择性能监视器,如下:
 
3.        点击“ + ”按钮,然后展开ASP.NET分类:
 
4.        添加如下计数器:
Request Execution Time
处理一个请求花费的时间( 单位是:毫秒)
Request Current
现在ASP.NET 运行时要处理的请求数量,包括正在处理的请求和等待队列中的请求。
 
5.        然后展开ASP.NET Applications” 分类,添加如下计数器:
Request Executing
现在正在被处理的请求数
如果”Request Current” 的数量大于了Request Executing 的数量,那么就说明有请求在等待被处理。后面的文章会详细讲述如何处理这种情况。
 
 
     OK,今天就暂时发上这些,贵在理解和操作。下一篇接着讲述。我在写一些模拟上面性能瓶颈的代码,有需要的朋友留个email。




















本文转自yanyangtian51CTO博客,原文链接: http://blog.51cto.com/yanyangtian/493582  ,如需转载请自行联系原作者

相关文章
|
9月前
|
存储 Shell Linux
快速上手基于 BaGet 的脚本自动化构建 .net 应用打包
本文介绍了如何使用脚本自动化构建 `.net` 应用的 `nuget` 包并推送到指定服务仓库。首先概述了 `BaGet`——一个开源、轻量级且高性能的 `NuGet` 服务器,支持多种存储后端及配置选项。接着详细描述了 `BaGet` 的安装、配置及使用方法,并提供了 `PowerShell` 和 `Bash` 脚本实例,用于自动化推送 `.nupkg` 文件。最后总结了 `BaGet` 的优势及其在实际部署中的便捷性。
379 11
|
6月前
|
前端开发 C# 开发者
.NET使用Umbraco CMS快速构建一个属于自己的内容管理系统
.NET使用Umbraco CMS快速构建一个属于自己的内容管理系统
86 12
|
6月前
|
弹性计算 开发框架 安全
基于云效 Windows 构建环境和 Nuget 制品仓库进行 .Net 应用开发
本文将基于云效 Flow 流水线 Windows 构建环境和云效 Packages Nuget 制品仓库手把手教你如何开发并部署一个 .NET 应用,从环境搭建到实战应用发布的详细教程,帮助你掌握 .NET 开发的核心技能。
|
7月前
|
Kubernetes Cloud Native Ubuntu
庆祝 .NET 9 正式版发布与 Dapr 从 CNCF 毕业:构建高效云原生应用的最佳实践
2024年11月13日,.NET 9 正式版发布,Dapr 从 CNCF 毕业,标志着云原生技术的成熟。本文介绍如何使用 .NET 9 Aspire、Dapr 1.14.4、Kubernetes 1.31.0/Containerd 1.7.14、Ubuntu Server 24.04 LTS 和 Podman 5.3.0-rc3 构建高效、可靠的云原生应用。涵盖环境准备、应用开发、Dapr 集成、容器化和 Kubernetes 部署等内容。
375 5
|
10月前
|
C# Windows 开发者
超越选择焦虑:深入解析WinForms、WPF与UWP——谁才是打造顶级.NET桌面应用的终极利器?从开发效率到视觉享受,全面解读三大框架优劣,助你精准匹配项目需求,构建完美桌面应用生态系统
【8月更文挑战第31天】.NET框架为开发者提供了多种桌面应用开发选项,包括WinForms、WPF和UWP。WinForms简单易用,适合快速开发基本应用;WPF提供强大的UI设计工具和丰富的视觉体验,支持XAML,易于实现复杂布局;UWP专为Windows 10设计,支持多设备,充分利用现代硬件特性。本文通过示例代码详细介绍这三种框架的特点,帮助读者根据项目需求做出明智选择。以下是各框架的简单示例代码,便于理解其基本用法。
562 0
|
10月前
|
Java Spring 自然语言处理
Spring 框架里竟藏着神秘魔法?国际化与本地化的奇妙之旅等你来揭开谜底!
【8月更文挑战第31天】在软件开发中,国际化(I18N)与本地化(L10N)对于满足不同地区用户需求至关重要。Spring框架提供了强大支持,利用资源文件和`MessageSource`实现多语言文本管理。通过配置日期格式和货币符号,进一步完善本地化功能。合理应用这些特性,可显著提升应用的多地区适应性和用户体验。
91 0
|
10月前
|
微服务 API Java
微服务架构大揭秘!Play Framework如何助力构建松耦合系统?一场技术革命即将上演!
【8月更文挑战第31天】互联网技术飞速发展,微服务架构成为企业级应用主流。微服务将单一应用拆分成多个小服务,通过轻量级通信机制交互。高性能Java Web框架Play Framework具备轻量级、易扩展特性,适合构建微服务。本文探讨使用Play Framework构建松耦合微服务系统的方法。Play采用响应式编程模型,支持模块化开发,提供丰富生态系统,便于快速构建功能完善的微服务。
128 0
|
前端开发 .NET API
ASP.NET Core MVC中构建Web API
在ASP.NET CORE MVC中,Web API是其中一个功能子集,可以直接使用MVC的特性及路由等功能。 在成功构建 ASP.NET CORE MVC项目之后,选中解决方案,先填加一个API的文件夹,填加后,选中API文件夹, 选择新建项,选择填加Web API控制器,要注意控制器在命名时,是以Controller结尾的,这个不能改,前面的随意,比如,此处以NoteController.cs为例 填加后,打开NoteController.cs,系统已经帮我们构建好了一些基础的功能,我们需要在其基础上进行一些个性化修改使其成为我们自己的代码。
1153 0
|
9月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
156 7
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
320 0