[网站性能2]Asp.net平台下网站性能调优的实战方案
文章来源:http://www.cnblogs.com/dingjie08/archive/2009/11/10/1599929.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》里面所讲到的调优方法,经过跟开发人员的讨论,减少了一些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的设置》(链接无效)里面讲到的结合实际情况进行设置,并修改内存占用。我的建议:如果是单独的数据库服务器,那么尽可能的让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的使用》(链接无效)和《34条网站加速方法》(链接无效)所讲的进行优化。其中主要包括:
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中去做,具体的这里就不追溯了,有兴趣的可以在这里(链接无效) 找到相关资料。
经过第二步改造,性能提升到一个新的阶段。无法访问,访问出错或访问缓慢的情况已经很少出现了。
但是优化是无止境的,而且目前的情况只适合目前这个访问情况,等访问量再增加到现在的几倍后,还会出现问题,所以我准备下一步优化。
第三步 架构优化
在这里,我将新上的服务器再次利用上,安装了SQUID缓存服务器,经过调优后再次提高负载能力,并在SQUID前面安装了NGINX,充分利用NGINX的使用EPOLL特性,并把前面设置的http://images.xxx.com/移动到nginx下面。其中NGINX,SQUID,MEMCACHED安装配置的过程就不赘述了,(链接无效)这边有很多,也可以加QQ群:4656272,来讨论。
其他
在分析日志的过程中,发现很多访问时由于搜索引擎的蜘蛛产生的,而由于此平台的文章最终页没有静态化,所以引起了很多不必要的数据库连接。我采取了以下方法:
1 合理的设置robots.txt,对于未知的或者不受欢迎的蜘蛛,在nginx中根据其agent直接rewrite到一个静态页面。
2 根据请求,生成静态页生成HTML。
至此此平台的性能有了明显提升,无法访问,访问出错或访问缓慢的情况再也没出现
[网站性能2]Asp.net平台下网站性能调优的实战方案的更多相关文章
- Asp.net平台下网站性能调优的实战方案(转)
转载地址:http://www.cnblogs.com/chenkai/archive/2009/11/07/1597795.html 前言 最近帮朋友运营的平台进行了性能调优,效果还不错,所以写出来 ...
- Windows平台下利用APM来做负载均衡方案 - 负载均衡(下)
概述 我们在上一篇Windows平台分布式架构实践 - 负载均衡中讨论了Windows平台下通过NLB(Network Load Balancer) 来实现网站的负载均衡,并且通过压力测试演示了它的效 ...
- 【转载】Windows平台下利用APM来做负载均衡方案 - 负载均衡(下)
概述 我们在上一篇Windows平台分布式架构实践 - 负载均衡中讨论了Windows平台下通过NLB(Network Load Balancer) 来实现网站的负载均衡,并且通过压力测试演示了它的效 ...
- JVM性能调优与实战基础理论篇-上
Java虚拟机 概述 Java官方文档 https://docs.oracle.com/en/java/index.html JVM是一种规范,通过Oracle Java 官方文档找到JVM的规范查阅 ...
- JVM性能调优与实战基础理论篇-中
JVM内存模型 概述 我们所说的JVM内存模型是指运行时数据区,用New出来的对象放在堆中,如每个线程中局部变量放在栈或叫虚拟机栈中,下图左边区域部分为栈内存的结构.如main线程包含程序炯酸器.线程 ...
- JVM性能调优与实战进阶篇-上
ZGC 诞生原因 Java生态非常强大,但还不够,有些场景仍处于劣势,而ZGC的出现可以让Java语言抢占其他语言的某些特定领域市场.比如 谷歌主导的Android手机系统显示卡顿. 证券交易市场,实 ...
- 性能优化之Hibernate缓存讲解、应用和调优
JavaMelody——一款性能监控.调优工具, 通过它让我觉得项目优化是看得见摸得着的,优化有了针对性.而无论是对于分布式,还是非分布,缓存是提示性能的有效工具. 数据层是EJB3.0实现的,而EJ ...
- [原]性能优化之Hibernate缓存讲解、应用和调优
近来坤哥推荐我我们一款性能监控.调优工具--JavaMelody,通过它让我觉得项目优化是看得见摸得着的,优化有了针对性.而无论是对于分布式,还是非分布,缓存是提示性能的有效工具. 数据层是EJB3. ...
- PHP学习之[第11讲]新浪微博开放平台 PHP 与 OAuth 接口(1)
我是下载的微博最新的API练习了一下认证过程.
随机推荐
- 在mongoose中使用$match对id失效的解决方法
Topic.aggregate( //{$match:{_id:"5576b59e192868d01f75486c"}}, //not work //{$match:{title: ...
- C# VLCPlayer视频播放器(附源码)
VLCPlayer视频播放器. 支持本地播放,支持网络URL.支持全屏,截图. 基于VLCPlayer. 附带基本代码. 下载地址:http://pan.baidu.com/s/1nvjNvID
- java 正则匹配括号对以及其他成对出现的模式
最近,我们有个大调整,为了控制代码的质量,需要使用一些伪代码让业务人员编写应用逻辑(其实这么做完全是处于研发效能的考虑,95%以上的代码不需要特别注意都不会导致系统性风险,),然后通过工具自动生成实际 ...
- 设计模式01观察者模式(java)
先发代码,有空来写内容. observer1 import java.util.Observer; import java.util.Observable; //学生类(Student)继承Obser ...
- jqGrid插件getCol方法的一个改进
jgGrid插件是非常常用的一个基于jQuery的表格插件,功能非常强大.我最近也频繁使用.但是这个插件也有一些不够完善的地方.比如这个getCol方法. getCol方法接受三个参数 colname ...
- IT菜鸟的生存指南(一)那些人才适合从事IT行业
此文献给那些刚误入IT行业的小菜鸟们,此文无法教你如何"当上CEO,迎娶白富美",那是电视剧情.现实IT行业里危机重重,竞争激励.这里教你的是如何生存.生存.生存- Just do ...
- 浅谈Java的匿名类
在实际的项目中看到一个很奇怪的现象,Java可以直接new一个接口,然后在new里面粗暴的加入实现代码.就像下面这样.那么问题来了,new出来的对象没有实际的类作为载体,这不是很奇怪吗? 思考以下代码 ...
- FrozenUI - 专注于移动web的UI框架
http://frozenui.github.io/ 移动框架 重磅出击 简单易用,轻量快捷,为移动端服务的前端框架 开始使用 立即下载
- [Erlang 0123] Erlang EPMD
epmd进程和Erlang节点进程如影随形,在Rabbitmq集群,Ejabberd集群,Couchbase集群产品文档中都会有相当多的内容讲epmd,epmd是什么呢? epmd 是Erlan ...
- 介绍几种SSIS部署方式
介绍 如果你已经开发完一个不错的SSIS包并且能够在你的本地完美的运行,每个任务都亮起绿色的通过标志.这时为了能够让这个包处理能够在指定时间运行,你需要将其发布到一个服务器上,并做好相关配置.作为开发 ...