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  ,如需转载请自行联系原作者

相关文章
|
3月前
|
缓存 并行计算 PyTorch
PyTorch CUDA内存管理优化:深度理解GPU资源分配与缓存机制
本文深入探讨了PyTorch中GPU内存管理的核心机制,特别是CUDA缓存分配器的作用与优化策略。文章分析了常见的“CUDA out of memory”问题及其成因,并通过实际案例(如Llama 1B模型训练)展示了内存分配模式。PyTorch的缓存分配器通过内存池化、延迟释放和碎片化优化等技术,显著提升了内存使用效率,减少了系统调用开销。此外,文章还介绍了高级优化方法,包括混合精度训练、梯度检查点技术及自定义内存分配器配置。这些策略有助于开发者在有限硬件资源下实现更高性能的深度学习模型训练与推理。
672 0
|
1月前
|
存储 自然语言处理 算法
基于内存高效算法的 LLM Token 优化:一个有效降低 API 成本的技术方案
本文探讨了在构建对话系统时如何通过一种内存高效算法降低大语言模型(LLM)的Token消耗和运营成本。传统方法中,随着对话深度增加,Token消耗呈指数级增长,导致成本上升。
126 7
基于内存高效算法的 LLM Token 优化:一个有效降低 API 成本的技术方案
|
2月前
|
缓存 编解码 Android开发
Android内存优化之图片优化
本文主要探讨Android开发中的图片优化问题,包括图片优化的重要性、OOM错误的成因及解决方法、Android支持的图片格式及其特点。同时介绍了图片储存优化的三种方式:尺寸优化、质量压缩和内存重用,并详细讲解了相关的实现方法与属性。此外,还分析了图片加载优化策略,如异步加载、缓存机制、懒加载等,并结合多级缓存流程提升性能。最后对比了几大主流图片加载框架(Universal ImageLoader、Picasso、Glide、Fresco)的特点与适用场景,重点推荐Fresco在处理大图、动图时的优异表现。这些内容为开发者提供了全面的图片优化解决方案。
|
6月前
|
存储 设计模式 监控
快速定位并优化CPU 与 JVM 内存性能瓶颈
本文介绍了 Java 应用常见的 CPU & JVM 内存热点原因及优化思路。
816 166
|
4月前
|
存储 编解码 安全
阿里云高性能企业级甄选Intel第八代计算型c8i、通用型g8i和内存型r8i实例简介
计算型c8i、通用型g8i和内存型r8i实例是阿里云推出的高性能企业级甄选Intel第八代云服务器实例,采用CIPU+飞天技术架构,搭载最新的Intel 第五代至强可扩展处理器(代号EMR),性能进一步大幅提升,同时拥有AMX加持的AI能力增强,并在全球范围率先支持TDX机密虚拟机能力,实现了AI增强和全面安全防护的两大特色优势。本文将为您介绍这三个实例规格的性能、适用场景及最新活动价格以及选择指南,以供选择参考。
209 18
|
4月前
|
数据采集 Web App开发 调度
Headless Chrome 优化:减少内存占用与提速技巧
在数据驱动的时代,爬虫技术至关重要。本文聚焦 Headless Chrome 优化方案,解决传统爬虫内存占用高、效率低等问题。通过无界面模式、代理 IP等配置,显著降低资源消耗并提升速度。实际案例中,该方案用于采集汽车点评数据,性能提升明显:内存占用降低 30%-50%,页面加载提速 40%-60%。结合技术架构图与演化树,全面解析爬虫技术演进,助力高效数据采集。
166 0
Headless Chrome 优化:减少内存占用与提速技巧
|
4月前
|
存储 Java
课时4:对象内存分析
接下来对对象实例化操作展开初步分析。在整个课程学习中,对象使用环节往往是最棘手的问题所在。
|
4月前
|
Java 编译器 Go
go的内存逃逸分析
内存逃逸分析是Go编译器在编译期间根据变量的类型和作用域,确定变量分配在堆上还是栈上的过程。如果变量需要分配在堆上,则称作内存逃逸。Go语言有自动内存管理(GC),开发者无需手动释放内存,但编译器需准确分配内存以优化性能。常见的内存逃逸场景包括返回局部变量的指针、使用`interface{}`动态类型、栈空间不足和闭包等。内存逃逸会影响性能,因为操作堆比栈慢,且增加GC压力。合理使用内存逃逸分析工具(如`-gcflags=-m`)有助于编写高效代码。
101 2
|
4月前
|
存储 设计模式 监控
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
108 0
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
|
5月前
|
缓存 NoSQL Linux
Linux系统内存使用优化技巧
交换空间(Swap)的优化 禁用 Swap sudo swapoff -a 作用:这个命令会禁用系统中所有的 Swap 空间。swapoff 命令用于关闭 Swap 空间,-a 参数表示关闭 /etc/fstab 文件中配置的所有 Swap 空间。 使用场景:在高性能应用场景下,比如数据库服务器或高性能计算服务器,禁用 Swap 可以减少磁盘 I/O,提高系统性能。
191 3