返回顶部
首页 > 资讯 > 精选 >ASP.Net服务性能优化原则
  • 678
分享到

ASP.Net服务性能优化原则

2023-06-15 12:06:23 678人浏览 安东尼
摘要

这篇文章主要讲解了“asp.net服务性能优化原则”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ASP.net服务性能优化原则”吧!服务器性能问题,通常在数据少的时候不会显现,也无需太多关注

这篇文章主要讲解了“asp.net服务性能优化原则”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ASP.net服务性能优化原则”吧!

服务器性能问题,通常在数据少的时候不会显现,也无需太多关注。但一旦数据量大了,就会变成一个麻烦且必须处理的事。

通常,性能问题可能有许多不同的原因。内存问题、缓慢的数据库请求和太少的机器只是其中的一部分。手上的项目,每天10亿级的数量量,在最近一个时间段,填了很多坑,也学到了不少东西。

今天这个文章,我会把这一段的体会,总结成几大类问题。当然,分类不一定很严谨,重要的是能给到大家一些建议,真到用时,能少刨一些坑,就够了。另外,次序也不重要,我是想到哪些到哪的,并不是说前边的内容就比后面的内容更需要注意。

1. 数据库调用

数据库调用的性能,会严重影响系统整体的性能。大多数情况下,与数据库快速交互是获得良好性能的最重要的因素。

以下几个点需要重点关注:

索引对数据库交互的影响不需要解释。重要的是检查,检查每一个索引,和每一个查询语句。很多时候,你以为的未必是你以为的。检查查询语句和条件对索引的使用,检查索引的结构。要确保每个查询语句,能正确使用你所希望使用的索引。

  • 表结构设计

表结构设计最重要的,是对业务的理解。对数据之间的关系理解越深,表结构越趋于合理。

  • 同样的工作,尽可能在数据库上完成,避免在服务器中完成

这个话不太好理解,用代码举个例子:

// 好的方式 var girls = dbContext.Users.Where(user => user.gender == female); var count = girls.Count();  // 不好的方式 var girls = dbContext.Users.Where(user => user.gender == female).ToList(); var count = girls.Count;

下边这种方式,第一行以ToList()结束。当实体执行查询时,会从数据库中检索并获取全部数据,然后在服务器中进行计数。而上面的方式,会在数据库中直接计数。很显而易见的,数据库中执行计数,网络传输的代价会更少。

  • 尽可能让数据库离应用服务器"近"点

数据库到应用服务器之间,无非是网络。更"近"的网络,会带来更少的延时。这个"近"说的是网络拓扑上的近,不是位置和距离。对于多机房分布式的应用,起码的要求是让一个或几个完整的副本集与应用服务处于同一个数据中心。

  • 用数据库希望的方式使用数据库

数据库有很多种,关系型、NoSQL、内存数据库,等等。并不是所有的数据库都一样。有些适合Key-Value键值对,有些适合事务处理,有些适合存储日志

开发中,不要拘泥于数据库类型,而应该根据业务类型和数据库特性进行使用。比方说,MongoDB,本身是基于文档的数据库,结构上很不适合JOIN操作。但它非常适合存储包含大量业务数据的文档。所以,使用时要避免使用JOIN操作的业务。当然,这只是个例子。事实上mongoDB对于类似JOIN的内容,有更好的处理模式,这个大家可以自行了解。

  • 保证数据库有足够的硬件资源

服务器的伸缩一般提的比较高,但其实数据库的伸缩性也需要非常重视。数据库服务器,要关注到存储空间、内存、网络和CPU。经验中,接近极限时,服务器未必会有明确的警报给你;而等到有警报出现时,恐怕已经到达极限并发生了故障,就非常难于处理了。

所以,当发现某些任务开始变慢,就意味着需要全面检查了。

  • 承认某些低效查询的存在

不是所有的查询都可以做到高效。尤其查询是基于某些实体框架,例如EF或Hibernate。在技术和时间可能的情况下,少用数据框架是个好习惯。

  • 使用连接池,而不是单个连接

如果每个查询都需要重新建立连接,那是非常可怕的,从性能到应用的可靠性。使用数据库,第一件事就是学会如何使用连接池。

  • 小心使用存储过程

当有需要花费大量时间的复杂查询需要处理时,存储过程是个解决方案。但一定要小心,一定要小心,一定要小心,重要的事情说三遍。

在我的团队中,存储过程是被禁止使用的。相对来说,这儿安全的要求超过性能。

不过,在这个文章中,尤其在讨论数据库操作的性能时,咱还是不能忘了存储过程。

  • 数据库分片策略

分布式数据库性能的核心在于分片。分片就一个原则:让业务的每一个查询操作,对应尽可能少的分片。

上面写的,其实是一些原则。实际上,最难的部分是确定这些问题。所以,需要对各种工具都熟悉。通常,数据库本身也能提供相关内容,例如慢查询、扩展问题、网络瓶颈等。对于数据库,不要仅限于使用,一定深度的了解会对成长有相当的帮助。

2. 内存压力

对于某些高吞吐量的应用,服务器的内存压力是最常见的问题。

当吞吐量非常大的时候,垃圾回收(GC)会跟不上内存的分配和释放。而且这种压力的体现,是服务器在垃圾回收上花费的时间更多,而执行代码的时间更少。

这种状态在多种情况下都可能发生。最常见的情况是内存容量耗尽。当您达到内存极限时,垃圾回收器将出现恐慌,并启动更频繁的整体垃圾回收,而这种模式的回收代价非常大。但问题是,为什么会发生这种情况?为什么你内存使用接近极限了?原因通常是错误或不太好的缓存管理或内存泄漏。通过捕获内存快照并检查是什么占用了所有字节,可以很容易地用内存分析器发现这一点。

重要的是首先要意识到你有内存问题。最简单的方法是使用性能计数器。

3. 缓存数据

缓存可以是一个非常好、非常有效的优化技术。典型的例子是,当客户端发送请求时,服务器可以将结果保存在缓存中。当客户端再次发送相同的请求(不一定是同一个客户端)时,服务器不需要再次查询数据库或进行任何计算来获得结果,而只是从缓存中获取它。

考虑一下搜索引擎的做法。如果这是一个常见的搜索,它可能会被要求每天多次。如果不做缓存,每次都使用计算力去生成相同的页面,是不是很可怕?

当然,使用缓存,在一定程序上增加了应用的复杂性。首先,每隔一段时间就需要使缓存失效并刷新,对吧?我们总不可能永远返回相同的结果。另一个问题是,如果使用不合理,缓存容易膨胀,并导致内存问题。

好在,ASP.Net有很多已经实现的优秀的缓存库可以帮助解决大部分的工作。

4. 垃圾回收优化

应用服务器性能优化中,垃圾回收是一个必须考虑的问题。

我们知道,dotnet垃圾回收有两种不同的模式:工作站模式和服务器模式。前者被优化为以最小的资源使用快速响应,而后者用于高吞吐量。

Dotnet运行时默认将桌面应用程序中的GC模式设置为工作站模式,而服务器中的GC模式设置为服务器模式。这个默认值几乎总是最好的。在服务器中,GC将使用更多的机器资源,但是能够处理更大的吞吐量。换句话说,该进程将有更多的线程专门用于垃圾回收,它将能够每秒释放更多字节。

相比由系统自动默认GC模式而言,手动设置应用的垃圾回收模式会是一个安全的做法。服务器并不是总能正确地意识到需要什么样的回收模式。

5. 减少不必要的客户端请求

客户端请求的数量,很大程度上可以决定服务器的数量或服务器的负载。所以,通过一些技巧来减少服务器请求,也是优化的一部分内容。

这个内容需要在应用中具体探讨或体会。我只举几个实用的例子:

  • 自动完成机制

通常这种应用,就是我们在前端输入时,客户端从第一个输入字符开始做api调用。比方我们输入"Dotnet",那我们会向服务器发送6个请求 ---  "D"、"Do"、"Dot"、"Dotn"等等。但实际上,考虑到输入的连续性,我们可以在调用前,做个短时的延时,比方停止输入500ms后才向服务器发送请求。你可能不会相信,我们实际应用中实测的结果,可以减少93%的调用。

  • 客户端缓存

还是上面的例子。对于同一个应用,很多位置的输入都是相同或类似的。如果我们将自动完成的结果缓存在客户端,而不是每次都发送这些请求,同样可以减少很多不必要的请求。

  • 批处理

应用中,一个页面跟服务器的交互通常会有很多。通常最无脑的做法,就是一个事件发送一个请求。这样的方式无形中会对服务器产生相当的压力。如果可能,把这样的事件合并成一个请求,会更有效率,对服务器更友好。

6. 正确处理挂起的请求

客户端对服务器的请求,可能会被挂起。也就是说,客户端发送了一个请求,但未收到响应,或者准确地说,是经过一个比较长的时间后,收到一个超时响应。虽然我们不希望发生这样的事,但这种事情总在发生:处理请求时间过长、或代码死、或代码出错并且没有正常捕获错误,当然还包括等待一些本应该出现但实际未出现的东西,例如来自队列的消息、长时间的数据库响应或对另一个服务的调用。

本质上,当一个请求被挂起时,会挂起一个或多个线程。但应用程序并不会停,并继续处理新的请求。如果这个挂起在其它请求上也有重现,那随着时间,挂起的线程将越来越多,并最终影响服务器或系统的响应。

因此,请求挂起对服务器性能的影响非常大。

这个问题的解决,需要针对核心的部分,就是挂起的部分进行调试,以确保程序处理了各种可能性,并不会产生任何意外的挂起。

7. 服务器崩溃

服务器崩溃也是一个可能的性能问题。

通常来说,客户端请求期间发生一般的异常时,应用程序不会崩溃。但总有一些问题,比方上下文之外的异常,或者一些灾难性的异常,比方OutOfMemoryException、ExecutionEngineException、StackOverflowException,当这些发生时,不管加多少catch,也挡不住崩溃的发生。

通常如果的托管在WEB Server上,例如:IIS、Nginx、Jexus上的ASP.Net应用,崩溃时Web  Server会自动回收资源,并重启应用。客户端的感觉是临时的慢响应或503错误。

而如果是直接启动的ASP.Net应用,则程序会永久关闭,需要手动重启。这将是一个问题。

所以,一方面,使用Web Server会是一个好习惯。另一方面,还是要检查代码,从根本上解决问题。

8. 永远记着应用规模

这个问题说起来很简单,但实际开发中,其实经常会忘记,或者说忽略应用的规模。

用缓存,会忘了分布式缓存,忘了同步问题,直接使用单机内存缓存;

数据库写入,会忘了并发下的数据一致性问题;

。。。太多了,不一一写了

解决的办法,是从头开始,就把代码规模化 ---  从开发到测试,全部使用双向扩展,即水平扩展(向外扩展)和垂直扩展(向上扩展)。垂直扩展意味着服务机器添加更多的功能,比如更多的CPU和RAM,而水平扩展意味着添加更多的机器。

记着,从开发和测试开始,就要使用与生产环境使用同等规模的环境来做。

9. 同步和异步

应用服务不同于桌面应用或终端应用。当服务在执行过程中需要等待响应时,比方数据库操作、或者调用别的服务时,这个服务本身就开始有了一定的风险。如果数据库或别的服务正忙着处理别的请求、或者存在性能问题时,必然会把性能问题传递到调用方。

怎么办?

解决的基本模式是异步调用。异步调用有两个含义:

  • 代码的异步调用,就是我们常说的async和await。

  • 架构的异步调用。这个通常是通过使用kafkaRabbitMQ这样的队列服务来完成。向队列发送消息,并不等待响应。由另一个服务提取这些消息并处理。这个方式,通常是不需要回复的服务。而如果需要回复,也可以用类似SignalR这样的推送通知。

重要的是,这样的方式下,系统组件不需要主动等待服务。一切都是异步处理的。服务之间的耦合可以松散很多。

当然同样的,这样会让代码变得更复杂。

取舍之间,是对代码的控制力。

10. 一个小总结

出差期间,断断续续写的这个东西,似乎有点乱,但就这样吧,:P

在实际项目中,很多方面稍不注意,就能搞乱服务器的性能,而且有很多地方会出错。而解决呢,又没有捷径和技巧,需要仔细的计划,有经验的工程师,以及大量的缓冲时间来应对可能出现的问题。

后面我写写一些工具的应用吧。很多方面,还是有好的工具可以帮助解决或至少是快速发现问题的。

总之,这是一篇个人的经验之谈,希望能给大家一个抛砖引玉的作用。

感谢各位的阅读,以上就是“ASP.Net服务性能优化原则”的内容了,经过本文的学习后,相信大家对ASP.Net服务性能优化原则这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: ASP.Net服务性能优化原则

本文链接: https://lsjlt.com/news/280140.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • ASP.Net服务性能优化原则
    这篇文章主要讲解了“ASP.Net服务性能优化原则”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ASP.Net服务性能优化原则”吧!服务器性能问题,通常在数据少的时候不会显现,也无需太多关注...
    99+
    2023-06-15
  • 性能优化指南:性能优化的一般性原则与方法
    【本文转自博客园 作者:xybaby 原文链接:https://www.cnblogs.com/xybaby/p/9055734.html】作为一个程序员,性能优化是常有的事情,不管是桌面应用还是web应用,不管是前端还是后端,不管是单点应...
    99+
    2023-06-05
  • 揭秘ASP.NET RESTful 服务的性能优化秘诀
    在构建现代应用程序时,ASP.NET RESTful 服务作为连接前端和后端的重要桥梁,其性能表现直接影响着应用程序的整体体验。为了确保服务能够快速响应请求、稳定可靠地运行,我们需要对服务进行性能优化。本文将从以下几个方面探讨 ASP....
    99+
    2024-02-05
    ASP.NET RESTful 性能优化 缓存 配置 服务器 数据库
  • 深入探讨 ASP.NET SOAP 服务:性能优化秘籍
    ASP.NET SOAP 服务是 .NET 框架中的一种轻量级消息传递协议,用于跨应用程序和系统进行数据交换。虽然 SOAP 服务简单易用,但如果设计不当,可能会导致性能问题。本文将探讨几种优化 ASP.NET SOAP 服务性能的秘籍。...
    99+
    2024-03-09
    简介
  • Golang函数性能优化之函数签名设计原则
    go 函数性能优化原则:优先使用值接收器: 避免指针接收器,提升并发性能。避免命名返回值: 尽量使用返回元组或 errors 处理错误和多个返回值。优化切片和映射传递: 使用指针引用避免...
    99+
    2024-04-17
    性能优化 函数设计 golang
  • 服务器节能的黄金法则:优化性能,节省开支
    了解服务器功耗 第一步是了解服务器的功耗。可以使用功率计测量服务器的功耗,或者参考制造商提供的规格信息。了解功耗基准后,可以识别和解决导致功耗过高的因素。 优化硬件 - 选择节能组件:选择具有能源之星认证的服务器、处理器和电源供应器等组...
    99+
    2024-02-19
    服务器节能 性能优化 成本节约 可持续性
  • ASP.NET网站性能优化的方法是什么
    本篇内容主要讲解“ASP.NET网站性能优化的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ASP.NET网站性能优化的方法是什么”吧!在用ASP.NET开发网站的时候,性能是永远需要...
    99+
    2023-06-17
  • Asp.net网站的性能优化方法是什么
    这篇文章主要介绍“Asp.net网站的性能优化方法是什么”,在日常操作中,相信很多人在Asp.net网站的性能优化方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Asp.net网站的性能优化方法是什么...
    99+
    2023-06-17
  • MySQL--索引优化原则
    索引优化原则 1、最左前缀匹配原则,联合索引,mysql会从做向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3...
    99+
    2024-04-02
  • 优化迷宫:服务器性能优化揭秘
    揭示服务器性能优化之道 在当今快速发展的数字世界中,服务器性能已成为不可或缺的关键因素。一个响应迅速、稳定可靠的服务器是确保无缝用户体验和业务成功的基石。优化服务器性能是一个多方面的过程,需要对系统进行深入了解和实施经过验证的最佳实践。...
    99+
    2024-03-01
    服务器性能优化、服务器调优、性能优化、系统优化、服务器管理
  • MySQL语句的优化原则
    这篇文章主要讲解了“MySQL语句的优化原则”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL语句的优化原则”吧!1、使用索引来更快地遍历表。  缺省...
    99+
    2024-04-02
  • SQL优化原则有哪些
    这篇文章将为大家详细讲解有关SQL优化原则有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL...
    99+
    2024-04-02
  • SEO优化原则有哪些
    这篇文章给大家分享的是有关SEO优化原则有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。  1. 关键词优化  1)关键词选择策略:两高一低: 高搜索量, 与页面内容高相关, SEO竞争低。选择搜索量高的词也...
    99+
    2023-06-09
  • Android性能优化及性能优化工具
    目录1.Allaction Tracking(1)追踪(2)分类我们的内存分配(3)查看统计图2.LeakCanary(1)配置(2)制造一个单例内存泄漏的点(3)LeakCanar...
    99+
    2024-04-02
  • 网页基本性能优化规则有哪些
    小编给大家分享一下网页基本性能优化规则有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!针对浏览器网页的一些优化规则页面优化静态资源压缩借助构建工具(webpa...
    99+
    2023-06-08
  • 高性能网站优化的规则有哪些
    这篇文章主要讲解了“高性能网站优化的规则有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“高性能网站优化的规则有哪些”吧!性能黄金法则:只有10%~20%的最终用户响应时间花在了下载HTM...
    99+
    2023-06-08
  • Mysql慢查询优化方法及优化原则
    1、日期大小的比较,传到xml中的日期格式要符合'yyyy-MM-dd',这样才能走索引,如:'yyyy'改为'yyyy-MM-dd','yyyy-MM'改为'yyyy-MM-dd'【这样MYSQL会转换为...
    99+
    2024-04-02
  • Apache服务器如何优化性能
    使用最新版本的Apache服务器:确保使用最新版本的Apache服务器,以获得最新的性能优化和安全功能。 启用缓存:使用缓存技术,如HTTP缓存、页面缓存和对象缓存,可以减少服务器负载并提高性能。 配置KeepAlive:启用Kee...
    99+
    2024-07-05
    apache
  • MySQL数据类型优化原则
    MySQL支持的数据类型很多,选择正确的数据类型对于高性能至关重要。下面几个简单的原则都有助于做出更好的选择。 更小的通常更好 应该尽量使用可以正确储存数据的最小数据类型。更小的数据类型通常更快,因为它...
    99+
    2022-05-31
    MySQL 数据类型 MySQL 数据类型优化
  • 如何优化 PHP 微服务容器化性能
    为了优化 php 微服务容器化性能,可以采用以下技巧:选择轻量级 php 镜像优化 php 配置设置(例如,启用 opcache)使用容器缓存(例如,redis)执行代码优化和管理依赖项...
    99+
    2024-05-08
    php 微服务容器化 laravel redis docker composer apache 优化配置
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作