大型网站平台优化方案

上传人:公**** 文档编号:506280354 上传时间:2023-01-09 格式:DOCX 页数:13 大小:139.81KB
返回 下载 相关 举报
大型网站平台优化方案_第1页
第1页 / 共13页
大型网站平台优化方案_第2页
第2页 / 共13页
大型网站平台优化方案_第3页
第3页 / 共13页
大型网站平台优化方案_第4页
第4页 / 共13页
大型网站平台优化方案_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《大型网站平台优化方案》由会员分享,可在线阅读,更多相关《大型网站平台优化方案(13页珍藏版)》请在金锄头文库上搜索。

1、1.平台优化方案大型网站,在面对大量用户访问、高并发请求方面,基本的解决方案集中在 这样几个环节:使用高性能的服务器、高性能的数据库、高效率的编程语言、还 有高性能的Web容器。但是除了这几个方面,还没法根本解决大型网站面临的高 负载和高并发问题。上面提供的几个解决思路在一定程度上也意味着更大的投入,并且这样的解 决思路具备瓶颈,没有很好的扩展性,下面我从低成本、高性能和高扩张性的角 度来说说我的一些经验。1.1. HTML 静态化由于效率最高、消耗最小的就是纯静态化的html页面,所以尽可能使网站上 的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。但是对 于大量内容并且频繁更

2、新的网站,无法全部手动去挨个实现,于是出现了常见的 信息发布系统CMS,信息发布系统可以实现最简单的信息录入自动生成静态页面, 还能具备频道管理、权限管理、自动抓取等功能,对于一个大型网站来说,拥有 一套高效、可管理的CMS是必不可少的。除了门户和信息发布类型的网站,对于交互性要求很高的社区类型网站来说 尽可能的静态化也是提高性能的必要手段,将社区内的帖子、文章进行实时的静 态化,有更新的时候再重新静态化也是大量使用的策略,如Mop的大杂绘就是使 用了这样的策略,网易社区等也是如此。同时,html静态化也是某些缓存策略使用的手段,对于系统中频繁使用数据 库查询但是内容更新很小的应用,可以考虑使

3、用html静态化来实现,比如论坛中 论坛的公用设置信息,这些信息目前的主流论坛都可以进行后台管理并且存储在 数据库中,这些信息其实大量被前台程序调用,但是更新频率很小,可以考虑将 这部分内容进行后台更新的时候进行静态化,这样避免了大量的数据库访问请求1.2. 图片服务器分离对于Web服务器来说,不管是Apache、IIS还是其他容器,图片是最消耗资源 的,于是有必要将图片与页面进行分离,这是基本上大型网站都会采用的策略, 他们都有独立的图片服务器,甚至很多台图片服务器。这样的架构可以降低提供 页面访问请求的服务器系统压力,并且可以保证系统不会因为图片问题而崩溃, 在应用服务器和图片服务器上,可

4、以进行不同的配置优化,比如apache在配置 Con tent Type的时候可以尽量少支持,尽可能少的LoadModule,保证更高的系统 消耗和执行效率。1.3. CPU与10均衡在一个网站提供的所有功能中,有的功能可能需要消耗大量的服务器端io资 源,像下载,视频播放等,而有的功能则可能需要消耗大量的服务器CPU资源, 像视频格式转换,LOG统计等。在一个服务器集群中,当发现某些机器上CPU和I0 的利用率相差很大的时候,例如CPU负载很高而IO负责很低,可以考虑将该服务 器上的某些耗CP U资源的进程换成耗IO的进程,以达到均衡的目的。均衡每一台 机器的CP U和IO消耗,不仅可以获得

5、更充分的服务器资源利用,而且还能够支持 暂时的过载,遇到突发事件,访问流量剧增的时候, 实现得体的性能下降 (Graceful performance degrada tion),而不是立即崩溃。1.4. 读写分离如果网站的硬盘读写性能是整个网站性能提升的一个瓶颈的话,可以考虑将 硬盘的读,写功能分开,分别进行优化。在专门用来写的硬盘上,我们可以在Linux 下使用软件RAID-O (磁盘冗余阵列0级)。RAID-O在获得硬盘IO提升的同时,也 会增加整个文件系统的故障率它等于RAID中所有驱动器的故障率之和。如果 需要保持或提高硬盘的容错能力,就需要实现软件RAID-1, 4或5,它们能在某

6、一 个(甚至几个)磁盘驱动器故障之后仍然保持整个文件系统的正常运行,但文件 读写效率不如RAID-0。而专门用来读的硬盘,则不用如此麻烦,可以使用普通的 服务器硬盘,以降低开销。一般的文件系统,会综合考虑各种大小和格式的文件的读、写效率,因而对 特定的文件读或写的效率不是最优。如果有必要,可以通过选择文件系统,以及 修改文件系统的配置参数来达到对特定文件的读或写的效率最大化。比如说,如 果文件系统中需要存储大量的小文件,则可以使用ReiserFS来替代Linux操作系 统默认的ext3系统,因为ReiserFS是基于平衡树的文件系统结构,尤其对于大量 文件的巨型文件系统,搜索速度要比使用局部的

7、二分查找法的ext3快。ReiserFS 里的目录是完全动态分配的,因此不存在ex t3中常见的无法回收巨型目录占用的 磁盘空间的情况。ReiserFS里小文件( 4K)可以直接存储进树,小文件读取和 写入的速度更快,树内节点是按字节对齐的,多个小文件可共享同一个硬盘块, 节约大量空间。ext3使用固定大小的块分配策略,也就是说,不到4K的小文件也 要占据4K的空间,导致的空间浪费比较严重。但ReiserFS对很多Linux内核支持 的不是很好,如果网站想要使用它,就必须要安装与它配合的较好的内核。 ReiserFS还是一个较为年轻的,发展迅速的文件系统,它相对于ext3来说有一个 很大的缺陷

8、就是,每次ReiserFS文件系统升级的时候,必须完全重新格式化整个 磁盘分区。所以在选择使用的时候,需要权衡取舍。1.5. 数据库集群和库表散列大型网站都有复杂的应用,这些应用必须使用数据库,那么在面对大量访问 的时候,数据库的瓶颈很快就能显现出来,这时一台数据库将很快无法满足应用, 于是需要使用数据库集群或者库表散列。在数据库集群方面,很多数据库都有自己的解决方案,Oracle、Sybase等都 有很好的方案,常用的MySQL提供的Mas ter/Slave也是类似的方案,使用了什么 样的DB,就参考相应的解决方案来实施即可。上面提到的数据库集群由于在架构、成本、扩张性方面都会受到所采用D

9、B类 型的限制,于是需要从应用程序的角度来考虑改善系统架构,库表散列是常用并 且最有效的解决方案。在应用程序中安装业务和应用或者功能模块将数据库进行 分离,不同的模块对应不同的数据库或者表,再按照一定的策略对某个页面或者 功能进行更小的数据库散列,比如用户表,按照用户ID进行表散列,这样就能够 低成本的提升系统的性能并且有很好的扩展性。如sohu的论坛就是采用了这样的 架构,将论坛的用户、设置、帖子等信息进行数据库分离,然后对帖子、用户按 照板块和ID进行散列数据库和表,最终可以在配置文件中进行简单的配置便能让 系统随时增加一台低成本的数据库进来补充系统性能。1.6. 缓存网站架构和网站开发中

10、的缓存也是非常重要。架构方面的缓存,Apache提 供了自己的缓存模块,也可以使用外加的Squid模块进行缓存,这两种方式均可 以有效的提高Apache的访问响应能力。网站程序开发方面的缓存,Linux上提供 的Memory Cache是常用的缓存接口,可以在web开发中使用,比如用Java开发的 时候就可以调用MemoryCache对一些数据进行缓存和通讯共享。另外,在使用web 语言开发的时候,各种语言基本都有自己的缓存模块和方法。1.6.1.硬盘级缓存硬盘级别的缓存是指将需要动态生成的内容暂时缓存在硬盘上,在一个可接 受的延迟时间范围内,同样的请求不再动态生成,以达到节约系统资源,提高网

11、 站承受能力的目的。Linux环境下硬盘级缓存一般使用Squid cache。Squid是一个高性能的代理缓存服务器。和一般的代理缓存软件不同,Squid 用一个单独的、非模块化的、I/O驱动的进程来处理所有的客户端请求。它接受 来自客户端对目标对象的请求并适当地处理这些请求。比如说,用户通过浏览器 想下载(即浏览)一个web页面,浏览器请求Squid为它取得这个页面。Squid随 之连接到页面所在的原始服务器并向服务器发出取得该页面的请求。取得页面后 Squid再将页面返回给用户端浏览器,并且同时在Squid本地缓存目录里保存一份 副本。当下一次有用户需要同一页面时,Squid可以简单地从缓

12、存中读取它的副 本,直接返回给用户,而不用再次请求原始服务器。当前的Squid可以处理HTTP, FTP,GOPHER, SSL 和WAIS 等协议。Squid默认通过检测HTTP协议头的Expires和Cache-Con trol字段来决定缓存 的时间。在实际应用中,可以显式的在服务器端脚本中输出HTTP头,也可以通过 配置apache的mod_expires模块,让apache自动的给每一个网页加上过期时间。 对于静态内容,如图片,视频文件,供下载的软件等,还可以针对文件类型(扩 展名),用 Squid 的 refresh_pattern 来指定缓存时间。Squid运行的时候,默认会在硬盘

13、上建两层hash目录,用来存储缓存的Object。 它还会在内存中建立一个Hash Table,用来记录硬盘中Object分布的情况。如果 Squid配置成为一个Squid集群中的一个的话,它还会建立一个DigestTable(摘 要表),用来存储其它Squid上的Object摘要。当用户端想要的资料本地硬盘上 没有时,可以很快的知道应该去集群中的哪一台机器获得。在硬盘空间快要达到 配置限额的时候,可以配置使用某种策略(默认使用LRU: Least RecentlyUsed- 最近最少用)删除一些Objec t,从而腾出空间。集群中的Squid Server之间可以有两种关系:第一种关系是:C

14、hild和 Parent。当 Child Squid Server 没有资料时,会直接向 Parent Squid Server 要资料,然后一直等,直到Parent给它资料为止。第二种关系是:Sibling和 Sibling。当 Squid Server 没有资料时,会先向 Sibling 的 Squid Server 要 资料,如果 Sibling 没资料,就跳过它向 Parent 要或直接上原始网站去拿。默认配置的Squid,没有经过任何优化的时候,一般可以达到50%的命中率。 如果需要,还可以通过参数优化,拆分业务,优化文件系统等办法,使得Squid 达到90%以上的缓存命中率。Squ

15、id处理TCP连接消耗的服务器资源比真正的 HTTP服务器要小的多,当Squid分担了大部分连接,网站的承压能力就大大增强 了。1.6.2.内存级缓存内存级别的缓存是指将需要动态生成的内容暂时缓存在内存里,在一个可接 受的延迟时间范围内,同样的请求不再动态生成,而是直接从内存中读取。Linux 环境下内存级缓存Memcached是一个不错的选择。Memcached是开发的一套非常优秀的分布式内存对象缓存系统,用 于在动态系统中减少数据库负载,提升性能。和 Squid 的前端缓存加速不同, 它是通过基于内存的对象缓存来减少数据库查询的方式改善网站的性能,而其中 最吸引人的一个特性就是支持分布式部

16、署;也就是说可以在一群机器上建立一堆 Memcached 服务,每个服务可以根据具体服务器的硬件配置使用不同大小的内存 块,这样,理论上可以建立一个无限大的基于内存的缓存系统。Memcached是以守护程序方式运行于一个或多个服务器中,随时接受客户端 的连接操作,客户端可以由各种语言编写,目前已知的客户端 API 包括Perl/PHP/Python/Ruby/Java/C#/C 等等。客户端首先与 Memcached 服务建立连 接,然后存取对象。每个被存取的对象都有一个唯一的标识符key,存取操作均 通过这个key进行,保存的时候还可以设置有效期。保存在Memcached中的对 象实际上是放置在内存中的,而不是在硬盘上。Memcached进程运行之后,会预 申请一块较大的内存空间,自己进行管理,用完之后再申请一块,而不是每次需 要的时候去向操作系统申请。Memcached将对象保存在一个巨大的Hash表中,它 还使用NewHash算法来管

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号