Asp.net平台下网站性能调优的实战方案.

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

前言
最近帮朋友运营的平台进行了性能调优,效果还不错,所以写出来一起交流一下。如果本文中有您觉的错误的,或者不明白的,请加QQ群:4656272,欢迎指正和一起探讨。(ps:鄙人文笔很差,看官请多担待)

背景
朋友的平台网站属于垂直型的资讯社区网站,原先是用ASP.NET 1.0开发的,后来升级到ASP.NET 2.0,数据库为SQL SERVER 2000,操作系统为windows 2003 server,两台服务器,一台WEB服务器,一台数据库服务器。目前大概有80几万的用户帐户,有30多万条文章和200多W条帖子。随着数据量的增长,负载也越来越大,经常出现无法访问,访问出错或访问缓慢的情况。

解决
因为已经处于生产环境下,所以进行性能调优的前提是不影响现有的业务运行,可以进行无缝部署,如果出现问题可以迅速回退恢复。所以我准备分几次来做调优,这样比较稳妥的进行性能提升而不影响正常的业务运行。

第一步 运行环境调优
这一步很重要,在一个健康稳定的环境下,才能发挥平台最大性能表现,所以先给平台提供一个健康稳定的环境。
1 ASP.NET 环境调优
按照 《10 ASP.NET Performance and Scalability Secrets》http://www.tech-q.cn/thread-63-1-2.html里面所讲到的调优方法,经过跟开发人员的讨论,减少了一些ASP.NET中不必要的MODULE,优化了一些配置文件。

2 IIS环境调优
减少了IIS中的不必要的ISAPI加载,精简了IIS访问日志的格式,设置了IIS中针对图片文件,JAVASCRIPT,CSS等文件的内容过期,启用了IIS的GZIP压缩功能,按照http://support.microsoft.com/kb/922703/这篇文章,做了ETAG设置,以提高HTTP请求性能,根据实际情况对IIS的应用池进行设置调优。

3 SQL SERVER调优
将 SQL SERVER 2000 升级到 SQL SERVER 2005,按照《优化SQL Server 2000的设置》http://www.tech-q.cn/thread-1412-1-1.html 里面讲到的结合实际情况进行设置,并修改内存占用。我的建议:如果是单独的数据库服务器,那么尽可能的让SQL SERVER占用最多的内存。
经过第一步的调优,性能有所提升,体现在无法访问或者访问出错的情况减少了。所以开始进行第二步。

第二步 收集数据 找到平台性能弱点
根据IIS的访问日志,我做了一个24小时采样。找出了其中10个访问最多的页面和10个响应时间比较长的页面。根据MSDN《应用Profiler优化SQL Server数据库系统》http://www.microsoft.com/china/msdn/library/data/sqlserver/Profiler.mspx?mfr=true所说的方法,找到其中执行次数最多的10条SQL语句和执行时间比较长的SQL语句。提供给开发人员,并给出建议进行优化。
(一) 前端优化
其中访问最多的页面都是文章最终页和帖子最终页,这时我祭起目前已知最好的客户端调试工具FIREBUG,按照《初识Firebug 全文 — firebug的使用》http://www.tech-q.cn/thread-686-1-2.html 和《34条网站加速方法》http://www.tech-q.cn/thread-680-1-2.html所讲的进行优化。其中主要包括:
a) 将最终页用DIV+CSS进行重构,合理的设置有效期,加快客户端下载和浏览器DOM引擎渲染和呈现的速度。
b) 因为平台用了JQUERY库,直接引用GOOGLE上的JS文件,减少传输字节和连接数,提高访问速度。
c) 将JS和CSS进行压缩,和图片动画文件放到单独的域名下,如http://images.xxx.com, 因为老的浏览器针对一个域名限制了2个并发连接,采用这个方法可以解决,注意在这个域名下设置有效期。
d) 关闭不必要的ASP.NET中的VIEWSTATE,减少传输字节。

(二) 平台系统优化
通过最多的10条SQL语句和执行时间比较长的SQL语句中发现,很多都是因为文章页最终页和帖子最终页更新访问次数这种类似的更新引起的,起先是想加一台服务器来做SQL SERVER的镜像分发,插入、更新、删除全在一台上操作,另外一台机器只能做查询操作。

但是这样增加的服务器只能做数据库服务器,并且系统上更改比较大,不是最好的方案。经过考虑,既然是更新的数据操作不需要实时,那么加一台服务器用CENTOS 5.x,装上memcached,做增量更新,而且那台服务器剩下的资源可以做其他事情,实现思路是先更新到memcached中,如果发现更新数达到一个阙值了,一次性更新到数据库。平台的会员在线状态,从数据库也更改到了memcached中。

为了提高DAO层的性能,我建议他们的开发使用NHIBERNATE这个成熟的数据库应用框架,使用了数据库连接池,提高数据库连接的重用性。

其中执行时间比较长的SQL语句是因为模糊查询引起的,这时候增加的服务器就又用到了,在上面装上了 lucene,将数据库的需要查询的资料,提交到lucene中,搜索全部放到lucene中去做,具体的这里就不追溯了,有兴趣的可以在这里http://www.tech-q.cn/forum-19-1.html 找到相关资料。

经过第二步改造,性能提升到一个新的阶段。无法访问,访问出错或访问缓慢的情况已经很少出现了。
但是优化时无止境的,而且目前的情况只适合目前这个访问情况,等访问量再增加到现在的几倍后,还会出现问题,所以我准备下一步优化。

第三步 架构优化
在这里,我将新上的服务器再次利用上,安装了SQUID缓存服务器,经过调优后再次提高负载能力,并在SQUID前面安装了NGINX,充分利用NGINX的使用EPOLL特性,并把前面设置的http://images.xxx.com/移动到nginx下面。其中NGINX,SQUID,MEMCACHED安装配置的过程就不赘述了,http://www.tech-q.cn/forum-10-1.html这边有很多,也可以加QQ群:4656272,来讨论。

其他
在分析日志的过程中,发现很多访问时由于搜索引擎的蜘蛛产生的,而由于此平台的文章最终页没有静态化,所以引起了很多不必要的数据库连接。我采取了以下方法:
1 合理的设置robots.txt,对于未知的或者不受欢迎的蜘蛛,在nginx中根据其agent直接rewrite到一个静态页面。
2 根据请求,生成静态页生成HTML。

至此此平台的性能有了明显提升,无法访问,访问出错或访问缓慢的情况再也没出现过。


本文转自chenkaiunion 51CTO博客,原文链接:http://blog.51cto.com/chenkai/765312


相关实践学习
使用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月前
|
数据采集 自然语言处理 Java
Playwright 多语言一体化——Python/Java/.NET 全栈采集实战
本文以反面教材形式,剖析了在使用 Playwright 爬取懂车帝车友圈问答数据时常见的配置错误(如未设置代理、Cookie 和 User-Agent),并提供了 Python、Java 和 .NET 三种语言的修复代码示例。通过错误示例 → 问题剖析 → 修复过程 → 总结教训的完整流程,帮助读者掌握如何正确配置爬虫代理及其它必要参数,避免 IP 封禁和反爬检测,实现高效数据采集与分析。
124 3
Playwright 多语言一体化——Python/Java/.NET 全栈采集实战
|
3月前
|
数据采集 自然语言处理 JavaScript
Playwright多语言生态:跨Python/Java/.NET的统一采集方案
随着数据采集需求的增加,传统爬虫工具如Selenium、Jsoup等因语言割裂、JS渲染困难及代理兼容性差等问题,难以满足现代网站抓取需求。微软推出的Playwright框架,凭借多语言支持(Python/Java/.NET/Node.js)、统一API接口和优异的JS兼容性,解决了跨语言协作、动态页面解析和身份伪装等痛点。其性能优于Selenium与Puppeteer,在学术数据库(如Scopus)抓取中表现出色。行业应用广泛,涵盖高校科研、大型数据公司及AI初创团队,助力构建高效稳定的爬虫系统。
148 2
Playwright多语言生态:跨Python/Java/.NET的统一采集方案
|
7月前
|
开发框架 搜索推荐 算法
一个包含了 50+ C#/.NET编程技巧实战练习教程
一个包含了 50+ C#/.NET编程技巧实战练习教程
223 18
|
9月前
|
开发框架 NoSQL MongoDB
C#/.NET/.NET Core开发实战教程集合
C#/.NET/.NET Core开发实战教程集合
180 1
|
8月前
|
消息中间件 开发框架 .NET
.NET 8 强大功能 IHostedService 与 BackgroundService 实战
【11月更文挑战第7天】本文介绍了 ASP.NET Core 中的 `IHostedService` 和 `BackgroundService` 接口及其用途。`IHostedService` 定义了 `StartAsync` 和 `StopAsync` 方法,用于在应用启动和停止时执行异步操作,适用于资源初始化和清理等任务。`BackgroundService` 是 `IHostedService` 的抽象实现,简化了后台任务的编写,通过 `ExecuteAsync` 方法实现长时间运行的任务逻辑。文章还提供了创建和注册这两个服务的实战步骤,帮助开发者在实际项目中应用这些功能。
321 0
|
10月前
|
SQL 关系型数据库 数据库
七天.NET 8操作SQLite入门到实战详细教程(选型、开发、发布、部署)
七天.NET 8操作SQLite入门到实战详细教程(选型、开发、发布、部署)
245 2
|
11月前
|
测试技术 API 开发者
.NET单元测试框架大比拼:MSTest、xUnit与NUnit的实战较量与选择指南
【8月更文挑战第28天】单元测试是软件开发中不可或缺的一环,它能够确保代码的质量和稳定性。在.NET生态系统中,MSTest、xUnit和NUnit是最为流行的单元测试框架。本文将对这三种测试框架进行全面解析,并通过示例代码展示它们的基本用法和特点。
1020 8
|
11月前
|
开发框架 缓存 前端开发
实战.NET Framework 迁移到 .NET 5/6
从.NET Framework 迁移到.NET 5/6 是一次重要的技术革新,涵盖开发环境与应用架构的全面升级。本文通过具体案例详细解析迁移流程,包括评估现有应用、利用.NET Portability Analyzer 工具识别可移植代码、创建新项目、逐步迁移代码及处理依赖项更新等关键步骤。特别关注命名空间调整、JSON 序列化工具更换及数据库访问层重构等内容,旨在帮助开发者掌握最佳实践,确保迁移过程平稳高效,同时提升应用性能与可维护性。
294 2
|
11月前
|
API 开发者 Java
API 版本控制不再难!Spring 框架带你玩转多样化的版本管理策略,轻松应对升级挑战!
【8月更文挑战第31天】在开发RESTful服务时,为解决向后兼容性问题,常需进行API版本控制。本文以Spring框架为例,探讨四种版本控制策略:URL版本控制、请求头版本控制、查询参数版本控制及媒体类型版本控制,并提供示例代码。此外,还介绍了通过自定义注解与过滤器实现更灵活的版本控制方案,帮助开发者根据项目需求选择最适合的方法,确保API演化的管理和客户端使用的稳定与兼容。
491 0
|
11月前
|
开发框架 监控 .NET
开发者的革新利器:ASP.NET Core实战指南,构建未来Web应用的高效之道
【8月更文挑战第28天】本文探讨了如何利用ASP.NET Core构建高效、可扩展的Web应用。ASP.NET Core是一个开源、跨平台的框架,具有依赖注入、配置管理等特性。文章详细介绍了项目结构规划、依赖注入配置、中间件使用及性能优化方法,并讨论了安全性、可扩展性以及容器化的重要性。通过这些技术要点,开发者能够快速构建出符合现代Web应用需求的应用程序。
161 0