李宝林
(西华师范大学 四川 南充 637000)
随着互联网技术的飞速发展和用户对服务质量需求的提高,网站在性能方面的要求越来越高,如何较好的解决这一问题是本文的关键,文中从分析HTTP请求流入手,然后从前端和后端性能优化技术分别进行详细的分析和描述,并针对不同的情况给出了相应的建议。
HTTP属于TCP/IP模型中的应用层协议,而两个应用程序(我们这里指的就是浏览器与服务器)之间要进行互相通信,首先得建立TCP连接,然后浏览器 才能向服务器发送请求信息,服务器在接受到请求信息后,返回相应的应答信息,浏览器接收到来自服务器的应答信息后,对这些数据进行解释执行。详情如图1所示。
根据Http请求过程可知,当用户或搜索引擎向一个网站服务器发出网页浏览请求时,该服务器首先将通过域名服务器(DNS)将域名转换为网站的 IP地址,然后返回给客户;紧接着打开一个该IP套接口连接,并记下通过该套接口的一个HTTP数据流;然后再从WEB服务器接收一个响应请求的HTTP数据流。该数据流包含状态码,状态码的值由HTTP协议所决定。这里所说的 “HTTP数据流”信息也叫“头信息(Header)”。头信息中包括了日期,服务器类型,通常还会有一条“200 OK”信息。如果一切良好,那么网络服务器就会将“200 OK”信息以及请求页面发送出去。如果网站在这时候已经建立了重定向,那么服务器就会在头信息中包含一个“302 Moved Temporarily”或“301 Moved Permanent”之类的响应信息。根据上述流程可知要做到网站的基本性能优化,必须从前端和后端两个方面优化才能解决问题。
图1 Http请求过程示意图Fig.1 The schematic diagram of HTTP request process
1)前端负载均衡,通过DNS的负载均衡器可以把用户的访问均匀地分散在多个Web服务器上。这样可以减少Web服务器的请求负载。根据http的请求是短作业的特点。故可以采用简单的负载均衡器来完成这一功能。
2)减少前端链接数,目前浏览器都是并发请求,一般的网站,特别是访问量很大的网站,要求主页包含尽量少的HTTP链接,页面包含尽量少的HTTP请求。如何做到这一点,这就要求我们设计人员和程序编写人员在写程序是充分考虑到环节。另外就是走到减少网页大小,增加带宽。假设一个网站的首页需要下载的总文件大小约在500 kB左右,如果你访问过了,浏览器会帮你缓存很大一部分,再次访问就只需下载几十K的文件。而访问量也大,节约的带宽越多。
3)前端页面尽量静态化,尽量做到直接从内存中把文件读出来返回,这样可以减少昂贵的磁盘I/O。
4)优化查询很多人查询都是在查一样的,完全可以用反向代理合并这些并发的相同的查询。这样的技术主要用查询结果缓存来实现,第一次查询走数据库获得数据,并把 数据放到缓存,后面的查询统统直接访问高速缓存。为每个查询做Hash,使用NoSQL的技术可以完成这个优化。
5)缓存问题:缓存可以用来缓存动态页面,也可以用来缓存查询的数据。缓存通常有那么几个问题:1)缓存的更新。也叫缓存和数据库的同步。有这么几种方法,一是缓存time out,让缓存失效,重查,二是,由后端通知更新,一量后端发生变化,通知前端更新。前者实现起来比较简单,但实时性不高,后者实现起来比较复杂 ,但实时性高。2)把一些不活跃的数据换出内存,比如采取一些相应的FIFO、LRU、LFU换页算法进行换页。3)缓存的重建和持久化。缓存的持久化也严重的影响到网站的基本性能。
网站性能优化仅仅靠前端优化是不够的,还需要后台做大量的工作,比如数据的冗余、镜像、分区和检索等技术的处理。
1)数据冗余,如何对数据库的数据冗余进行处理,尽量减少表之间的连接开销,但也要主要到数据之间的开销问题。比如部分场合采取NoSQL来处理数据。但这一切要根据不同的业务进行分析和处理。
2)数据镜像,几乎所有主流的数据库都支持镜像。数据库的镜像最大便利就是做负载均衡。把一台数据库的负载均分到多台上,保证了数据一致性。同时也保证了高可用性,当一台服务器出现故障时,还可以在另一条服务器上运行。然而如何保证数据镜像的数据一致性问题,必须采取一些相应的手段,比如在单条数据上对进行数据分区,如把某类数据均分到不同的服务器上,假设某类数据达10万条,我们可以设置10台服务器,每台服务器上均摊1万条,从而达到提高网站性能的效果。
3)数据分区,数据镜像对海量数据没有好的解决办法,而通常对于一个表中包含大量数据的情况下,采取数据分区的方式来进行处理。通常采取如下处理办法:①对数据实行逻辑分类。比如按照时间维度、空间维度等进行处理,目的是把一张表拆成多张字表,这样就可以达到分担负载的目的。②把数据按字段分,按照用途进行划分,把一张分成几张表。③还可以根据需要对大的数据表进行平准划分,或者负载均衡。不同的方法有不同的优缺点,具体情况具体对待。
4)后端系统负载均衡,对于访问量较大的数据,通常采用一个任务分配系统来监控各个服务器的负载情况。比如服务器什么时候忙、CPU使用率高、磁盘I/O及内存使用情况等因素都要进行综合考虑,然后把这些信息要发送到任务分配器上,由任务分配器挑选一台负载最小的服务器来处理。任务分配服务器上需要对任务队列,不能丢任务啊,所以还需要持久化。并且可以以批量的方式把任务分配给计算服务器。
5)异步、throttle和 批量处理:异步、throttle(节流阀) 和批量处理都需要对并发请求数做队列处理的。异步处理就是按照不同步的程序处理问题,异步处理与同步处理是对立的,而产生它们的是多线程或者多进程。异步处理的好处就是提高设备使用率;throttle技术是网络流量的一种保护机制,其目的是防止系统流量过大。批量处理技术,是把基本相同的请求批量处理。批量处理一般设置两个阀值,作业量和timeout,当满足其中一个条件时就会提交处理。
网站性能优化技术是一项细腻而又繁琐的工作,如何才能让网站达到最大的性能,必须从前端和后端两个方面着手,在每个细节上都尽量做到精简,优化。然HTTP请求流在技术处理上还有很多未注意到的细节,这就要求具体的操作人员在实际操作中进行相应优化。总之,从前端和后端两个方面入手,是对网站性能优化必须采取的重要策略。
[1]Cardellini V,Casalicchio E,Colajanni M,et al.The state of the art in locally distributed Web-server systems[J].ACM Computing Surveys,2002,34(2):263-311.
[2]万常选,邓松,刘喜平,等.Web数据源选择技术[J].软件学报,2013,24(4):781-797.
WANG Chang-xuan,DENG Song,LIU Xi-ping,et al.Web data source selection technologies[J].Journal of Software,2013,24(4):781-797.
[3]周鹏,周海鹰,左德承,等.基于Spirent的Web应用性能评测[J].计算机工程,2012,38(24):57-61.
ZHOU Peng,ZHOU Hai-ying,ZUO De-cheng,et al.Spirentbased Web application performance evaluation[J].Journal of Computer Engineer,2012,38(24):57-61.
[4]郝秀蕊,安 虹,李小强,等.流处理器的相变存储器主存性能优化[J].计算机工程,2011,37(24):251-253.
HAO Xiu-rui,AN Hong,LI Xiao-qiang,et al.Main memory performance optimization of phase change RAM in stream processor[J].Journal of Computer Enginee,2011,37 (24):251-253.
[5]马晓轩,林学练.WEB服务性能优化的研究[J].计算机工程与应用,2005(8):19-22.
MA Xiao-xuan,LIN Xue-lian.Research on web services performance optimization[J].ComputerEngineering and Application,2005(8):19-22.
[6]刘磊,倪宏,嵇智辉,等.基于HTTP请求的ORM性能优化研究[J].计算机工程,2009,35(8):38-39.
LIU Lei,NI Hong,JI Zhi-hui,et al.Research on ORM performance optimization based on HTTP request[J].Journal of Computer Enginee,2009,35(8):38-39.