之前负责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 '%fetch%'
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)与关联文章来源:https://www.toymoban.com/news/detail-437987.html
视图viewport与关联都是为了程序员处理相对复杂的数据管理提供方便的手段。万物有其利,必有其弊。视图和关联提高了编程效率,都会较大地影响数据库的访问效率(事实上并不像一般资料说介绍的的那样高效),因此如果是web应用,则建议一般不要使用视图与关联。文章来源地址https://www.toymoban.com/news/detail-437987.html
到了这里,关于Web站点性能优化经验分享的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!