Web站点性能优化经验分享

news/2024/11/20 21:38:09/

        之前负责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)与关联

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


http://www.ppmy.cn/news/34775.html

相关文章

E - 积木画(状态压缩DP)

E - 积木画(状态压缩DP) 1、问题 E - 积木画 2、分析 这道题很明显是一道DP题,而且是一个简化版的状态压缩DP。 (1)状态表示 f[i][j]f[i][j]f[i][j]表示前面i−1i-1i−1已经摆好,并且第iii列的状态是j…

【数据结构与算法】什么是双向循环链表?以及实现过程

文章目录前言:一、相关概念二、实现过程三、总结前言: 线性表是我们最常用的一种数据结构,线性表包含顺序表和链表,顺序表典型应用就是我们常用的ArrayList,链表的典型应用其中就有我们常用的LinkedList。LinkedList他…

【C语言初阶】循环语句

文章目录💐专栏导读💐文章导读🌷什么是循环🌷while循环🌷do while循环🌷for循环🌷循环结构中的break与continue🌺break🌺continue🌷goto语句💐专栏…

打怪升级之FPGA组成原理(LE部分)

FPGA芯片逻辑单元的原理 不论你使用哪一款FPGA芯片,其核心可编程逻辑单元都是从一段内存种按顺序读取执行并执行的过程。具体来说,FOGA芯片内部包括可编程逻辑块(LAB)、可配置输入输出单元(IOE)、时钟管理模块、嵌入式RAM(BRAN,在Cyclone IV…

【Vue】快速入门

目录 一、前言 二、Vue简介 2.1 vue是什么 2.2 谁开发的 2.3 Vue的特点 三、搭建Vue开发环境 3.1 安装Vue Devtools 3.2 关闭开发模式提示信息 3.3 遇到的问题 四、HelloWorld小实例 4.1 案例制作 4.2 案例分析 五、结语 一、前言 大家好,我是初心&…

【总结】面向对象

面向对象 1. 编程思维 根据面对问题不同人层显示的思维模式不同,将编程思维分为三种: 1)面向过程编程(穷人思想) - 遇得到问题想到的是解决这个问题的具体逻辑和步骤 2)函数式编程(小资思想…

[前端笔记037]vue2之vuex

前言 本笔记参考视频,尚硅谷:BV1Zy4y1K7SH p105 - p116 vuex简介和基本使用 概念:专门在 Vue 中实现集中式状态(数据)管理的一个 Vue 插件,对 vue 应用中多个组件的共享状态进行集中式的管理(读/写&…

hive的环境搭建

hive的tar包下载地址:链接:https://pan.baidu.com/s/1m3VKT2-kIgR1QyjmfnWvGw?pwdr45r 提取码:r45rmysql的tar包:链接:https://pan.baidu.com/s/1--s1m3hfNNKEVGkFEqi5iA?pwdb7h4 提取码:b7h4由于hive的元…