本来想写一个网站优化的系列(前端到后端的数据库,垂直优化到分布式,后面会补上),但没有时间(借口),今天就总结一下前几天优化网站的过程。

网站优化重点在于找出出现性能问题的地方,往往是解决方案很简单,过程很艰辛。

先介绍一下场景:公司某网站产品的一个页面加载速度非常慢,完全加载完成大约8秒左右,要尽可能的提高网站加载速度。

线上环境:IIS6.0 +ASP.NET MVC4

解决思路:

对于网站优化我曾经总结过一套方法论:顺着HTTP请求方向追一排查,例如:浏览器->IIS服务器->ASP.NET->数据库。根据二八原则,其中几个阶段的20%的代码造成了80%的性能问题,所以我要重点寻找那20%的代码。但方法论始终是方法论,根据我对业务判断,我的排查流程就变成了这样 : 数据库->ASP.NET->IIS服务器->浏览器。(后来结果证明,我应该按照方法论走)

优化过程:

一、用SQL Profiler监控慢SQL

用SQL Profiler把Duration在3000毫秒以上的慢SQL赛选出来,结果一条也没有,缩小Duration到2000毫秒。结果没有。继续观察有没有N+1的问题,也没有。

二、查看是否是ASP.NET应用程序的问题

用HttpModule监控每个URL的请求时间:

结果当前请求的URL非常快。进行下一步

  三、查看IIS的相关配置。

结果:动态压缩,静态压缩都已经启用。

开始分析IIS日志,IIS日志中记录了每个请求的执行时间,这个时间和HttpModule的时间相减就是网络传输时间,由此可以判断是否是网络引起的问题。

理想总是好的,结果IIS日志已经十几G了,要挨个分析不知道啥时候,放弃,进行下一步。

以后会上LogStash,然后升级IIS(IIS6用起来真蛋疼)。

四、观察浏览器响应时间

由上图接收时间可以看出:网站响应时间大部分都浪费到了网络下载。而且页面大小为1.7M。难道是网络延时太大?ping一下

以上说明网络没有太大延时。这时候突然想起来了公司的网络限速了,下载速度平均200kb/s , 那么1.7M网页下载时间也就大约8s左右了。

再查看1.7M网页内容全是html,而且响应报文头里没有Contend-Ecoding ,说明没进行压缩。但明明服务器开启了动态压缩。

这时想起了博客园写的一篇文章:迁入阿里云后:解决了一个IIS动态内容压缩的问题 但IIS6下没有这个节点,需要修改metabase.xml,修改metabase.xml会影响所有网站,网站出现问题,风险太大,我们需要做的只是压缩当前网站的动态内容,想其他方案。

五、自己写HttpModule解决压缩问题

开始想造轮子 : 在EndRequest用Gizp压缩然后输出,结果EndRequest始终拿不到响应内容。

在万能的Stackoverflow找到这两篇文章 Can I detect if content has been compressed in my HttpModule?

Use .Net 2.0 compression library and HttpModule to compress your webpages

那个代码不适合,然后改造 ,最后修改后的代码:

上线以后经过测试,该页面响应速度2s以内了,而且响应报文头里面也有了Content-Encoding:gzip

总结,其实一开始我应查看浏览器的响应时间这些信息,但根据以往的优化经验和现在的业务,我把关注点放在了后端,不过以后我会按照我的方法论走,那样解决问题的成本更低。

解决asp.net动态压缩的更多相关文章

  1. asp.net 动态压缩、切割图片,并做缓存处理机制

    在asp.net中,新建一个handler,把需要切割的网内图片,通过调用此URL来切割并缓存.http://localhost:53829/CacheImage/ResizeImage.ashx?s ...

  2. Asp.Net静态资源动态压缩之WebOptimization

    一.Asp.Net中对Css/Js的动态压缩工具 WebOptimization 在Asp.NetMVC自带的模板项目中自动引入了当前WebOptimization工具.如果使用的空模板Nuget命令 ...

  3. asp.net 动态添加自定义控件

    前两天一直纠结asp.net动态添加控件后,后台获取不到控件的问题,查看了网上很多的回答,可能自己的理解有误或者自己所掌握的知识有限,都没有解决我遇到的问题,经过两天的研究,终于把问题解决了. 我这里 ...

  4. asp.net动态输出透明gif图片

    要使用asp.net动态输出透明gif图片,也就是用Response.ContentType = "image/GIF". 查了国内几个中文资料都没解决,最后是在一个英文博客上找到 ...

  5. JQuery EasyUI弹出对话框解决Asp.net服务器控件无法执行后台代码的方法(转)

    原文:JQuery EasyUI弹出对话框解决Asp.net服务器控件无法执行后台代码的方法 jquery-easyui是一个基于jquery的图形界面插件,利用easyui可以创建很多好看的网页界面 ...

  6. MapXtreme+Asp.net 动态轨迹

    MapXtreme+Asp.net 动态轨迹(请求大神指点)   功能简介:在MapXtreme+Asp.net的环境下实现轨迹回放功能,经过两天的努力基本实现此功能.但还有部分问题需要解决,求大神们 ...

  7. IIS7开启gZip动态压缩

    1.安装动态压缩模块: 安装过程可能的报错:This application has requested the Runtime to terminate it in an unusual way. ...

  8. 解决ASP.NET中的各种乱码问题

    解决ASP.NET中的各种乱码问题 阅读目录 开始 页面显示乱码问题 AJAX提交的数据乱码问题 JavaScript中正确的URL编码方式 ASP.NET中正确的URL编码方式 正确的URL编码方式 ...

  9. Asp.net动态页面静态化之初始NVelocity模板引擎

    Asp.net动态页面静态化之初始NVelocity模板引擎 静态页面是网页的代码都在页面中,不须要运行asp,php,jsp,.net等程序生成client网页代码的网页,静态页面网址中一般不含&q ...

随机推荐

  1. KnockoutJS 3.X API 第三章 计算监控属性(1) 使用计算监控属性

    计算监控属性(Computed Observables) 如果你有一个监控属性firstName,和另一个lastName,你要显示的全名?可以使用计算监控属性来实现-它依赖于一个或多个其他监控属性, ...

  2. 练习3:修改withdraw 方法 练习目标-使用有返回值的方法:在本练习里,将修改withdraw方法以返回一个布尔值来指示交易是否成功。

    boolean withdraw(double get){ if(get<=balance) { System.out.println("取钱"+get+"元,当余 ...

  3. bootstrap插件思路整理

    知识有时也需温故知新嘛,本次做一次bs插件梳理. $.support.transition 通过判断自定义元素是否支持WebkitTransition.MozTransition.OTransitio ...

  4. Yii2的深入学习--继承关系

    想要了解 Yii2 的话,一定要对 Yii2 中相关类的继承关系有所了解.由于暂时读的代码有限,下面的图中只列出了部分继承关系,之后回跟着源码阅读的越来越多而增加 由上图可以看到 Yii2 中大多数类 ...

  5. C/C++:提升_头文件的使用

    C/C++:提升_头文件的使用 ◇写在前面 学到现在,很多人编写程序时只会使用一个文件.这样在代码量较小的时候,更利于表达程序,但是随着代码量的逐步增加,程序的思维逻辑不是我们一下子就可以完全理清的, ...

  6. 漫谈可视化Prefuse(一)---从SQL Server数据库读取数据

    上篇<可视化工具solo show-----Prefuse自带例子GraphView讲解>主要介绍了整个Prefuse工具集具有的一些特征.框架的运行流程,分析并展现了官方提供的例子Gra ...

  7. Eclipse快捷键大全(转载)

    一.实用类快捷键 1 常用熟悉的快捷键 CTRL+C(复制).CTRL+X(剪切).CTRL+Z(撤销).CTRL+F(查找).CTRL+H(搜索文件或字符串).CTRL+Y(重做).CTRL+/(双 ...

  8. Windows Azure Active Directory (4) China Azure AD Self Password Reset

    <Windows Azure Platform 系列文章目录> 本文介绍的是国内由世纪互联运维的Azure China. 在开始本章内容之前,请读者熟悉笔者之前写的文档: Windows ...

  9. 小meta的大作用

    meta是用来在HTML文档中模拟HTTP协议的响应头报文.meta 标签用于网页的<head>与</head>中,meta 标签的用处很多.meta 的属性有两种:name和 ...

  10. JS魔法堂:mmDeferred源码剖析

    一.前言 avalon.js的影响力愈发强劲,而作为子模块之一的mmDeferred必然成为异步调用模式学习之旅的又一站呢!本文将记录我对mmDeferred的认识,若有纰漏请各位指正,谢谢.项目请见 ...