高性能硬件上的程序部署策略
在高性能硬件上部署程序,目前有两种方式:
-
通过64位JDK来使用大内存
可以给虚拟机分配超大堆的前提是有把握把应用程序的Full GC频率控制得足够低,控制Full GC频率的关键是看应用中的绝大多数对象能否符合朝生夕死的原则,即大多数对象的生存时间不应太长,尤其是不能有成批量的、长时间生存的大对象产生,这样才能保障老年代空间的稳定。
使用64位JDK管理大内存需要考虑下面可能会面临的问题:
- 内存回收导致的长时间停顿
- 64位JDK的性能测试结果低于32位JDK
- 需要保证程序稳定,因为这种应用要是产生堆溢出几乎就无法产生堆转储快照(十几GB甚至更大的Dump文件),哪怕产生了快照也几乎无法进行分析
- 相同程序在64位JDk消耗的内存一般比32位JDK大没这事由于指针膨胀,以及数据类型对齐补白等因素导致的
-
使用若干个32位虚拟机建立逻辑集群来利用硬件资源
具体做法是在一台物理机器上启动多个应用服务器进程,每个服务器进程分配不同端口,然后在前端搭建一个负载均衡器,以反向代理的方式来分配访问请求。
使用逻辑集群的方式部署程序需要考虑下面的一些问题:
- 尽量避免节点竞争全局的资源,最典型的就是磁盘竞争,各个节点如果同时访问某个磁盘文件的话(尤其是并发写操作容易出现问题),很容易导致IO异常
- 很难高效率地利用某些资源池,例如连接池,一般都是在各个节点建立自己独立的连接池,这样有可能导致一些节点池满了而另外一些节点池仍有较多空余。
- 各个节点仍然不可避免地收到32位的内存限制
- 大量使用本地缓存的应用,在逻辑集群中会造成较大的内存浪费,因为每个逻辑节点上都有一份缓存买这时候可以考虑把本地缓存改为集中式缓存。