最近阅读了《大型网站技术架构————核心原理与案例分析》,总结了其中的网站应用服务器性能优化的部分。
应用服务器的性能优化大致上能够从一下四个方向入手:html
应用服务器性能优化(一)——缓存
网站性能优化第必定律:优化考虑使用缓存优化性能
缓存的本质是一个内存Hash表,网站应用中,数据缓存以一对Key,Value的形式存储在内存Hash表中。缓存主要用来存放那些读写比很高、不多变化的数据。git
二八定律:80%的访问落在20%的数据上。
使用缓存须要注意的问题:程序员
分布式缓存架构
分布式缓存有两种架构方式,一种是以JBoss Cache为表明的须要更新同步的分布式缓存,另外一种是以Memchached为表明的不互相通讯的分布式缓存。github
应用服务器性能优化(二)——异步操做
使用消息队列将调用异步化,可改善网站的扩展性和网站的性能。
在不使用消息队列的状况下,用户的请求数据直接写入数据库,在高并发地状况下,会对数据库形成巨大的压力,同时使得响应延迟加重。
在使用消息队列后,用户请求的数据发送给消息队列后当即返回,再由消息队列的消费者进程(一般状况下,该进程一般独立部署在专门的服务器集群上)从消息队列获取数据,异步写入数据库。web
注意使用消息队列,因为数据写入消息队列后当即返回给用户,数据在后续的业务校验写数据库等操做可能失败,所以在使用消息队列进行业务异步处理后,须要适当修改业务流程进行配合。数据库
任何能够晚点作的事,都应该晚点再作。编程
应用服务器性能优化(三)——集群
应用服务器性能优化(四)——代码优化
因为网站应用程序通常都被web服务器容器管理,用户请求的多线程也一般被web容器管理,但不论是web容器管理的线程仍是应用程序本身建立的线程,一台服务器上启动多少线程合适呢?假设服务器上执行的都是相同类型任务,针对该类任务启动的线程数有个简化的估算方式可供参考:canvas
启动进程数=[任务执行时间/(任务执行时间-IO等待时间)]xCPU内核数
最佳启动线程数和cpu内核数量成正比,和io等待时间成正比。缓存
多线程编程须要注意线程安全问题。
编程上解决线程安全的主要手段有如下几点:安全
资源复用主要有两种模式单例和对象池。
单例模式的应用:目前web开发中主要使用贫血模式,从Service到Dao都是些无状态对象,无需重复构建,天然而然用单例模式。
对象池:复用对象实例。在实践中,应用程序的数据库链接基本都使用链接池的方式。数据库链接对象建立好之后,将链接对象放入对象池容器中,应用程序要链接的时候,就从对象池中获取一个空闲的链接使用,使用完毕再将该对象归还到对象池中便可,不须要建立新的链接。
灵活组合使用各类数据结构。
JVM分代垃圾回收机制,将应用程序可用的堆空间分为年轻代和年老代,又将年轻代分为Eden区,From区和To区。
若是Old Generation空间用完,就会触发Full GC,就是所谓的全量回收,全量回收会对系统性能产生较大影响,所以应根据系统业务特色和对象生命周期,合理设置Young Generation和Old Generation大小,尽可能减小Full GC。
《大型网站技术架构————核心原理与案例分析》是一本很是不错的书籍,对经验不够丰富的程序员来讲,是从总体上认识如何去构建起一个大型网站的很是好的科普型书籍,在这里安利一波。
参考文献:《大型网站技术架构————核心原理与案例分析》(李智慧 著)