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

相关文章
|
7月前
|
机器学习/深度学习 算法 PyTorch
125_训练加速:FlashAttention集成 - 推导注意力优化的独特内存节省
2025年,大型语言模型的训练面临着前所未有的挑战。随着模型参数量和序列长度的不断增加,传统注意力机制的内存瓶颈问题日益突出。FlashAttention作为一种突破性的注意力算法,通过创新的内存访问模式和计算优化,显著提升了训练效率和内存利用。
768 3
|
7月前
|
存储 机器学习/深度学习 PyTorch
119_LLM训练的高效内存管理与优化技术:从ZeRO到Flash Attention
大型语言模型(LLM)的训练面临着前所未有的计算和内存挑战。随着模型规模达到数百亿甚至数千亿参数,高效的内存管理成为训练成功的关键因素之一。2025年,LLM训练的内存优化技术已经取得了显著进展,从ZeRO优化器到Flash Attention等创新技术,为训练超大规模模型提供了可能。
763 159
|
11月前
|
存储 弹性计算 缓存
阿里云服务器ECS经济型、通用算力、计算型、通用和内存型选购指南及使用场景分析
本文详细解析阿里云ECS服务器的经济型、通用算力型、计算型、通用型和内存型实例的区别及适用场景,涵盖性能特点、配置比例与实际应用,助你根据业务需求精准选型,提升资源利用率并降低成本。
652 3
|
10月前
|
缓存 固态存储 Windows
如何让内存发挥到最大效能?全面优化指南,提升电脑运行体验
电脑内存使用不合理会导致卡顿,本文教你如何优化内存性能。检查内存容量与主板支持上限,考虑升级或调整配置;关闭后台程序、管理浏览器标签、结束异常进程以释放内存;设置虚拟内存、调整视觉效果、定期重启提升效率;必要时增加内存条、选择高频内存、更换固态硬盘。避免盲目清理内存和依赖大内存忽视其他硬件瓶颈。只需合理设置,无需额外花钱,就能显著提升电脑速度。
|
10月前
|
前端开发 JavaScript 关系型数据库
使用 OpenAuth.Net 快速搭建 .NET 企业级权限工作流系统
使用 OpenAuth.Net 快速搭建 .NET 企业级权限工作流系统
292 0
|
7月前
|
监控 Cloud Native 测试技术
.NET技术深度解析:现代企业级开发指南
每日激励:“不要一直责怪过去的自己,他曾经站在雾里也很迷茫”。我是蒋星熠Jaxonic,一名在代码宇宙中探索的极客旅人。从.NET Framework到.NET 8,我深耕跨平台、高性能、云原生开发,践行领域驱动设计与微服务架构,用代码书写技术诗篇。分享架构演进、性能优化与AI融合前沿,助力开发者在二进制星河中逐光前行。关注我,共探技术无限可能!
.NET技术深度解析:现代企业级开发指南
|
7月前
|
设计模式 缓存 Java
【JUC】(4)从JMM内存模型的角度来分析CAS并发性问题
本篇文章将从JMM内存模型的角度来分析CAS并发性问题; 内容包含:介绍JMM、CAS、balking犹豫模式、二次检查锁、指令重排问题
193 1
|
缓存 并行计算 PyTorch
PyTorch CUDA内存管理优化:深度理解GPU资源分配与缓存机制
本文深入探讨了PyTorch中GPU内存管理的核心机制,特别是CUDA缓存分配器的作用与优化策略。文章分析了常见的“CUDA out of memory”问题及其成因,并通过实际案例(如Llama 1B模型训练)展示了内存分配模式。PyTorch的缓存分配器通过内存池化、延迟释放和碎片化优化等技术,显著提升了内存使用效率,减少了系统调用开销。此外,文章还介绍了高级优化方法,包括混合精度训练、梯度检查点技术及自定义内存分配器配置。这些策略有助于开发者在有限硬件资源下实现更高性能的深度学习模型训练与推理。
2280 0
|
10月前
|
存储 人工智能 自然语言处理
AI代理内存消耗过大?9种优化策略对比分析
在AI代理系统中,多代理协作虽能提升整体准确性,但真正决定性能的关键因素之一是**内存管理**。随着对话深度和长度的增加,内存消耗呈指数级增长,主要源于历史上下文、工具调用记录、数据库查询结果等组件的持续积累。本文深入探讨了从基础到高级的九种内存优化技术,涵盖顺序存储、滑动窗口、摘要型内存、基于检索的系统、内存增强变换器、分层优化、图形化记忆网络、压缩整合策略以及类操作系统内存管理。通过统一框架下的代码实现与性能评估,分析了每种技术的适用场景与局限性,为构建高效、可扩展的AI代理系统提供了系统性的优化路径和技术参考。
676 4
AI代理内存消耗过大?9种优化策略对比分析
|
11月前
|
缓存 监控 Cloud Native
Java Solon v3.2.0 高并发与低内存实战指南之解决方案优化
本文深入解析了Java Solon v3.2.0框架的实战应用,聚焦高并发与低内存消耗场景。通过响应式编程、云原生支持、内存优化等特性,结合API网关、数据库操作及分布式缓存实例,展示其在秒杀系统中的性能优势。文章还提供了Docker部署、监控方案及实际效果数据,助力开发者构建高效稳定的应用系统。代码示例详尽,适合希望提升系统性能的Java开发者参考。
569 4
Java Solon v3.2.0 高并发与低内存实战指南之解决方案优化