转载地址:http://www.cnblogs.com/chenkai/archive/2009/11/07/1597795.html

前言

最近帮朋友运营的平台进行了性能调优,效果还不错,所以写出来一起交流一下。如果本文中有您觉的错误的,或者不明白的,请加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。

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

Asp.net平台下网站性能调优的实战方案(转)的更多相关文章

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

    文章来源:http://www.cnblogs.com/dingjie08/archive/2009/11/10/1599929.html 前言    最近帮朋友运营的平台进行了性能调优,效果还不错, ...

  2. Java生鲜电商平台-API请求性能调优与性能监控

    Java生鲜电商平台-API请求性能调优与性能监控 背景 在做性能分析时,API的执行时间是一个显著的指标,这里使用SpringBoot AOP的方式,通过对接口添加简单注解的方式来打印API的执行时 ...

  3. JVM性能调优与实战进阶篇-上

    ZGC 诞生原因 Java生态非常强大,但还不够,有些场景仍处于劣势,而ZGC的出现可以让Java语言抢占其他语言的某些特定领域市场.比如 谷歌主导的Android手机系统显示卡顿. 证券交易市场,实 ...

  4. 网站性能调优实战-学相伴KuangStudy

    面对并发我们是如何优化KuangStudy网站性能的? 每个项目都会随着用户和数据的增长调整架构,来面对未来的问题,我们也不例外,在1月5号我们平台正式公测后,引起了很多观众的热烈反响,仅仅4天,注册 ...

  5. JVM性能调优与实战基础理论篇-上

    Java虚拟机 概述 Java官方文档 https://docs.oracle.com/en/java/index.html JVM是一种规范,通过Oracle Java 官方文档找到JVM的规范查阅 ...

  6. JVM性能调优与实战基础理论篇-中

    JVM内存模型 概述 我们所说的JVM内存模型是指运行时数据区,用New出来的对象放在堆中,如每个线程中局部变量放在栈或叫虚拟机栈中,下图左边区域部分为栈内存的结构.如main线程包含程序炯酸器.线程 ...

  7. JVM性能调优与实战基础理论篇-下

    JVM内存管理 JVM内存分配与回收策略 对象优先在Eden分配,如果Eden内存空间不足,就会发生Minor GC.虚拟机提供了-XX:+PrintGCDetails这个收集器日志参数,告诉虚拟机在 ...

  8. IntelliJ IDEA 2019.2.2在16GB内存下的性能调优

    开发工具 IntelliJ IDEA 2019.2.2 x64 idea64.exe.vmoptions -m -m -XX:ReservedCodeCacheSize=m -XX:+UseConcM ...

  9. 十八般武艺玩转GaussDB(DWS)性能调优:SQL改写

    摘要:本文将系统介绍在GaussDB(DWS)系统中影响性能的坏味道SQL及SQL模式,帮助大家能够从原理层面尽快识别这些坏味道SQL,在调优过程中及时发现问题,进行整改. 数据库的应用中,充斥着坏味 ...

随机推荐

  1. linux下mnt目录作用

    linux下mnt目录作用 一.mount 英文解释 登上; 爬上; 攀登; 骑上; 乘上; 跨上 可直接理解为“挂载” 挂接光驱.USB设备的目录,加载后,会在mnt里多出相应设备的目录.mnt是m ...

  2. oracle锁等级以及解锁

    以下是两遍关于锁的介绍的文章,第一篇介绍锁等级以及常用操作,第二篇主要介绍了oracle中两个用以查询数据库任意对象的两个视图 一: http://www.cnblogs.com/lguyss/arc ...

  3. Git 分支管理和冲突解决

    Git 分支管理和冲突解决 创建分支 git branch 没有参数,显示本地版本库中所有的本地分支名称. 当前检出分支的前面会有星号. git branch newname 在当前检出分支上新建分支 ...

  4. 使用MyEclipse 9.0 创建 struts2 的HelloWorld 工程

    作为眼高手低的典范,必须痛改前非,好好动手多做开发! 本文是struts2的入门指导,权当笔记! 在MyEclipse中,配置Apache tomcat 7.x 服务器 创建新的Web project ...

  5. jvm--3.内存管理

    5.JVM内存管理 JAVA虚拟机在执行java程序的过程中,会把它管理的内存分成若干个不同的数据区域. ----------------------------------------------- ...

  6. Spring Boot 乐观锁加锁失败 - 集成AOP

    Spring Boot with AOP 手头上的项目使用了Spring Boot, 在高并发的情况下,经常出现乐观锁加锁失败的情况(OptimisticLockingFailureException ...

  7. javascript (2)

    1.javascript作为一种脚本语言可以放在html页面中任何位置,但是浏览器解释html时是按先后顺序的,所以前面的script就先被执行.比如进行页面显示初始化的js必须放在head里面,因为 ...

  8. linux几个常用的命令及获取帮助的方法

    date:时间管理,可以显示.修改系统时间.  设定时间:格式:MMDDhhmm[[cc]yy][.ss]其中MM为月分,DD为日期,hh为小时,mm为分钟,CC为年的前两位 YY为年分的后两位,.s ...

  9. Makefile的编写

    makefile介绍 makefile的功能是管理源文件的编译链接,在makefile我们可以定义一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能 ...

  10. Java Bean、POJO、 Entity、 VO 、PO、DAO

    Java Bean.POJO. Entity. VO , 其实都是java 对象,只不过用于不同场合罢了.    Java Bean: 就是一个普通的Java 对象, 只不过是加了一些约束条件.  声 ...