`

性能与可伸缩性的概念及其关键影响因素

阅读更多

 

    性能与可伸缩性常常决定企业应用的成败,尤其在电信、金融、政府三大行业里,性能成了客户选择中间件平台的决定性因素。遇到性能问题的应用比比皆是,然而往往是等发现性能问题的时候,已经太迟。一个知名的电信合作伙伴的开发人员告诉我:“我们在性能方面,曾经有过血的代价。。。。”

    有人说,性能问题是永恒的,看来一点也不夸张。作为中间件平台的提供商,尤其需要对性能有更深刻的理解与认识。那么性能的概念是什么?性能需求需要从哪些方面来描述?影响性能的关键因素又有哪些呢?

   一、对性能的误区

凡是做企业级应用开发的人,很少没有遇到过性能问题的。而很多J2EE应用又都是在系统出了性能问题以后,才没日没夜的绞尽脑汁,从盘根错节的代码或者日志中查找原因。开发人员对性能问题存在以下误区:

1、   性能问题可以通过代码优化来解决

代码优化可以解决局部性能问题,而不能解决整个应用的性能问题。治标而不能治本。

2、   性能问题可以通过增加硬件或者用更快的硬件来解决

二、性能和可伸缩性的概念

需要区分三个概念:性能(Performance)、吞吐量(Throughout )、可伸缩性(Scalability)

1、 性能与响应时间

性能是指执行典型操作所花的时间。性能一般用“响应时间”来衡量,比如“用户成功登录的时间不能超过6秒”。尤其是对于Web应用,如果一些常用的操作很慢,用户就会有可能放弃使用你的应用。

响应时间是指处理一个请求所花的时间(如一个Http Request)。通常,“平均响应时间”更加重要。

2、 吞吐量

“吞吐量”指系统或组件在指定的时间内,所能执行的工作数。

n          每秒点击数:对于Web应用,一般用“每秒点击数”来衡量吞吐量。

n          每秒交易数:对于交易型应用,一般“每秒交易数”来衡量吞吐量。

3、 可伸缩性

“可伸缩性”是指随着并发用户数的增加,系统的处理能力。伸缩性包括“水平伸缩”和“垂直伸缩”。水平伸缩指通过增加服务器的数量(如集群)来提高吞吐量,垂直伸缩指在同一个服务器中运行多个Server。

        性能和可伸缩性往往是互相对立的。比如一个应用在单服务器中是高性能的,但是如果在集群部署的模式下,由于要维护大量的Session复制,有可能导致性能不好。但是在单个服务器中性能都不好的应用,在集群部署下性能也不会好。

三、性能和可伸缩性的需求

在需求中设置清晰的性能目标,而不是简单的说“系统需要高性能和高可伸缩性”:

1、   吞吐量和响应时间的指标

2、   哪些操作必须很快,哪些操作是可以慢一点的

不是所有用例都要求高性能的,因此需要区分不同用例的性能优先级

3、   并发用户数或事务数

4、   软件和硬件配置条件

如在什么数据库、应用服务器,以及相应的硬件CPU、内存等配置。否则就无法验证这些目标是否达到要求。

5、   是否需要集群运行,如果现在不需要,将来是否需要

四、影响性能的因素——体系结构是关键

影响性能的关键因素在于体系结构。优化单个方法的实现对性能提升起不了太大的作用。如果整个架构中充斥着不必要的数据访问,大量的Java对象与XML文档之间的转换,或者执行大量的远程调用操作,代码级的优化于事无补。

        对于性能和可伸缩性,最重要的架构选择包括三个方面:一是应用是否是分布式的,二是如果需要集群那么该如何集群,三是持久数据的访问方法。另外还有表现层以及XML等技术的使用也会对性能造成一定的影响。

1、   对象分布、集群与农场

企业级应用一般都不可能只在一台服务器中运行的,这就涉及到分布式的问题。对于水平伸缩,一般有对象分布、集群两种选择。

l          对象分布

对象分布是指将业务逻辑部署在远程服务器(如EJB或CORBA),而客户端则通过远程调用(如EJB或CORBA接口)的方式来处理系统的业务逻辑。这种方式一般是通过RMI/IIOP 、XML或者WebService调用。

l          集群

集群则是指在每个节点中都部署相同的系统或组件(包括从Web层到数据访问层)。集群模式下,路由分发往往在请求到达每个节点之前就已经处理好了,而不会在每个组件之间进行路由选择。

l          “农场”

在集群模式下,一般都需要对每个用户的Session进行复制,以保持服务器之间完全对等。农场是一种特殊的集群模式,那就是每个节点之间是完全独立的,不需要进行Session以及缓存的复制。

a)          对象分布存在的问题

对象分布对性能有着极大的影响。由于远程调用需要进行对象的序列化和反序列化操作,加上网络传输的开销,因此远程调用是非常慢的。

b)         集群对性能的影响

集群的最大困难在于复制(如Session和Data Cache复制),也是集群技术中最大的挑战与限制。而且,非农场模式的集群(水平伸缩)往往不会带来系统吞吐量的线性增长,如我们往往无法保证3台服务器集群情况下的吞吐量是单台服务器的3倍。另一方面,在集群中服务器本身的数量有时也是有限的。

2、   数据访问

系统访问持久化数据的方式也会对性能产生重要影响。比如:

a)          数据库结构的优化

b)         减少不必要的数据访问:频繁的数据库访问会导致性能大幅降低

c)         最少的数据更新次数:减少更新数据库的次数

d)         高效的数据更新:每次都只更新改动过得数据

e)          缓存的使用:使用高效的数据缓存

3、   表现层

表现层的技术使用不当也会导致系统性能低下,比如:

a)          过渡使用自定义Tag

b)         渲染JSP页面比直接访问数据库检索数据更耗时

由于展现层很易影响性能,因此单独对展现层进行性能测试是非常重要的。

4、   XML的使用

XML技术在异构系统间进行数据交换是一种很好的技术。现如今,在J2EE应用内部大量使用XML来进行通信,已经象感冒一样流行。 XML和对象之间的相互转换是非常耗时的,虽然XML Data Binding可以减少开销,但无法消除这种耗时。

 

原文:http://hi.baidu.com/langwx521/blog/item/3cb4c3fc5e2f8b83b901a0a8.html

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics