`
annan211
  • 浏览: 463121 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

高性能硬件上的程序部署策略

    博客分类:
  • jvm
 
阅读更多
  一个15万pv、天左右的在线文档类型网站最近更换了硬件系统,新的硬件为4个cpu,16GB物理内存,操作系统为 64位的 CentOS 5.4 ,Resin作为服务器。
  管理员选用了 64位的 jdk 1.5,通过-Xmx,-Xms 将堆固定在12GB,使用一段时间后,出现了卡B现象,长时间无响应。
  监控发现卡B是由于GC停顿导致的。虚拟机运行在Server模式,默认使用吞吐量优先收集器,一次回收12GB的堆,一次 Full Gc的时间高达 14秒,再加上程序设计的关系,访问文档中需要一次性把文档从磁盘中读取到内存,导致内存中出现很多由文档序列化产生的大对象,这些大对象很多都进入了老年代,没有在Minor GC中清理掉。在这种情况下,即使有12GB的堆,内存也很快会被消耗殆尽,有次导致每隔十几分钟出现十几秒的卡B,令网站开发人员和管理人员感到郁闷。
  这里先不谈眼神讨论程序代码问题,在程序部署上的主要问题显然是过大的堆内存进行回收时带来的城市间的停顿。硬件升级前使用32为系统1.5GB的堆,用户只感到访问网站比较缓慢,但不会发生十分明显的停顿,因此才考虑升级硬件提升程序效能。如果重新缩小给Java堆分配的内存,那么硬件上的投资就浪费了。

   在高性能硬件上部署程序,目前主要有两种方式:
   1 通过 64位 JDK 来使用大内存。
   2 使用若干个32位虚拟机简历逻辑集群来利用硬件资源。
此案例中的管理员才用了第一种部署方式。对于用户交互性强、对停顿时间敏感的系统,可以给Java虚拟机非陪超大堆的前提是有把握把应用程序的Full GC频率控制的足够地,至少要低到不会影响到用户使用,譬如十几个小时乃至一天才出现一次GC,这样可以通过在深夜执行定时任务的方式触发Full GC 甚至自动重启应用服务器来将内存可用空间保持在一个稳定的水平。
   控制Full GC频率的关键是看应用中绝大多数对象是否符合“朝生夕灭”的原则,即大多数对象的生存时间不应当太长,尤其是不能产生成批量的、长生存时间的大对象,这样才能保障老年代空间的稳定。
   在大多数网站形式的应用里,主要对象的生存周期都应该是请求级或页面级的,会话级和全局级的长生命对象相对很少。只要代码写的合理,应当都能实现在超大堆中正常使用而没有Full GC,这样的话,使用超大堆内存时,网站相应的速度才比较有保证。除此之外,如果读者计划使用64位的JDK来管理大内存,还需要考虑下面可能面临的问题:
  1 内存回收导致的长时间停顿。
  2 现阶段,64位JDK的性能测试普遍地域32位JDK。
  3 需要保证程序足够稳定,因为这种应用要是产生堆溢出几乎就无法产生堆转储快照(因为要产生十几GB乃至更大的dump文件),即使产生了快照也几乎无法进行分析。
  4 相同的程序在64位JDK中消耗的内存一般比32位的JDK大,这是由指针膨胀以及数据类型对其补白等因素导致的。
  考虑到以上几点因素,你可能会选择使用若干个虚拟机集群来利用硬件资源,具体做法是子啊一台物理机器上启动多个应用服务器进程,给每个服务器进程分配不同的端口,然后在前端大减一个负载均衡器,以反向代理的方式来分配访问请求。
   这种部署方式可能会遇到下面的问题:
    1 尽量避免节点竞争全局的资源,最典型的就是磁盘竞争,各个节点如果同事访问某个磁盘文件的话,很容易导致IO异常。
   2 很难高效率的利用某些资源池,譬如连接池,一般都是在各个节点上简历自己的独立的连接池,这样有可能导致一些节点池满了而另外一些节点仍有较多空余,尽管可以使用集中式的JNDI,但这有一定的复杂性并且可能带来额外的性能代价。
   3 各个节点仍然不可避免的收到32位的内存限制,在32位window平台中每个进程只能使用2GB的内存,考虑到堆以外的内存开销,堆一般最多只能开到1.5GB。在某些linux  unix 系统(Solaris)可以提升到3GB乃至接近4Gb的内存,但32位中仍然接受最高4GB内存的限制。
   4 大量使用本地缓存的应用,在逻辑集群中会造成大量的内存浪费,因为每个逻辑节点上都有一份缓存,这时可以考虑把本地缓存改为集中式缓存。
  
   重新回到本案例。最后的部署方案调整为简历5个32位JDK的逻辑集群,每个进程按照2GB内存计算(其中堆固定为1.5GB),占用了10GB的内存。另外建立一个Apache服务作为前端均衡代理访问门户。考虑到用户对响应速度比较关心,并且文档服务的主要压力集中在磁盘和内存访问上,CPU 资源敏感度脚底,因此采用CMS 收集器进行垃圾回收。在部署方式调整后,服务在没有出现长时间停顿,速度也有比较大提升。


    感谢周志明启发。
 
分享到:
评论

相关推荐

    J2EE_应用程序部署每台应用程序服务器上部署一个应用程序还是多个应用程序?定义.pdf

    在J2EE(Java 2 Platform, Enterprise Edition)架构中,应用程序部署策略的选择是一项关键的任务,直接关系到系统的性能、资源利用率以及可维护性。J2EE规范定义了将应用程序打包为Enterprise Archive(EAR)文件的...

    ArcGIS Server部署策略与性能优化

    ### ArcGIS Server部署策略与性能优化 #### 一、ArcGIS Server部署策略 **1. ArcGIS Server部署方式** ArcGIS Server提供了多种部署方式,包括集中部署、分布式部署以及群集部署。 - **集中部署**: SOM(Server ...

    Linux高性能服务器编程电子版

    《Linux高性能服务器编程》这本书是针对那些希望深入理解如何在Linux环境下构建高效、稳定服务器的开发者和运维人员的宝贵资源。书中的内容涵盖了广泛的Linux系统编程和服务器优化技术,旨在帮助读者提升系统的性能...

    东北大学高性能计算机体系结构课件

    课程的实践部分可能包含实验和项目,让学生亲手实现并优化高性能计算程序,比如使用CUDA或OpenCL进行GPU编程,或者在真实集群上部署并运行大规模计算任务。 总之,【东北大学高性能计算机体系结构课件】涵盖了高...

    java虚拟机调优大师--关于JVM项目程序调优代表性的实例,eclipse优化

    实战:Eclipse运行速度调优。案例分析。高性能硬件上的程序部署策略

    高级性能测试策略指导

    3. **Gatling**:基于Scala语言的高性能负载测试框架,支持HTTP/HTTPS协议,适合进行高并发测试。 4. **NeoLoad**:提供可视化界面和智能脚本技术,简化了测试过程中的配置和调试工作。 #### 七、结论 性能测试是...

    构建高性能J2EE应用的5种策略

    构建高性能的J2EE应用程序是IT领域中的一个重要挑战,尤其在当前大数据和高并发的背景下。J2EE(Java 2 Platform, Enterprise Edition)作为企业级应用开发的标准平台,提供了丰富的中间件服务和组件模型,使得...

    python高性能

    《高性能Python》这本书旨在打破这一观念,通过深入探讨Python的实现原理和技术策略,帮助读者了解如何优化代码以达到更高的性能水平。 #### 二、Python性能瓶颈定位与优化 - **理解Python底层架构:** 本书首先...

    Java高性能编程

    ### Java高性能编程——构建高可用系统的关键技术与实践 #### 引言 随着互联网技术的飞速发展,用户对服务的稳定性和响应速度提出了更高的要求。对于任何IT系统而言,“高可用性”(High Availability, HA)已经...

    高性能ASP-NET应用程序的探讨与研究共4页.pdf.z

    【高性能ASP.NET应用程序的探讨与研究】 在当前的互联网时代,高性能的Web应用程序已经成为企业级应用的必备条件,尤其是在ASP.NET框架下开发的应用程序。ASP.NET是由微软公司推出的用于构建动态网站、Web应用和Web...

    Linux高性能集群-硬件和网络体系结构[收集].pdf

    Linux高性能集群是构建在Linux操作系统基础上的多台计算机集合,旨在提供高计算能力和高可用性。在硬件和网络体系结构方面,Linux集群通常由不同类型的节点和网络组成,以实现高效协同工作。以下是对这些元素的详细...

    微软高性能运算系列课程(1):WCCS初探——微软高性能运算平台

    【微软高性能运算系列课程(1):WCCS初探——微软高性能运算平台】 高性能计算(High Performance Computing,HPC)是计算机科学的一个分支,它致力于解决需要大规模计算能力的问题。微软高性能运算平台(Microsoft ...

    memcached(五)单台服务器部署单线程性能测试

    memcached是一款开源的、高性能、分布式内存对象缓存系统,常用于减轻数据库负载,提高Web应用的响应速度。这里的“单线程性能测试”意味着我们将关注在无多线程并发情况下,memcached服务的处理能力和效率。 **...

    局域网电脑硬件信息采集

    服务端通常运行在一台服务器或高性能的电脑上,负责接收客户端发送的硬件信息,存储并处理这些数据,同时提供查询和比较功能。客户端则安装在局域网内的每一台需要被监测的电脑上,它们定期或者按需向服务端报告自身...

    BO部署的策略.pdf

    本文将详细介绍BusinessObjects产品的部署策略,包括其产品架构、部署环境与类型、硬件需求与性能要素等方面,旨在为初学者提供一个全面的入门指南。 #### 二、BusinessObjects公司简介 BusinessObjects是一家国际...

    高性能高并发服务器架构

    ### 高性能高并发服务器架构的关键知识点 #### 1. 高性能高并发服务器架构概述 - **背景**: 在互联网迅速发展的背景下,越来越多的网站面临着大量用户访问带来的挑战。为了应对这种挑战,需要构建高性能、高并发的...

Global site tag (gtag.js) - Google Analytics