高并发高访问量网站的优化

来源:互联网 发布:淘宝开店查看流量 编辑:程序博客网 时间:2024/04/28 21:01

不管怎么样,先要找出瓶颈在哪:是CPU负荷太高(经常100%),还是内存不
够用(大量使用虚拟内存),还是磁盘I/O性能跟不上(硬盘指示灯狂闪)?

下面是一些解决方案:(里面汲及到的一些技术如:负载均衡,数据库的优化,缓存技术,架构的设计,环境的搭建一定要有意识的去学习)

一 升级硬件
  以上几个都是可以通过升级硬件来解决或者改善的(使用更高等级的CPU,更快速和更大容量的内
存,配置硬件磁盘阵列并使用更多数量的高速SCSI硬盘),但这需要较大的投入。

 优化程序代码
  1、减少数据库的压力
     优化数据库结构和查询语句,缓存查询结果/建内存表,建索引
    2、减少Apache的压力——减少HTTP的请求次数
    背景图片全部做成一张然后用CSS控制位置/不使用AJAX来进行即时验证(不考虑客户体验什么的,
      通过拖长客户时间来减轻服务器压力)
    3、减轻I/O压力
    页面局部缓存
  
三 架构上去优化
  1.使用负载均衡技术
  简单的提高硬件性能并不能真正解决这个问题,因为单台服务器的性能总是有限的,一般
来讲,一台PC服务器所能提供的并发访问处理能力大约为1000个,更为高档的专用服务器能
够支持3000-5000个并发访问,这样的能力还是无法满足负载较大的网站的要求。尤其是网络请
求具有突发性,当某些重大事件发生时,网络访问就会急剧上升,从而造成网络瓶颈,例如在
网上发布的克林顿弹劾书就是很明显的例子。必须采用多台服务器提供网络服务,并将网络请求
分配给这些服务器分担, 才能提供处理大量并发服务的能力。
  当使用多台服务器来分担负载的时候,最简单的办法是将不同的服务器用在不同的方面。按
提供的内容进行分割时,可以将一台服务器用于提供新闻页面,而另一台用于提供游戏页面;
或者可以按服务器的功能进行分割,将一台服务器用于提供静态页面访问,而另一些用于提供
CGI等需要大量消耗资源的动态页面访问。然而由于网络访问的突发性,使得很难确定那些页面
造成的负载太大,如果将服务的页面分割的过细就会造成很大浪费。事实上造成负载过大的页面
常常是在变化中的,如果要经常按照负载变化来调整页面所在的服务器,那么势必对管理和维
护造成极大的问题。因此这种分割方法只能是大方向的调整

  2.Lighttpd+Squid+Apache搭建高效率Web服务器
      Apache通常是开源界的首选Web服务器,因为它的强大和可靠,已经具有了品牌效应,可
以适用于绝大部分的应用场合。但是它的强大有时候却显得笨重,配置文件得让人望而生畏,
高并发情况下效率不太高。而轻量级的Web服务器Lighttpd却是后起之秀,其静态文件的响
应能力远高于Apache,据说是Apache的2-3倍。Lighttpd的高性能和易用性,足以打动我们,
在它能够胜任的领域,尽量用它。Lighttpd对PHP的支持也很好,还可以通过Fastcgi方式支
持其他的语言,比如Python。
   毕竟Lighttpd是轻量级的服务器,功能上不能跟Apache比,某些应用无法胜任。比如
Lighttpd还不支持缓存,而现在的绝大部分站点都是用程序生成动态内容,没有缓存的话即
使程序的效率再高也很难满足大访问量的需求,而且让程序不停的去做同一件事情也实在没
有意义。首先,Web程序是需要做缓存处理的,即把反复使用的数据做缓存。即使这样也还不
够,单单是启动Web处理程序的代价就不少,缓存最后生成的静态页面是必不可少的。而做
这个是 Squid的强项,它本是做代理的,支持高效的缓存,可以用来给站点做反向代理加速。
把Squid放在Apache或者Lighttpd的前端来缓存 Web服务器生成的动态内容,而Web应用
程序只需要适当地设置页面实效时间即可。
   即使是大部分内容动态生成的网站,仍免不了会有一些静态元素,比如图片、JS脚本、CSS等
等,将Squid放在Apache或者Lighttp前端后,反而会使性能下降,毕竟处理HTTP请求是
Web服务器的强项。而且已经存在于文件系统中的静态内容再在Squid中缓存一下,浪费内
存和硬盘空间。因此可以考虑将Lighttpd再放在Squid的前面,构成 Lighttpd+Squid+Apache
的一条处理链,Lighttpd在最前面,专门用来处理静态内容的请求,把动态内容请求通过
proxy模块转发给Squid,如果Squid中有该请求的内容且没有过期,则直接返回给Lighttpd。
新请求或者过期的页面请求交由Apache中Web程序来处理。经过Lighttpd和Squid的两级过
滤,Apache需要处理的请求将大大减少,减少了Web应用程序的压力。同时这样的构架,便
于把不同的处理分散到多台计算机上进行,由Lighttpd在前面统一把关。
在这种架构下,每一级都是可以进行单独优化的,比如Lighttpd可以采用异步IO方式,
Squid可以启用内存来缓存,Apache可以启用MPM 等,并且每一级都可以使用多台机器来
均衡负载,伸缩性很好。

原创粉丝点击