ASP.NET企业级应用性能优化-内存分析

简介:





为什么要写篇文章

 
谈到 ASP.NET 应用的开发,使我不禁想起之前有朋友对我说过的一句话:做网站没有任何的技术含量。后来他告诉我,做网站,在 .NET 平台上面很简单,不就是拖几个控件,搞点布局,写点 js ,然后敲上几个数据的增删查改就完了,系统大了,就多敲几个。当时,朋友之所以说这样的话,是与他的公司与项目背景相关的。
 
在很多的外包公司里面,常常用 ASP.NET 来快速的搭建一个 Web 应用,例如 OA 系统,企业门户,管理系统,而这些系统往往都注重在业务流程上面,不会在其他方面关注过多,例如,性能,使用这些系统的用户也不多,顶多几千个,所以对于很多真正触及到 Web 应用的要考虑的问题,例如,高并发,高性能,稳定,安全等,没有接触到。后来,我去了其他的公司,接触到那种承受百万,千万级访问量的应用的时候,越发觉得自己有很多的知识需要学习。
 
在与朋友共事的一些项目中,很多项目的性能都很差,我们大家都想解决这个问题,但是都没有办法,仅仅只是知道一些基本的措施,很多都是从网络上面“道听途说”,例如用 stringbuilder 来拼接字符串,尽量用 for 而不是 foreach 。其实说到底,还是我们对 .NET 不够深入,虽然说,我们在 .NET 平台上面做了很多的项目,其实很多的应用只是在 .NET 平台的表层开发。(由此可见,“题海战术”不一定能够练就解题高手,也不一定能够练就解决问题的思维。)
 
其实性能优化问题,不仅仅只是 Web 应用独有的,而是说,在 Web 应用中,可能关注的多一点。本篇文章谈的是 ASP.NET 应用的性能优化,其实,从本质上面,还是谈的 .NET 应用的优化。对于其他平台的朋友,也是非常有参考价值的。
 
          在本篇文章中,不会谈及很多的调优的方法理论(其实这些方法论是很有作用的),我会从谈及一些实际,可操作性的知识,让朋友们学而即用,同时也让朋友对开始对 .NET 加深认识。
 
          本篇的内容从以下几个方面进行展开: 内存瓶颈分析, CPU 瓶颈分析,缓存分析,资源等待分析,数据库瓶颈分析, HTTP 优化
 
首先来看看内存瓶颈分析。虽然,我在之前的一篇稿子《 .NET 企业级开发》中谈   这个问题,但是,为了本篇文章的完整性,我还是提一下,同时也将这个问题讲更全面一些。
 
 
内存瓶颈分析
 
内存性能问题可以分为两个部分:内部内存压力,外部内存压力。其中内部内存压力主要是站点本身在运行的过程中消耗过多的内存,基本是可以从托管资源,非托管资源两方面分析;而外部内存压力指代站点所在的服务器上面的其他应用于站点本身之间进行资源的争夺,从而使得站点可以使用的内存太少。那么在 ASP.NET 企业级应用中,我们技术人员关注点可以放在内部内存压力。
 
首先看看托管资源的问题。
 
为什么要讨论托管资源?因为托管资源(就是分配中在托管堆上面的对象),分配在托管堆上,而托管堆在内存中,所有托管资源的合理的分配和回收,会对内存产生影响。
 
       ASP.NET 应用的功能就是由很多的对象组合完成的,所以讨论托管资源很有必要。
        .NET 中,托管堆分为两类:大对象托管堆,小对象托管堆。一般而言,如果对象所占的空间小于 85K ,就分配在小堆上面,反之,分配在大堆上面。如图的小堆图:
 
 
    在对上面,对象被划分为三代: 0,1,2 代。“代”数越大,被回收的可能性就越小。基于这个理论,就要避免原本只要是低代的对象变为高代的对象,例如某个对象用完之后就销毁的,原本是 0 代的,现在存活到了 2 代,那么它所占的内存就浪费了。虽然,垃圾回收机制没有在一定程度上回收,但是如果我们总是“霸占”着对象,垃圾回收也没有办法。
 
        下面,举个例子,形象的说明一下。对于一个大型的 ASP.NET 应用而言,里面会包含很多的对象,假设 10000 个,其中每次请求都要产生的 100 个临时对象。如果这些临时对象,被不合理的分配,成为了大代的对象,我们来算一算。
 
如果这个 100 个对象每个占 1k 的空间,那么 100 个,我们约等于 0.1M ,如果站点访问量是 10w ,那么如果这些 0.1 乘以 10w ,如果访问量是 100w 1000w ,结果如何?大家已经清楚了。很多,需要将问题放大来看,结果就很清晰了。
 
        对于对象的使用,有一点要记住:尽可能迟的分配,尽可能早的释放。
        下面,我们可以谈谈,如何找出内存问题。
 
        可以采用工具加分析的方式。可以采用 System Counter CLR Profiler ANTS Memory Profiler(Red Gate) 等。其中 System Counter CLR Profiler 分析的比较的粗糙, ANTS Memory Profiler(Red Gate) 可以指出是哪段代码有问题,方便解决问题。如图
 
 
   本篇由于篇幅的限制,先到这里,下一篇,我们可以看看一些常见的性能问题,例如字符串相关问题,Session,缓存,对象池。
 




















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

相关文章
|
8月前
|
前端开发 JavaScript 关系型数据库
使用 OpenAuth.Net 快速搭建 .NET 企业级权限工作流系统
使用 OpenAuth.Net 快速搭建 .NET 企业级权限工作流系统
243 0
|
5月前
|
监控 Cloud Native 测试技术
.NET技术深度解析:现代企业级开发指南
每日激励:“不要一直责怪过去的自己,他曾经站在雾里也很迷茫”。我是蒋星熠Jaxonic,一名在代码宇宙中探索的极客旅人。从.NET Framework到.NET 8,我深耕跨平台、高性能、云原生开发,践行领域驱动设计与微服务架构,用代码书写技术诗篇。分享架构演进、性能优化与AI融合前沿,助力开发者在二进制星河中逐光前行。关注我,共探技术无限可能!
.NET技术深度解析:现代企业级开发指南
|
存储 编解码 安全
阿里云高性能企业级甄选Intel第八代计算型c8i、通用型g8i和内存型r8i实例简介
计算型c8i、通用型g8i和内存型r8i实例是阿里云推出的高性能企业级甄选Intel第八代云服务器实例,采用CIPU+飞天技术架构,搭载最新的Intel 第五代至强可扩展处理器(代号EMR),性能进一步大幅提升,同时拥有AMX加持的AI能力增强,并在全球范围率先支持TDX机密虚拟机能力,实现了AI增强和全面安全防护的两大特色优势。本文将为您介绍这三个实例规格的性能、适用场景及最新活动价格以及选择指南,以供选择参考。
469 18
|
存储 运维
使用Visual Studio分析.NET Dump
使用Visual Studio分析.NET Dump
287 0
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
346 5
Visual Studio 快速分析 .NET Dump 文件
【11月更文挑战第10天】.NET Dump 文件是在 .NET 应用程序崩溃或出现问题时生成的,记录了应用程序的状态,包括内存对象、线程栈和模块信息。通过分析这些文件,开发人员可以定位和解决内存泄漏、死锁等问题。在 Visual Studio 中,可以通过调试工具、内存分析工具和符号加载等功能来详细分析 Dump 文件。此外,还可以使用第三方工具如 WinDbg 进行更深入的分析。
930 1
|
存储 运维
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
421 2
|
敏捷开发 设计模式 开发者
【揭秘终极利器】AgileEAS.NET:服务定位器模式的魔法,如何让企业级软件开发瞬间提速?揭秘背后的技术奥秘与实战指南!
【8月更文挑战第16天】AgileEAS.NET是基于DotNet的企业级敏捷开发平台,其服务定位器模式助力构建高度解耦系统。通过全局服务目录动态查找服务,避免硬编码依赖。在AgileEAS.NET中,服务定位器以静态类形式封装服务注册与检索功能。示例展示了如何注册与获取服务实例,如在`UserController`中通过服务定位器使用`IUserService`。此模式整合到框架生命周期管理,便于各处获取服务实例,提升开发效率。然而,应适度使用并考虑依赖注入容器以增强代码可维护性和可测试性。
284 4
|
人工智能 前端开发 开发工具
NET在企业级应用、Web开发、移动应用、云服务及游戏领域的创新实践
.NET技术自2000年推出以来,在软件开发领域扮演着关键角色。本文从核心优势出发,探讨其统一多语言平台、强大工具集、跨平台能力及丰富生态系统的价值;随后介绍.NET在企业级应用、Web开发、移动应用、云服务及游戏领域的创新实践;最后分析性能优化、容器化、AI集成等方面的挑战与机遇,展望.NET技术的未来发展与潜力。
271 2
|
人工智能 开发框架 Devops
.NET技术概览:** 本文探讨了.NET的核心特性,包括多语言支持、Common Language Runtime、丰富的类库和跨平台能力,强调其在企业级、Web、移动及游戏开发中的应用。
【7月更文挑战第4天】.NET技术概览:** 本文探讨了.NET的核心特性,包括多语言支持、Common Language Runtime、丰富的类库和跨平台能力,强调其在企业级、Web、移动及游戏开发中的应用。此外,讨论了.NET如何通过性能优化、DevOps集成、AI与ML支持以及开源策略应对未来挑战,为开发者提供强大工具,共创软件开发新篇章。
534 3