网站应用服务器性能优化方案总结

最近阅读了《大型网站技术架构————核心原理与案例分析》,总结了其中的网站应用服务器性能优化的部分。
应用服务器的性能优化大致上能够从一下四个方向入手:html

  1. 使用缓存
  2. 使用异步
  3. 进行服务器集群
  4. 进行代码优化

应用服务器性能优化(一)——缓存


1、使用缓存优化网站性能

网站性能优化第必定律:优化考虑使用缓存优化性能

缓存的本质是一个内存Hash表,网站应用中,数据缓存以一对Key,Value的形式存储在内存Hash表中。缓存主要用来存放那些读写比很高、不多变化的数据。git

二八定律:80%的访问落在20%的数据上。

使用缓存须要注意的问题程序员

  1. 把频繁修改的数据放入缓存。容易出现数据写入缓存后,应用还来不及读取缓存,数据就已经失效的情形,徒增系统负担。通常来讲,数据的读写比在2:1以上,缓存才有意义。
  2. 没有热点的访问。 缓存使用的内存资源很是宝贵,只能将最新访问的数据缓存起来,而把历史数据清理出缓存。即缓存资源应该留给20%的热点数据。
  3. 数据不一致与脏读。 通常会对缓存设置失效时间,超过失效时间,就要从数据库从新加载。所以应用要忍受必定时间的数据不一致。另外一种策略是数据更新时当即更新缓存,不过这也会带来更多的系统开销和事务一致性的问题。
  4. 缓存可用性。 业务发展到必定阶段时,缓存会承担大部分数据访问的压力,数据库已经习惯了有缓存的日子,因此当缓存服务器崩溃时,数据库会由于彻底不能承受如此大的压力而宕机,进而致使整个网站不可用。这种状况被称做缓存雪崩,发生这种故障,甚至不能简单地重启缓存服务器和数据库服务器来恢复网站访问。 解决方式:一、缓存热备(当某台服务器宕机时,将缓存访问切换到热备服务器上。);二、缓存服务器集群
  5. 缓存预热。 缓存中存放的是热点数据,热点数据是缓存系统用LRU对不断访问的数据筛选出来的,这个过程须要较长的时间。新启动的缓存系统没有任何数据,此时系统的性能和数据库负载都不太好。所以能够选择在启动缓存是就把热点数据预加载好。
  6. 缓存穿透。 由于不恰当的业务或恶意攻击,持续高并发地访问某一个不存在的数据,若是缓存不保存该数据,就会有大量的请求压力落在数据库上。简单的解决方式是把请求的不存在的数据也放进缓存,其value是null。

2、分布式缓存

分布式缓存架构

分布式缓存有两种架构方式,一种是以JBoss Cache为表明的须要更新同步的分布式缓存,另外一种是以Memchached为表明的不互相通讯的分布式缓存。github

应用服务器性能优化(二)——异步操做


使用消息队列“削峰”

使用消息队列将调用异步化,可改善网站的扩展性和网站的性能。
在不使用消息队列的状况下,用户的请求数据直接写入数据库,在高并发地状况下,会对数据库形成巨大的压力,同时使得响应延迟加重。
在使用消息队列后,用户请求的数据发送给消息队列后当即返回,再由消息队列的消费者进程(一般状况下,该进程一般独立部署在专门的服务器集群上)从消息队列获取数据,异步写入数据库。web

注意使用消息队列,因为数据写入消息队列后当即返回给用户,数据在后续的业务校验写数据库等操做可能失败,所以在使用消息队列进行业务异步处理后,须要适当修改业务流程进行配合。数据库

任何能够晚点作的事,都应该晚点再作。编程

应用服务器性能优化(三)——集群


  • 使用负载均衡技术为一个应用构建一个由多台服务器组成的服务器集群

应用服务器性能优化(四)——代码优化


1、多线程

因为网站应用程序通常都被web服务器容器管理,用户请求的多线程也一般被web容器管理,但不论是web容器管理的线程仍是应用程序本身建立的线程,一台服务器上启动多少线程合适呢?假设服务器上执行的都是相同类型任务,针对该类任务启动的线程数有个简化的估算方式可供参考:canvas

启动进程数=[任务执行时间/(任务执行时间-IO等待时间)]xCPU内核数

最佳启动线程数和cpu内核数量成正比,和io等待时间成正比。缓存

多线程编程须要注意线程安全问题。
编程上解决线程安全的主要手段有如下几点:安全

  1. 把对象设计为无状态对象。
  2. 使用局部对象。
  3. 并发访问资源时使用锁。

2、 资源复用

资源复用主要有两种模式单例对象池
单例模式的应用:目前web开发中主要使用贫血模式,从Service到Dao都是些无状态对象,无需重复构建,天然而然用单例模式。
对象池:复用对象实例。在实践中,应用程序的数据库链接基本都使用链接池的方式。数据库链接对象建立好之后,将链接对象放入对象池容器中,应用程序要链接的时候,就从对象池中获取一个空闲的链接使用,使用完毕再将该对象归还到对象池中便可,不须要建立新的链接。

3、 数据结构

灵活组合使用各类数据结构。

4、 垃圾回收

JVM分代垃圾回收机制,将应用程序可用的堆空间分为年轻代和年老代,又将年轻代分为Eden区,From区和To区。
若是Old Generation空间用完,就会触发Full GC,就是所谓的全量回收,全量回收会对系统性能产生较大影响,所以应根据系统业务特色和对象生命周期,合理设置Young Generation和Old Generation大小,尽可能减小Full GC。


《大型网站技术架构————核心原理与案例分析》是一本很是不错的书籍,对经验不够丰富的程序员来讲,是从总体上认识如何去构建起一个大型网站的很是好的科普型书籍,在这里安利一波。

参考文献:《大型网站技术架构————核心原理与案例分析》(李智慧 著)

相关文章
相关标签/搜索