论改进Web服务器性能有关的技术
【摘要】
基于Web技术的数据库应用是当前应用的一个热点,在用户数目与通信负荷很大的场合提高Web服务器的性能是一个迫切的课题。本文从笔者参加的某银行系统项目的经历出发阐述提高Web服务器性能应渗入到项目论证、选型、开发、运行和管理各个环节,只有各个环节都能考虑到性能与质量的要求,系统的性能才是真能可保证的和可扩展的。 本文从系统的实际运行与相应的实际经验出发,阐述性能改进方面的具体措施。在本文中讨论Web服务器平台的选型考虑;Web服务器的配置管理;应用系统本身的优化与预先设计系统时可扩展性的性能保障等具体内容。通过技术上的分析与改进,综合性的应用多类措施与手段,在实际系统中,Web服务器的运行性能得到一定程度的保障。
【正文】
我所在单位是把目标地位于金融领域开发IT应用的一家信息技术公司。随着金融电子化建设的发展和商业银行之间的市场竞争加剧,各商业银行不断通过信息化技术提供新的金融产品,并且希望整合市场渠道。比如主要商业银行提供形形色色的网上银行服务。在这种背景下,本人参与开发了新一代风上银行产品,涉及提供网上个人理财服务、网上外汇买卖服务、网上企业服务等具有市场竞争力的产品。作为项目开发的组织者之一和主要技术骨干,在整个项目的开发过程中始终要处于第一线,从而在改进Web服务器性能、提高整个网上平台性能方面受益良多,在本文中主要讨论如下,希望与读者共享经验。在Web服务器配置与优化方面,我有以下几方面的体会: 第一方面是Web服务器选型考虑
在Web服务器选型及网上平台搭建之初,我们就已经充分考虑整个网上平台的性能和可扩展性问题。这一考虑为该系统的稳定性及可扩展性能力方面打下了坚实的基础。 某银行原有的一些网上产品由于开发的较早,故采用老式的Http Server + CGID程序调用的方式。这时,每一客户请求需要对应后端系统的系统进程来运行CGI程序来处理,系统开销相当大,系统的扩展能力也很差,性能已不能满足业务处理的需要,故而在为此银行系统具体选型的时候,我们一开始就否决了这种解决方案。
通过对市场长同类产品的比较选择,我们最终确认了IMB公司的WebSphere产品系列作为该网上银行系统的建设平台。做出这样的选择是因为WebSphere基于Http Server和应用服务器相分离的整体架构,同时支持JSP、Servlet和Java bean等轻量级线程规范,所有
的请求对应于服务器上的处理线程,系统开销低效率非常高,同时WebSphere整体结构相当灵活为适应可扩展需要可做不同的横向和纵向扩展,从而可以满足各银行未来扩展的需要。
正是一开始选型的时候我们就已考虑了未来扩展的需要,整个系统在接下来几次性能改进方面,我们大体上都能相对顺利的达到了预期目标。
第二方面是Web服务的性能配置。
在一开始上线的时候,由于系统的负荷不是很大,为了节省系统总拥有成本TCO投资,我们在一台低配置的IMB RS6000上投产了该系统。整体系统的Web服务器、应用服务器、通讯服务器等全部位于这台机器上,由于初始投产时用户数据不多,所以系统的性能基本上能够令人接受。
但是随着业务的发展和用户数量的增加,我们发现该服务器的响应变慢,系统的CPU利用率和内外存数据交换显著增大,我们发现关键的原因之一是系统内存不足的缘故。由于网上服务系统把大量的用户会话信息保存到内存中供应用系统使用,当内存不足时大量Session信息被交换到硬盘,大量的CPU时间消耗在等待内外存数据交换上,系统的效率迅速下降。
鉴于这种情况我们将服务器的内存由2GB扩充至4GB,同时相应的调整用户会话信息的保存时间,这样这个系统的效率又回到了较为理想的状态。
由于新应用的不断投产和数据库操作的日益增加,我们后来逐渐监控系统的数据库处于繁忙状态,系统的错误日志也记录下了供应用服务器使用的数据库连接处出现资源不足的情况。在这种背景下,我们认为整个系统由于硬件配置所限,应该进行横向扩展,因此我们把数据库服务器出来,配置到另外一台高性能的服务器上,相应定义的数据库资源也大幅提升,这样这个系统的效率又回到了较为理想的状态。
第三对应用系统进行优化以提高性能。
Web服务器配置及相应的硬件扩展不失为解决系统问题的一种捷径,但应用系统的优化也应该是重点加以考虑的,毕竟他能在投入较少的情况下提高系统运行效率。
在开发初期,我们已经十分注意系统的效率,比如提醒程序要尽量不要使用用户会话来传递大的对象,对内存要注意回收等。同时,通过内部交流会推广和介绍一些编程技巧,提高开发人员的编程水平;通过代码审查希望在早期发现问题等。
在系统运行期间,我们通过监测发现,应用服务器所基于的java虚拟机,其内存堆的空间有不断下降的趋势,每隔若干天导致空间消耗殆尽,无法分配新的对象空间,导致系统
重启。在排除了系统本身问题的原因外,我们确定为系统应用开发的有问题。通过从网上下载IBM公司检测Java虚拟机的相关工具对JVM进行监控后发现,系统内部存在的不能回收的对象,再通过查找相应的程序发现该程序中有“环状”对象引用,从而导致对象使用后不能不垃圾收集器回收。这个问题的解决过程虽然十分艰苦,但是由于该问题不能通过升级硬件或增加硬件资源配置而得到根本解决,会给系统带来很大隐患。所以,整个过程的分析和解决是完全值得的,更何况通过查找故障原因的过程,给整个项目组上了生动的一堂软件质量保证课,对项目组的质量意识起了很大的促进作用。
所以说改进Web服务器的性能并不是单纯的管理方面的工作,它渗透到开发以及系统运行等一系列环节中。
第四方面预先考虑未来的扩展与性能需要。
随着系统的发展及成熟,考虑到用户访问量的不断上升,为了预留系统的发展空间,我们最近又对整个系统做了一个系统性的升级。通过引入多台Http服务器及应用服务器并行工作提高系统的吞吐量及单点故障的客服能力。由于在一开始选型的时候就已经充分考虑了动态负载均衡和横向扩展方面的需要,这一项的升级无需对整个系统的体系结构做根本性的变革,对应用程序来说更是没有造成任何影响。
整个项目历时近两年,从这两年系统的情况来看,整个系统是成功的。根据我的亲身经历,系统性能并不单纯是系统运行阶段和管理阶段的问题,而是渗透到项目的论证、开发以及运行阶段。只有各阶段都能考虑性能方面的需要,在实际运行时,整个系统的性能才真正有保障。在技术方面来看,可以综合利用选型评估、硬件扩展、应用优化和系统配置优化等一系列手段;比如在硬件的扩展方面,又可以分为主要部件的扩容,纵向升级横向升级等方面。在我们的项目实践中,曾综合利用了上述各种手段。