.Net+SQL Server企业应用性能优化笔记2——查找瓶颈

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介:

前面一篇文章中我已经对项目的基本情况进行了简单的介绍,今天就开始动手针对系统进行性能调优。在性能调优上面说实话我算是个菜鸟,并没有太多的经验和扎实的基础,所以有错误的地方希望大家指出。

对于一个BS的系统来说,总共涉及到3个角色:Web服务器、数据库服务器和客户端。性能调优的第一步也是最重要的一步就是查找瓶颈。到底是Web服务器中的程序有问题还是数据库服务器上的SQL查询语句有问题,或者是客户端上的HTML、JS、Flash、SilverLight、图片有问题?就算知道了是哪个角色出现了问题,那么到底是CPU上的问题、内存问题、磁盘IO问题还是网络问题?如果没有找到瓶颈就开始调优,那无异于缘木求鱼。举个简单的例子,如果一个页面客户端请求要10秒钟系统才响应,在网络传输和浏览器展现上用了1秒,Web服务器进行逻辑处理和运算用了8秒,SQL服务器进行数据查询用了1秒,如果错误的将瓶颈判断为SQL服务器,对SQL查询进行调优,废了九牛二虎之力将查询效率提高了100倍(只需要0.01秒),单从SQL调优上来说算是比较成功的,但是从整体而已,客户端请求该调优后的页面还是要花9.01秒,用户可能根本感觉不到10秒和9.01秒的差别,所以整个调优是失败的。

前面说到BS系统中的3个角色:Web服务器、数据库服务器和客户端。要查找瓶颈在哪个角色上,最好的情况是这3个角色是3台不同的计算机,而且这3台计算机最好比较单纯,也就是说Web服务器上就只跑了一个IIS,其他什么服务都不跑,SQL服务器上只运行了SQL Server,客户端只运行了个IE,而且IE只打开了我们要调优的这个系统。一般来说,大多数瓶颈都是出现在WEB服务器或SQL服务器上,很少有在客户端出现瓶颈的。(不过我还真遇到过客户端出现性能瓶颈的情况,由于使用了一个不正确的GIF图片,该图片导致客户端CPU占用100%,使得用户感觉系统响应很慢。)

首先确认瓶颈是否在客户端。调查用户在使用该BS系统时的硬件和软件环境,是不是只有配置低的电脑才感觉系统缓慢?是不是只有使用了FireFox的用户才感觉系统缓慢?用户在使用该系统时是不是CPU占用过高?通过对客户端的一些调查就可以确定瓶颈是否在客户端了。真是在客户端的话那就要优化JS、优化HTML等。

确认了瓶颈没有在客户端,那么剩下的就是2台服务器。要确定到底是哪台服务器的问题,用到的主要工具就是Windows计数器。在使用Windows计数器之前还可以使用Windows的任务管理器来大概的查看一下CPU、内存、进程的使用情况。但是切不可看到数据库服务器的CPU高就说是数据库服务器的问题,也可能是WEB服务器上运行的程序有问题。我以前就遇到过这样的情况,即使是在业务低谷期(下班后,晚上时间)数据库的CPU占用率一直居高不下,经过好长时间的分析,终于找到原因,原来是程序里面写了死循环,在不断的执行数据库操作。另外,就算能够确定是数据库的问题,也不能因为CPU占用高就认为是执行的运算太复杂,其实更大的可能是因为对数据的IO太多。大量的IO操作可能造成CPU负担加重。

在Windows计数器中可以监视系统的内存、CPU、磁盘还有各应用程序自身提供的计数器(SQL Server、Asp.Net等都有自身的计数器)。要监视系统的内存情况可以添加Memory下的Pages/sec ,这个计数器表示物理内存和硬盘上的虚拟内存的分页交互情况,数值越大,表示系统读写虚拟内存频繁,主机繁忙,平均值一般在20以下最好。另外还有大量的ASP.NET和SQL Server的计数器,我就不一一介绍了。

如果环境允许,我们将业务系统转移到测试环境中,而且是将Web服务器和SQL服务器分开,同时如果能够让测试环境和生产环境的硬件配置和网络配置这些都差不多那就更好了。使用LoadRunner或者是VS或者其他压力测试工具模拟多个用户对性能有问题的页面进行压力测试,同时开启服务器上的相关计数器。通过对两个服务器的监控,基本上就可以判断出到底哪个服务器存在性能瓶颈。

如果要获得更详细的性能瓶颈信息,那么需要获得程序的源代码,然后修改源代码在其中加入记录时间的代码,在页面初始化的时候、调用数据库之前、调用数据库之后、页面Render完成之后分别加入记录时间的代码,将这些时间记录下来,然后可以得到页面载入的时间,调用数据库花费的时间。比如页面载入花了10秒钟,从时间记录上看,调用数据库花了9秒钟,那么说明性能的瓶颈是在数据库上,而不是在Web服务器上。

另外还有一种办法可以获得函数调用的时间,那就是使用.net性能跟踪的工具ANTS Profiler,这个工具是Red Gate公司出品的一款工具,十分好用,在我以前的博客中也进行了介绍。使用这个工具Host到Web服务器的IIS上,然后打开IE浏览器我们就做业务操作,该工具就可以跟踪出打开某个页面,做某些页面操作的时候调用每个函数的时间,同时也列出了哪些函数调用比较费时。在打开ANTS Profiler进行.net性能跟踪的同时,SQL Server上也应该打开SQL Server Profiler对数据库进行跟踪。比如在页面上我们执行的一个查询,系统返回了查询的表格,通过ANTS Profiler跟踪得到查询操作耗时9.2秒,而我们在SQL Server Profiler中看到查询数据库耗时(Duration字段)8921ms,整个操作是9.2秒,数据库操作就花了8.9秒,显然瓶颈是在数据库上。

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
2月前
|
SQL 开发框架 .NET
ASP.NET连接SQL数据库:详细步骤与最佳实践指南ali01n.xinmi1009fan.com
随着Web开发技术的不断进步,ASP.NET已成为一种非常流行的Web应用程序开发框架。在ASP.NET项目中,我们经常需要与数据库进行交互,特别是SQL数据库。本文将详细介绍如何在ASP.NET项目中连接SQL数据库,并提供最佳实践指南以确保开发过程的稳定性和效率。一、准备工作在开始之前,请确保您
199 3
|
2月前
|
SQL 开发框架 .NET
ASP.NET连接SQL数据库:实现过程与关键细节解析an3.021-6232.com
随着互联网技术的快速发展,ASP.NET作为一种广泛使用的服务器端开发技术,其与数据库的交互操作成为了应用开发中的重要环节。本文将详细介绍在ASP.NET中如何连接SQL数据库,包括连接的基本概念、实现步骤、关键代码示例以及常见问题的解决方案。由于篇幅限制,本文不能保证达到完整的2000字,但会确保
|
3月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
4月前
|
JSON 开发框架 JavaScript
【Azure Developer】使用.Net Core解析JSON的笔记
【Azure Developer】使用.Net Core解析JSON的笔记
|
5月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
117 13
|
5月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
|
5月前
|
SQL 存储 网络安全
关系数据库SQLserver 安装 SQL Server
【7月更文挑战第26天】
63 6
|
5月前
|
存储 SQL C++
对比 SQL Server中的VARCHAR(max) 与VARCHAR(n) 数据类型
【7月更文挑战7天】SQL Server 中的 VARCHAR(max) vs VARCHAR(n): - VARCHAR(n) 存储最多 n 个字符(1-8000),适合短文本。 - VARCHAR(max) 可存储约 21 亿个字符,适合大量文本。 - VARCHAR(n) 在处理小数据时性能更好,空间固定。 - VARCHAR(max) 对于大文本更合适,但可能影响性能。 - 选择取决于数据长度预期和业务需求。
406 1
|
4月前
|
SQL 程序员 数据库
总结查看 .NET EF 生成的 SQL 的 3 种方式,亲测可用
总结查看 .NET EF 生成的 SQL 的 3 种方式,亲测可用
118 0
|
4月前
|
Oracle 关系型数据库
Navicat 连接Oracle ORA-28547: connection to server failed, probable Oracle Net admin error
Navicat 连接Oracle ORA-28547: connection to server failed, probable Oracle Net admin error
117 0