大型网站技术架构 | 应用服务器性能优化
Posted 洛阳泰山
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大型网站技术架构 | 应用服务器性能优化相关的知识,希望对你有一定的参考价值。
前言
根据网站分层架构,可分为web前端性能优化、应用服务器性能优化、存储服务器优化三大类。
应用服务器性能优化
应用服务器就是处理网站业务的服务器,网站的业务代码都部署在这里,是网站开发最复杂,变化最多的地方,优化手段主要有缓存、集群、异步等。
一、分布式缓存
网站性能优化第一规律:优先考虑使用缓存优化性能。
网站数据访问通常是二八定律,即80%的访问落在20%的数据上,因此利用缓存的高速读写的特性,将这20%的数据缓存起来,可以改善系统性能,提高数据读取速度,降低存储访问压力。
但是,不合理的使用缓存非但不能提高系统的性能,还会成为系统的累赘,甚至是风险。适用缓存的场景中我门需要考虑一下几点,再思考如何使用缓存。
频繁修改的数据
如果缓存中保存的是频繁修改的数据,就会出现数据写入缓存后,应用还没来得及读取缓存,数据就已经失效的情景,徒增系统负担,一半来说,数据的读写比例在2:1以上,即写一次缓存,再数据更新前至少读取两次,缓存才有意义。
没有热点访问的数据
缓存使用内存作为存储,内存资源宝贵而且有限,不可能把所有数据都缓存起来,只能将最新的数据缓存起来,把历史数据清理出去。如果应用系统访问数据,没有热点数据,缓存就没有意义。
数据不一致与脏数据
一般会对缓存数据设置失效时间,一旦超过时效时间,就要从数据库里重新加载数据。因此应用要容忍一定时间的数据不一致,即数据延迟更新。当然还有一种策略是数据发生更新时候立即更新缓存,不过这样也会带来更多的系统开销和事务一致性问题。
缓存可用性
当缓存服务器崩溃时,数据库可能会因为不能承受数据压力而宕机,进而导致整个网站不可用。这种情况被称为缓存雪崩,发生这种故障,不能简单的重启缓存服务器和数据库服务器来恢复网站的访问。
这种情况,需要通过分布式缓存服务器集群,将缓存数据分布到集群多台服务器上来改善缓存的可用性。
缓存预热
缓存中存放的时热点数据,热点数据又是系统利用过程算法生成的数据,数据生成的时间比较长,那么最好在缓存系统启动时就把热点数据加载好。还有一些元数据,比如城市列表。类目信息,用户信息,可以再系统启动时加载数据库中全部数据到缓存进行预热。
缓存穿透
如果因为不恰当的业务、或者而已攻击持续高并发地请求某个不存在的数据,由于缓存没有保存该数据,所有的请求都会落到数据库上,会对数据库造成很大的压力,造成系统崩溃。一个简单的对策就是将不存的数据也缓存起来(其value为null)。
二、异步操作
使用消息队列将调用异步化,可改善网站的扩展性。事实上,使用消息队列还能改善网站的系统性能。 消息队列具有很好的削峰作用,即通过异步处理,将短时间的高并发产生的事务存储在消息队列中,从而削平高峰期的并发事务。
需要注意的是,由于数据写入消息队列后立即返回给用户,数据在后续的业务校验,写入数据库等操作可能失败,因此需要适当的修改业务流程进行配合。如订单提交后,订单数据写入消息队列,不能立刻返回订单提交成功,需要在消息队列的订单真正处理完毕,甚至商品出库后,再通过短信或者邮件告知用户,以免交易纠纷。
三、使用集群
在网站高并发访问的场景下,使用负载均衡技术为应用构建一个由多台服务器组成的服务器集群,将并发访问请求分发到多台服务器上处理,避免单一服务器压力过大而响应缓慢。
四、代码优化
网站的业务逻辑实现的代码主要部署在应用服务器上,需要处理复杂的并发业务。合理的优化业务代码,可以很好的改善网站的性能。不同的编程语言优化手段有很多,这里简单说一下比较重要的几个方面。
多线程
在CGI编程时代,每个用户请求都会创建一个独立的系统进程去处理,由于线程比进程更轻量,更少占用资源,切换代价更小,所以,采用多线程处理会很大的提出网站性能。
从资源利用的角度看,使用多线程的原因主要有两个:IO阻塞与多CPU。当前线程进行IO处理的时候,会被阻塞释放CPU等待IO操作完成,由于IO操作通常需要比较长的时间,这是CPU可以调度其他的线程进行处理。理想的系统Load是既没有进程或线程等待,也没有CPU空闲,利用多线程IO阻塞与执行交替进行,可最大限度地利用CPU资源。
一台服务器上启动多少线程合适?
如果任务都是cpu计算类型任务,那么线程数最多不要超过CPU的内核数,因为启动再多线程,CPU也来不及调度。如果是任务是需要等待磁盘IO,网络IO操作
启动线程=[任务执行时间/(任务执行时间-IO等待时间)]*CPU内核数。
多线程编程需要注意的一个问题就是线程安全问题,即多线程并发对每个资源进行修改,导致数据混乱。在编程上,解决多线程安全的主要手段有如下几点。
- 将对象设计为无状态对象
- 使用局部对象
- 并发访问资源时使用锁
资源的复用
系统运行时,要尽量减少开销很大的系统资源的创建和销毁,比如数据库连接、网络通信连接,线程、复杂对象等。资源复用主要有两种模式:单列模式和对象池。
数据结构
在不同场景中合理使用恰当的数据结构,灵活组合各种数据结构改善数据读写和计算特性可极大优化程序性能。
垃圾回收
如果web应用运行在JVM等具有垃圾回收的环境中,那么垃圾回收可能对系统的性能特性产生巨大影响。理解垃圾回收机制有助于程序优化和参数调优,以及编写内存安全代码。
以上是关于大型网站技术架构 | 应用服务器性能优化的主要内容,如果未能解决你的问题,请参考以下文章