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