构建高性能的web站点学习笔记一

谈到网站优化,我们必须知道一次交互的过程中都经过哪几个阶段,然后在对应的阶段采取优化措施

一次交互大概经历以下几部分时间:

1.数据在网络中传输的时间(响应时间:发送数据的传输时间+返回数据的传输时间)

2.站点服务器接收到请求并生成回应数据的时间

3.浏览器计算并在本地渲染的时间

 

根据上述三个时间段,我在这简单的列举一下常用的优化方案

1.增加带宽

    当网页或组件下载速度变慢的话,一些架构师可能会采取增加带宽,因为他们认为是服务器带宽不够用了,这是最省事的一种方法,但是这对于提供下载服务为主的站点来说也许是这样的,对于其他服务的站点未必是好的解决方案 

2.减少HTTP请求:

    我们知道几乎每一个页面都包含了多个组件,每个组件都需要计算,下载,渲染,这些都是需要时间的,如果我们减少这些行为,那么就可以加快网页的执行速度,但是我们往往需要在优雅的网页以及网页的表现性能之间进行取舍,常见的优化方法是:

    1.设计简单的网页,里面包含较少的图片和脚本,但是这可能牺牲了美观和用户交互

    2.将多个图片文件合成一个图片文件,利用CSS偏移技术来呈现网页,这样可以避免多个图片下载

    3.合并js脚本和css样式表

    4.利用浏览器缓存策略,避免重复下载

    可见这一块属于网页的前端优化

3.加快服务器的脚本执行计算速度

    我们大多数涉及到性能的站点中都使用的各种各样额后台脚本语言:PHP,jsp,python,asp.net等等这行脚本都需要相应的解释器进行解释生成中间代码,然后依托解释器的运行环境中运行,所以生成中间代码这段时间又成为我们为获取性能提升瞄准的一大目标,对于一些较强的商业支持的语言比如ASP.net,JSP均有内置的优化方案(比如解释器第一次执行,然后将结果缓存下来),而对于开源的脚本语言则依靠第三方组件来提供类似功能 比如PHP的APC组件 

4.使用动态内容缓存

    动态内容缓存是指将动态生成HTML页给缓存起来,在以后一段时间内当有用户访问的时候直接跳过计算阶段而直接输出缓存中的内容,听起来的确很好,但是好的东西往往都会有些难度,我们必须考虑:成千上万的缓存文件如何存储,缓存的命中率如何,缓存的过期侧略如何设计,在应用在多台web服务器的分布式站点上我们需要考虑什么?

5.使用数据缓存

    动态内容缓存是将数据与表现一起打包缓存,这有时候并不是我们想要的效果,例如一个页面中有一部分是不经常变的(顶部ogo),而所以另外我们可以发现有时候一些动态计算总是消耗在对于一些特殊数据处理上,这些数据更新过于频繁,甚至占用大量的IO时间,如果我们想要提高缓存利用率,提高灵活性,以及性能的需求,所以引入了数据缓存

更加细粒度的缓存似乎可以避免网页的整体更新。有些内容是需要实时更新的(关系型数据的读取),如果采取动态内容缓存的话,如果页面有更新,那么我们必须重新生成缓存,这对网页中不变的内容似乎有点不公平.

我们需要考虑的问题是:如何协调数据缓存和网页缓存,能否将二者结合在一起呢,数据缓存存放在哪?

6.动态内容静态化

在动态网页的内容中虽然避免了可观的重复计算,但是需要每次调用动态脚本解释器判定缓存是否过期以及读取缓存,这似乎有点多余,关键是消耗了不少时间,直接让浏览器访问缓存不是更好么?这种情况下缓存直接暴漏给HTML页,我们普遍称之为静态化。

7.更换web服务器软件

8.页面组件分离

9.合理的部署web服务器

    我们知道访问的主机离我们的站点服务器距离越远,那么经过的路由节点越多,如果不在同一个互联网运营商的互联网中,还要经过运行商的顶级节点和骨干网络,可想而知这样要经过多少次存储转发,而且还要受不同运行商的出口带宽限制,显然我们希望我们的用户和站点服务器位于同一个互联网运营商的网络内,怎样实现呢?

10.使用负载均衡

如果我们已经最大程度上的发挥了单台服务器的处理能力,还不能满足现实需要,那么就需要更多的服务器一起分摊工作,为此我们需要想各种不同的办法实现web负载均衡,可能是简单的HTTP重定向,或是基于DNS的轮回解析,或者通过反向代理服务器来实现负载均衡调度,还可以通过LVS组件服务器集群等方法.

11.优化数据库

    如果我们忽略了数据库的优化,如果我们的表结构一塌糊涂,那么可以说前面的工作白干了,web服务器与数据库服务器交互通信一般是基于TCP协议,即便他们是在同一台主机上也是如此,在数据库设计的时候你需要考虑:

    1.你是否合理的运用这种类型的索引?

    2.你了解数据库存储引擎的特性么?

12.考虑可扩展性

    可扩展性对于我们来说是我们山穷水尽的时候被指引得一条星光大道,一旦扩展无法进行,那就是死路一条

13.减少视觉等待

    有时候用户的要求的是你不要不理我,实在不行的话给用户一些提示吧

此文档一共两部分,此下载链接为第1部分。 第1章 绪论 1.1 等待的真相 1.2 瓶颈在哪里 1.3 增加带宽 1.4 减少网页中的HTTP请求 1.5 加快服务器脚本计算速度 1.6 使用动态内容缓存 1.7 使用数据缓存 1.8 将动态内容静态化 1.9 更换Web服务器软件 1.1 页面组件分离 1.11 合理部署服务器 1.12 使用负载均衡 1.13 优化数据库 1.14 考虑可扩展性 1.15 减少视觉等待 第2章 数据的网络传输 2.1 分层网络模型 2.2 带宽 2.3 响应时间 2.4 互联互通 第3章 服务器并发处理能力 3.1 吞吐率 3.2 CPU并发计算 3.3 系统调用 3.4 内存分配 3.5 持久连接 3.6 I/O模型 3.7 服务器并发策略 第4章 动态内容缓存 4.1 重复的开销 4.2 缓存与速度 4.3 页面缓存 4.4 局部无缓存 4.5 静态化内容 第5章 动态脚本加速 5.1 opcode缓存 5.2 解释器扩展模块 5.3 脚本跟踪与分析 第6章 浏览器缓存 6.1 别忘了浏览器 6.2 缓存协商 6.3 彻底消灭请求 第7章 Web服务器缓存 7.1 URL映射 7.2 缓存响应内容 7.3 缓存文件描述符 第8章 反向代理缓存 8.1 传统代理 8.2 何为反向 8.3 在反向代理上创建缓存 8.4 小心穿过代理 8.5 流量分配 第9章 Web组件分离 9.1 备受争议的分离 9.2 因材施教 9.3 拥有不同的域名 9.4 浏览器并发数 9.5 发挥各自的潜力 第10章 分布式缓存 10.1 数据库的前端缓存区 10.2 使用memcached 10.3 读操作缓存 10.4 写操作缓存 10.5 监控状态 10.6 缓存扩展 第11章 数据库性能优化 11.1 友好的状态报告 11.2 正确使用索引 11.3 锁定与等待 11.4 事务性表的性能 11.5 使用查询缓存 11.6 临时表 11.7 线程池 11.8 反范式化设计 11.9 放弃关系型数据库 第12章 Web负载均衡 12.1 一些思考 12.2 HTTP重定向 12.3 DNS负载均衡 12.4 反向代理负载均衡 12.5 IP负载均衡 12.6 直接路由 12.7 IP隧道 12.8 考虑可用性 第13章 共享文件系统 13.1 网络共享 13.2 NFS 13.3 局限性 第14章 内容分发和同步 14.1 复制 14.2 SSH 14.3 WebDAV 14.4 rsync 14.5 Hash 14.6 分发还是同步 14.7 反向代理 第15章 分布式文件系统 15.1 文件系统 15.2 存储节点和追踪器 15.3 MogileFS 第16章 数据库扩展 16.1 复制和分离 16.2 垂直分区 16.3 水平分区 第17章 分布式计算 17.1 异步计算 17.2 并行计算 第18章 性能监控 18.1 实时监控 18.2 监控代理 18.3 系统监控 18.4 服务监控 参考文献 索引
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值