• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Web站点性能优化经验

武飞扬头像
MarcoPro
帮助1

        之前负责IT团队项目管理工作,手里有几套业务站点。其中一个站点被业务吐槽比较严重,主要涉及功能模块缺失、站点性能差会出现卡死的现象,同时也被旁边的项目团队埋怨调用我们的接口会比较慢,甚至超时的情况。

        鉴于业务压力,准备对这个站点进行性能优化,打算从页面性能和DB性能两方面入手:

一、页面性能优化

1、发现问题

想要优化web页面性能,少不了先看看是哪些页面的问题,如何来诊断页面方法有很多,大家可以去网上搜罗一下,这里我介绍一种比较常用的方法,通过IIS日志记录分析来定位响应比较慢的页面。

统计截图如下:

学新通

讲解如何统计IIS日志,需要先聊聊IIS日志的格式。日志示例如下:

#Software: Microsoft Internet Information Services 6.0
#Version: 1.0
#Date: 2010-09-30 05:00:51
#Fields: date time s-sitename s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) sc-status sc-substatus sc-win32-status
2010-09-30 07:16:59 W3SVC739 60.28.240.139 GET /robots.txt - 80 - 74.6.75.14 Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp) 200 0 0
2010-09-30 07:16:59 W3SVC739 60.28.240.139 GET /blog/category/index/ASP - 80 - 72.30.177.172 Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp) 301 0 0
date: 表示记录访问日期;
time: 访问时间;
s-sitename: 表示你的虚拟主机的代称。
s-ip: 访问者IP;
cs-method: 表示访问方法,常见的有两种,一是GET,就是平常我们打开一个URL访问的动作,二是POST,提交表单时的动作;
cs-uri-stem: 就是访问哪一个文件;
cs-uri-query: 是指访问地址的附带参数,如asp文件?后面的字符串id=12等等,如果没有参数则用-表示;
s-port: 访问的端口
cs-username: 访问者名称
c-ip: 来源ip
cs(User-Agent): 访问来源;
sc-status: 状态,200表示成功,403表示没有权限,404表示打不到该页面,500表示程序有错;
sc-substatus: 服务端传送到客户端的字节大小;
cs–win32-statu: 客户端传送到服务端的字节大小;

 学新通

 2、解决问题

现在已经找到需要优化的页面了,我们需要怎么去优化呢?至上而下,我整理了一下优化思路如下:

1)先查看页面加载内容是否过大,js、css、库文件会不会影响页面加载

     学新通

根据访问频率和耗时情况,得到需要优化的路径如下:

学新通

2)页面后台逻辑是否占用太多性能引起页面加载慢

3)是否有等待的方式调用耗时大的外部接口

二、DB性能优化

DB性能优化思路很多,我选择了一种比较粗暴直接的方式,大概还是从发现问题和解决问题2方面入手:

1、发现问题

1)慢查询sql语句检查,先找出数据库里占用资源和性能多的sql语句

SELECT top 200 last_execution_time  N'上次执行时间'

        ,total_physical_reads N'物理读取总次数'

        ,total_logical_reads/execution_count N'每次逻辑读次数'

        ,total_logical_reads  N'逻辑读取总次数'

        ,total_logical_writes N'逻辑写入总次数'

        ,execution_count  N'执行次数'

        ,total_worker_time/1000 N'所用的CPU总时间ms'

        ,total_elapsed_time/1000  N'总花费时间ms'

        ,(total_elapsed_time / execution_count)/1000  N'平均时间ms'

        ,SUBSTRING(st.text, (qs.statement_start_offset/2)   1,

         ((CASE statement_end_offset

          WHEN -1 THEN DATALENGTH(st.text)

          ELSE qs.statement_end_offset END

            - qs.statement_start_offset)/2)   1) N'执行语句'

FROM sys.dm_exec_query_stats AS qs

CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st

where SUBSTRING(st.text, (qs.statement_start_offset/2)   1,

         ((CASE statement_end_offset

          WHEN -1 THEN DATALENGTH(st.text)

          ELSE qs.statement_end_offset END

            - qs.statement_start_offset)/2)   1) not like 'tch%'

ORDER BY  total_elapsed_time / execution_count DESC;

执行结果:

学新通

 2)数据库体检

SELECT A.NAME ,B.ROWS  

FROM sysobjects  A JOIN sysindexes B ON A.id = B.id 

WHERE A.xtype = 'U' AND B.indid IN(0,1) 

ORDER BY B.ROWS DESC , A.NAME

执行结果:

学新通 

3)SQL Server活动监视器(监控数据库级别的CPU、内存、IO、耗时SQL语句):

学新通

2、解决问题 

针对上面的2步,我们基本可以发现引起数据库性能的原因所在,所以我们对症下药:

1、数据库瘦身

     1)对于单表数据量较大的表,尽可能的做数据清理,历史数据如果可以不保留尽快备份出去

     2)将数据库表拆分到不同的库中,比如 tblMEMBER 就可以拆分到 DB1 与 DB2 中去

2、不要忘记索引(index)也不要滥用索引(index)

     索引是提高数据库效率的简单又高效的方法。只要是设置了数据库表(table),就不要忘记设置索引(index)。将索引设置在经常用于排序的字段上,其他字段就不要设置了。

     索引不是越多越好,也不是什么字段都适合建立索引的。数据重复性太多的字段不要设置索引。比如 tblMEMBER 的 iSex 字段只有 0 1 两个值,就不要设置索引。

3、适当使用存储过程(Stored Processing)

     存储过程(sp)已经被大大地宣传了,本文也不例外地赞许采用存储过程。本文的建议是只在下列情况才使用存储过程:一是一个业务处理是事务,包含了多个处理过程;二是一种处理被高频使用,使用存储过程可以提高效率;

4、避免使用视图(viewport)与关联

      视图viewport与关联都是为了程序员处理相对复杂的数据管理提供方便的手段。万物有其利,必有其弊。视图和关联提高了编程效率,都会较大地影响数据库的访问效率(事实上并不像一般资料说介绍的的那样高效),因此如果是web应用,则建议一般不要使用视图与关联。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgggaeb
系列文章
更多 icon
同类精品
更多 icon
继续加载