杨建旭
作者杨建旭2017-09-19 14:22
技术经理, 中国人民银行清算总中心

应用中间件概念及关注指标

字数 6305阅读 4786评论 0赞 9

从这一篇开始,介绍一下应用中间件,包括应用中间件的概念、作用,性能测试的时候监控什么指标,怎么监控,怎么分析问题和调优。

说到应用中间件,就有必要先介绍一下“中间件”是什么。在计算机这个行当,经常会接触“中间件”这个词,英文是Middleware。但初次接触这个词的人,甚至是使用了好长时间的人也搞不懂“中间件”到底是什么玩意,而且好多玩意都叫中间件。比如你去某公司面试,问面试官
你:咱们team做什么产品呀
答:中间件
你:@$#&^%*

咱们来看看百度百科上面的介绍

“应用中间件(Application Middleware),又名中间件,一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。中间件位于客户机/服务器的操作系统之上,管理计算机资源和网络通讯。是连接两个独立应用程序或独立系统的软件。相连接的系统,即使它们具有不同的接口,但通过中间件相互之间仍能交换信息。执行中间件的一个关键途径是信息传递。通过中间件,应用程序可以工作于多平台或OS环境。”

怎么样,蒙圈了吧。。。哥也看不懂是什么意思。哥小的时候也在网上查过“中间件”,说什么的都有,而且都是这种学院派的调调,不会好好说话。现在,哥就要用你能听得懂的语言告诉你,“中间件是什么”。

“中介”这个词大家都熟悉吧。

你去买房子,但平时没时间去挨家挨户敲门问“有房子卖吗”,也不懂房产交易具体什么政策、怎么过户、怎么交税。好啦,现在跳出来一个人,说“这些我熟,我每天没别的工作,就是找房子,办过户的,你把这事交给我吧,我包你满意,你就出点手续费”,这个就是房产中介。你发现买房子缺钱,要贷款,这时候就要去找什么担保公司的人给你出主意,这时候就用到了融资中介。你打算收拾一下房子的时候,会去家政公司找个小时工,家政公司就是劳动力中介。也就是说,你想处理一个事物,但又不太熟悉,但有人非常熟悉,在中间帮你处理,而且把这事当职业天天干,这就是中介。

你写一个程序,写着写着发现,好多coding的工作和业务逻辑没什么关系,比如:处理网络发送,你要保证你的消息是安全可靠的发出去,在机器断电的时候消息还在磁盘上留着,恢复供电的时候能保证消息还能发出去;你要设计一个路径策略,让消息想发到哪个路径就发到哪个路径;你要设计安全机制,谁能发谁不能发;你怕消息太大撑坏系统,要设计一个控制消息大小的参数限制……等等,你还没coding的时候,你就发现不想写了。但有人写过,并且发现了商机,把自己的那些代码抠出来做成了一个产品,帮你的应用实现这些功能,与外界沟通,这就是“中间件”。

上面例子里,是一个消息中间件,例如MQ、TLQ等。

而你要干的事情有好多,你还要处理和数据库之间的关系,要设置与数据库的连接池数量、连接多久要断开,要设置开启多少个线程来处理,设置等待超时,对客户最多开放多少个session接客……等等,这时候,你的需求方也不关心具体怎么实现,就是催你赶紧把功能实现了。这时候,你又不想干了,然后又有一个产品就跳出来帮你干这些杂七杂八的事情,它叫“应用中间件”。具体的产品有WAS、weblogic、tomcat等。

下面就开始介绍在性能测试的时候,需要关注应用中间件的哪些参数或指标。本文以WAS为例,但实际上,概念都是一样的。

Web应用程序

1 概念

应用服务器提供Web服务(接收请求,返回应答),关注其服务的能力,包括响应时间、错误的比例、吞吐量等等。

2 关注指标

响应时间:响应时间有1)ServiceTime:完成servlet请求的平均响应时间(毫秒),2)ResponseTime:接收到请求和方茴应答之间的平均时间,3)RequestResponseTime:接到请求与分派执行之间的时间,3)DispatchResponseTime:从分派执行到返回应答之间的平均时间。

可以只关注ResponseTime(接收到请求和方茴应答之间的平均时间),如果这个值出现异常,再分段分析哪里出现了问题。

ConcurrentRequests:并发处理的请求数
RequestCount:servlet处理的请求总数。结合这个指标和监控的总时间,可以计算请求的吞吐量。
ErrorCount:错误的数量。需要结合RequestCount计算错误的比例。
上述指标需要在PMI中的Web Service和Web应用程序两个分类中定制。

6.png

6.png

7.png
7.png

JDBC连接池

1 概念

当应用程序请求一个数据库连接时,连接池为该应用程序分配一个连接而不是重新建立一个连接;当应用程序使用完连接后,该连接被归还给连接池而不是直接释放。

使用连接池的最主要的优点是性能。创建一个新的数据库连接需要消耗较长时间以及较多的CPU,而采用数据库连接池后,数据库连接请求可以直接通过连接池中已经建立的连接来满足,而不需要为该请求重新连接、认证到数据库服务器,这样就节省了时间和CPU。

当然,数据库连接池如果设置过大,可能存在着多个没有被使用的连接,也就是资源的浪费。 因此,连接池中的连接也不需要都启用,而是采用这样的设计:池的大小(PoolSize)为50(举例),其中,至少有一个连接长期活着,以备有应用需要的时候马上响应。当应用需要10个连接的时候,就有10个连接被分配,此时PercentUsed为20%;当应用需要60个连接的时候,有50个连接被分配,此时PercentUsed可能非常高(例如70~100%),而剩下的10个需求则需要等待,WaitTime不为0,WaitingThreadCount(等待连接的平均并发线程数)不为0。当所有需求都被满足后,连接不再被使用,过了一段时间后,连接将被关闭。

2 设置

采用如下方法获取最大连接数、最小连接数、连接超时的设置

资源->JDBC->JDBC提供程序->DB2 Universal JDBC Driver Provider,

如下图:
1.png

1.png

点击DB2 Universal JDBC Driver Provider

2.png

2.png

点数据源

3.png

3.png

点MC_EBANK,点连接池属性

4.png

4.png

进入到如下页面,就可以看到JDBC连接池的基础配置参数。

5.png

5.png

3 关注指标

在性能测试中,需要重点关注的指标是:
PoolSize:连接池的大小。连接池不宜设置过大,虽然设置很大可以解决应用线程使用数据库的问题,但可能会将数据库压垮。因此,需要在数据库的承受能力之内设置连接池的大小,具体数字需要性能测试。

PercentUsed:正在使用的池的平均百分率,该值基于连接池中已配置的连接总数,而不是当前连接数。如果这个值比较高(例如70%),那么可能连接池设置过小,需结合WaitTime和WaitingThreadCount来扩大PoolSize。

UseTime:使用连接的平均时间(毫秒为单位),分配连接和返回连接之间的时间差。此值包含JBDC操作时间。如果这个时间过长,可以查看是JDBCTime的问题还是应用的操作时间过长。如果是应用操作时间过长,那么就需要数据库的调优。

WaitTime:在允许连接之前的平均等待时间(单位毫秒)。如果这个值不为0,并且等待时间较长,需结合PercentUsed和WaitingThreadCount来扩大PoolSize。
WaitingThreadCount:等待连接的平均并发线程数

线程池

1 概念

和JDBC连接池类似,池的作用都是为了达到最大化的性能,对于Java系统,通常的作法是使用线程池、对象池,这样节约线程、对象生成时的性能开销,也就是说系统启动时,预先生成一定数目的线程、对象实例在内存中,需要使用时,从池中取出实例,用完,归还到池中。
线程池有许多类型,例如web容器线程池、ORB线程池。

2 设置

服务器->应用程序服务器
2.png

2.png

点击部署的模块名称

3.png

3.png

点线程池

4.png

4.png

这里有各类线程池,WebContainer是jsp、html的线程池,Default是.java的线程池
点WebContainer,如下图,就可以看到线程池的配置参数值。

5.png

5.png

3 关注指标

PoolSize:池中线程的平均数。
线程池设置过大,虽然线程池大可以解决并发度不足、当线程堵塞或者死锁的情况时通过其他线程来进行事务处理,但是随之而来的性能问题也比较多,例如:1)线程池过大,导致维护开销大,每次线程维护,都需要从头到尾进行遍历;2)当一个线程堵塞时,事务另起一个线程进行工作,当堵塞线程增加到一定数目后,这些线程所占用的系统资源也是非常可观的;3)前端系统把这些洪水猛兽般的客户请求放进来,但后端数据库并没有这个处理能力,导致整个系统崩溃。

ActiveCount:并发活动的线程数
ActiveTime:线程处于活动状态的平均时间(毫秒)
PercentMaxed:所有线程的平均使用时间百分比
PercentUsed:正在使用的池的平均百分率,此值基于线程池中所有配置的线程的总数,而不是目前池大小

JVM虚拟机

1 概念

JVM的概念本身不需要赘述。

2 设置

登录was console选择服务器->应用服务器
6.png

6.png

点击部署的应用名称,选择Java和进程管理->进程定义
7.png

7.png

点击Java虚拟机
8.png

8.png

如下图,就可以看到JVM的基础配置参数数据。
9.png

9.png

3 关注指标

HeapSize:JVM的堆大小,即运行时的总内存。

堆设置过大,会占用过多的内存,影响其他系统进程、其他JVM的内存需求,甚至使物理机的内存资源耗尽,导致OS层面的PagingSpace In/Out的发生。同时,JVM堆过大,垃圾回收的过程将变长。

堆设置过小,会使得对象可分配空间变小,可能导致:1)WAS的管理节点、WAS应用无法启动,2)应用的并发能力受限,效率极低,3)频繁的使用垃圾收集机制来释放内存空间,而每次垃圾收集,都会耗用一定的系统资源。
因此,需要通过监控数据,设置合理的堆大小,在垃圾回收间隔和执行垃圾回收需要的暂停时间之间寻找平衡点。

UsedMemory:JVM运行时中的使用的内存总量(KB)
ProcessCpuUsage:JVM的CPU使用情况

会话数

1 概念

会话是指HTTP协议的会话行为,会话数直接决定了有多少用户请求可以并发的被满足。当用户请求超过会话数的情况下,就会表现出请求失败或者请求的响应时间过长。

2 设置

服务器->应用程序服务器->部署的应用->会话管理,显示内存中最大会话量参数值
10.png

10.png

3 关注指标

ActiveCount:请求当前访问的会话总数。在测试环境中,如果在稳定的压力面前,请求访问的会话数持久增长,那么,很可能程序中没有关闭会话的设置。
超时:超过该时间,会话自动失效

垃圾回收GC

1 概念

Java语言中一个显著的特点就是引入了内存回收机制(Garbage Collection,GC),很大程度上缓解了c++程序员最头疼的内存管理问题,它使得Java程序员在编写程序的时候不用特别在意内存管理。垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存;内存泄露指该内存空间使用完毕后未回收,在不涉及复杂数据结构的一般情况下,java的内存泄露表现为一个内存对象的生命周期超出了程序需要它的时间长度。这时,对象不再被引用,垃圾回收机制将回收它占领的空间,以便空间被后来的新对象使用。事实上,除了释放没用的对象,垃圾回收还做内存碎片整理。长时间的创建和释放对象的内存后,内存会出现碎片。碎片整理将所占用的堆内存移到堆的一端,将整理出的内存分配给新的对象。

垃圾回收期间,1)占用CPU资源,2)业务的响应时间略有影响。
因此垃圾回收的调用频率比较重要。一般来说,良好的GC状态需要保证相邻两次垃圾回收的平均间隔时间应当是单次垃圾回收所需时间的至少5-6倍。GC的调优是通过在模拟压力的情况下不断调整最大最小heapsize来实现的。

2 关注指标

垃圾回收期间,1)占用CPU资源,2)业务的响应时间略有影响。

因此垃圾回收的调用频率比较重要。
GCIntervalTime:两次垃圾回收调用之间的平均时间(毫秒)
GCTime:垃圾回收调用的平均持续时间(毫秒)

3 指标获取

启用详细模式的GC,native_stderr.log中将记录每次垃圾回收的具体细节,例如:空闲内存、回收间隔、暂停时间等等。可采用GCCollector工具进行查看。

也可以通过查看空闲内存趋势图来判断是否有内存的回收。WebSphere Application Server>性能监视和调整>性能查看>当前活动>启用监视>JVM

高速缓存

1 概念

将系统中经常需要调用的数据存储在高速缓存中,可以加快载入数据的速度。高速缓存可分为servlet高速缓存和对象高速缓存;servlet高速缓存包括了class,jsp页面,servlet,portal,因此可以利用WAS的Servlet高速缓存机制来缓解服务器压力。

2 设置

启用高速缓存:应用程序服务器>服务器名称>Web容器>启用servlet和命令高速缓存。

3 关注指标

InMemoryCacheEntryCount:内存中当前高速缓存条目数
MaxInMemoryCacheEntryCount:内存内高速缓存条目的最大数
ExplicitMemoryInvalidationCount:从内存中除去条目的显示失效数
HitsInMemoryCount:由内存满足的可高速缓存对象的请求数
如果ExplicitMemoryInvalidationCount与HitsInMemoryCount对比,如果失效的数目明显比较大,那么可能是缓存有些小。同时看看当前缓存的条目数是否和最大数相等,也是判断依据之一。

数据源语句缓存大小

1 概念

语句高速缓存大小是可以缓存的经过准备的JDBC语句的数量,即虽然某个语句已经不在数据库连接状态,但将它缓存,用于下次再连数据库的时候使用。如果这个缓存池比较小,容易把缓存的语句挤出去。

2 设置

资源>JDBC>数据源>名称>WebSphere Application Server数据源属性>语句高速缓存大小

3 关注指标

“语句高速缓存大小”调整的是否合适,可以查”JDBC连接池>PrepStmtCacheDiscardCount”的值。如果=0,表示没有语句因为缓存满被丢弃,如果有值,该值表示因缓存满被丢弃的语句数量。

EJB 异步方法调用最大线程数

1 概念

WAS8中引入了以异步方式运行EJB方法的能力,这里与线程池的设置类似,同样存在线程数的问题。数量过少,并发起不来。数量过多,则可能把后台系统压垮。具体数值需要实测进行调整。

2 设置

中间件服务器>名称>EJB容器设置>EJB 异步方法调用设置

11.png

11.png

3.1.9.3 关注指标
关注企业Bean中的异步相关指标
AsynQSize:用于异步方法的工作管理器队列的平均大小
AsyncWaitTime:异步方法运行前其在工作管理器队列中的平均等待时间

欢迎大家与我留言,也可以关注个人微信公众号:性能测试与调优

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

9

添加新评论0 条评论

Ctrl+Enter 发表

本文隶属于专栏

关于TWT  使用指南  社区专家合作  厂商入驻社区  企业招聘  投诉建议  版权与免责声明  联系我们
© 2019  talkwithtrend — talk with trend,talk with technologist 京ICP备09031017号-30