案例分析
高性能硬件上的程序部署策略
场景
一个15万PV/天左右的在线文档类型网站更换硬件系统,通过升级硬件提升系统程序性能
更换后:
新的硬件系统为4核,16GB物理内存,64位CentOS5.4操作系统 Resin Web服务器 64位JDK 1.5 –Xmx:12GB –Xms:12GB
更换前:
32位操作系统 1.5GB的堆
用户只感觉到使用网站比较慢,但不会明显停顿
现象
使用一段时间后,网站经常出现长时间失去响应的情况
原因
主要原因:由于GC停顿导致
硬件方面:虚拟机运行在Server模式,默认使用吞吐量优先收集器,回收12G的堆,一次FullGC的停顿时间高达14秒
程序方面:由于程序设计的关系,访问文档时要把文档从磁盘提取到内存中,导致内存中出现很多由文档序列化产生的大对象,这些大对象很多都进入了老年代,没有在MinorGC中清理掉,内存很快被消耗殆尽。
解决思路
在高性能硬件上部署程序,主要有两种方式:
-
通过64位JDK来使用大内存(本案例)
使用条件:对于用户交互性强、对停顿时间敏感的系统,可以给虚拟机分配超大堆的前提是有把握把应用程序的Full GC 频率(关键是应用中大多数对象符合朝生熄灭的原则即大多数对象的生存时间不应太长,尤其是不能成批量、长生存时间的的大对象产生,保证老年代空间的稳定)控制的足够低,低到至少不会影响到用户。
可能面临的问题: -
使用若干个32位虚拟机建立逻辑集群来利用硬件资源
无session复制的亲和式逻辑集群
亲和性(实现:均衡器按一定的规则算法(根据session分配,将一个固定的用户请求永远分配到固定的一个集群节点进行处理即可))
可能会遇到的问题:
尽量节点竞争全局的资源,最典型的磁盘竞争(如并发写很容易出现IO异常)
很难最高效率地用某些资源
解决方案
建立5个32位逻辑集群,每个进程按2GB内存计算,其中堆给1.5GB,占用10GB内存,另外建立apache服务作为前端均衡访问门户,考虑到用户对响应速度比较敏感,并且文档服务的主要压力集中在磁盘和内存访问,CPU资源敏感度较低,因此改为CMS收集器进行垃圾回收