你需要多大的池?— WebSphere性能优化(一)

2009年5月8日 hashei 没有评论

前言

What is the Cause of the Performance Problem? 或者是How to Improve the Performance?

这是我们在系统开发、部署过程中都会面对的问题,但是却很难回答。从下面的这幅图就可以看到,一个系统的性能瓶颈(bottleneck),可能在网络、防火墙,也能在Http Server,Application Server,或者是数据库;系统中一个或者多个“短板”的存在,就能让系统无法达到设计时的目标,无法满足已经签在合同里的SLA……

虽然性能问题牵涉到方方面面,但是本系列关注点在于中间件这一层。希望能用合理的配置避免诸如OutOfMemory(某些情况下)、数据库连接不够的发生,同时能应用一些参数使系统在不优化代码的情况下有5%到100%的提升。

what is cause of the performance problem

言归正传

池(Pool)是WebSphere中最常涉及的概念之一。从网络、Web 服务器、Web 容器、EJB 容器,一直到数据源,每一个环节都线程池、连接池的影子。要想恰当配置这些池的大小,首先要了解漏斗模型

queuing network

通常,WebSphere应用中的一个请求到达服务器,到真正开始处理,要经过一系列的连接池。广域网上可能有大量的并发用户同时访问Web服务器,Web服务器上同时活动(Active)的连接可能高达10000个。但Web服务器到应用服务器(Web容器)的连接池大小可能只有200。Web容器到EJB容器的连接池更小,可能是80。然后,经过数据源(Data source)到数据库的连接最大可能只有25个。从Web服务器的连接池到数据库的连接池尺寸逐渐变小,像一个漏斗(funnel),所以称为漏斗模型

摘自《构建高性能WebSphere企业级应用》第二章

 

IBM 000-253中有这么一道题:

According to the Upstream Queuing model for performance tuning, what reflets the correct application of recommended settings for maximum concurrent clients?

A Web Server=75, Web container=75, Datasource =25

B Web Server=75, Web container=50, Datasource =25

C Web Server=50, Web container=50, Datasource =50

D Web Server=25, Web container=50, Datasource =75

根据漏斗模型,那么很显然应该选B。

那么实际生产环境中就如此依样画葫芦就可以了么?后面的池一定比前面的小么?如果当前性能不行,增大池的大小就能提高么?

绝没有那么简单。后面的池小于前者,比如数据库连接池小于web线程池,默认的假定是:并非每个JSP和Servlet都需要访问数据库。如果你的应用是数据库密集型的应用,基本上每个JSP和Servlet都需要访问一次或多次数据库,而且系统中还有一些不经过jsp或Servlet的后台进程。那么数据源的连接池就必须大于web容器线程池,否则会报无法得到连接的错。

下面按照我的经验讲述一下每层池大小设置值

对于Web服务器

IBM HTTP Server的优化就是对Apache的优化。一般需要调整httpd.conf中如下参数:

MaxClients用来定义Web服务器可以同时支持的最大并发连接数或并发用户数,默认值是600。这个值需要根据你所希望的同时支持的并发用户数来设置,一般是峰值的120%。当然这个值不能设的太大,毕竟Apache吃内存也是很厉害。我遇到的项目一般是不用调整的,大家可以根据实际负载动态的调整MaxClients。

将 IBM HTTP Server 配置为显示状态页面:

  • 编辑 IBM HTTP Server 的 httpd.conf 文件,从此文件的下列各行中注释注释字符(#):
    #LoadModule status_module, modules/ApacheModuleStatus.dll,
    #<Location/server-status>
    #SetHandler server-status
    #</Location>
  • 保存更改,然后重新启动 IBM HTTP Server。
  • 在 Web 浏览器中,转至 http://yourhost/server-status。并且,单击重新装入以更新状态。
  • (可选)如果浏览器支持刷新,那么转至 http://your_host/server-status?refresh=5 以便每 5 秒钟刷新一次。

webserver high performance

上图给出了一些其它参数的推荐值。注意Windows平台和其它平台的不同(ThreadsPerChild相当于Maxclients)。关于MinSpareServers, MaxSpareServers, 和StartServers 等的设置,以及MPM使用prefork或worker模块时的不同,可以阅读Apache Performance Tuning

如果你的应用访问量很大,那么也许你需要优化一下操作系统的tcp/ip相关参数。 http://publib.boulder.ibm.com/infocenter/wasinfo/v6r0/index.jsp?topic=/com.ibm.websphere.nd.doc/info/ae/ae/tprf_tuneopsys.html

并修改“负载均衡”选项和“重试时间间隔”Web 服务器插件属性设置以提高性能http://publib.boulder.ibm.com/infocenter/wasinfo/v6r0/index.jsp?topic=/com.ibm.websphere.nd.doc/info/ae/ae/tprf_tunewebserv.html

Web容器线程池

要点就是:“通常,对于每个服务器 CPU,5 至 10 个线程将会提供最佳吞吐量”(现在的一个cpu可以用核来代替)。比如你的Pc Server有2块CPU,每块CPU都是4核,那么你一个Application Server可以设置的最小值和最大值可以分别为40、80。但是一般考虑到能充分利用CPU和Memory,或者为不同的应用启用不同的application server,一台Pc Server上并不仅有这么一个appserver,而且还有别的进程在占用着CPU,所以默认的10到50(Linux 系统上 25 个)是一个比较合适的值,当然更准确的值需要通过性能测试来确定。

在进行性能测试的时候,如果吞吐率不是很满意,或者在TPV中看到线程池占用一直是最大值,不要立刻就调大线程池的设置——往往吞吐率会更一步下降。这时候要注意CPU占用率的情况、vmstat的r列值,特别是System状态占用率的情况,如果接近10%,甚至超过10%,那么可以肯定系统在进程切换上面消耗的资源太多了。下调线程池的大小反而会提升吞吐率,而且会由于吞吐率的提升降低页面平均响应时间。

这篇文章也许会使你对线程池大小对性能的影响有个感性的认识。

设置的地方大家应该都晓得,单击服务器 > 应用程序服务器 > server_name > 线程池。

数据库连接池

连接池的最小值,应该和性能测试时TPV观察到的jdbc平均大小一样,最大值根据实际需要设置,每次增长可以设置成大于1,增长一次到位。总之尽量避免连接池频繁的增长和收缩,减少wait的情况发生。

可以使用 Tivoli Performance Viewer 查找池中最优连接数。如果并发等待者的数目大于 0,但是 CPU 负载未接近 100%,那么考虑增加连接池大小。如果使用百分比值一直低于正常工作负载,那么考虑减少池中的连接数。

Application Server 将在使用该数据源的每个应用程序服务器中创建连接池的单独实例。例如:

  • 如果运行包含三个服务器的集群,这三个服务器都使用 myDataSource,并且 myDataSource 的“最大连接数”设置为 10,那么可生成多达 30 个连接(3 个服务器乘以 10 个连接)

这是需要考虑的,别数据库端的连接大小不够了。此外,inactive timeout和timeout的时间应该大于收集时间。

总结

这篇文章参考了IBM的inforcenter和developworks,给出了优化WebSphere池大小的一些经验值,但是真正合适的大小还要参考实际的情况,总之调优是个循序渐进的过程。

继续逛逛

调整完了各种池的大小,接下来你需要对内存参数做些优化,这篇是纲领性的。

JVM的恩恩怨怨-WebSphere性能优化(二)

针对不同的JDK,你可以参考:

JAVA性能优化—Sun Hotspot JDK JVM参数设置

JAVA性能优化—IBM JDK JVM参数设置

WebSphere入门篇(四)-安装集群

2009年5月4日 hashei 7 条评论

有了最早的安装WAS6.0和上两篇文章的介绍,接下来安装集群的过程其实很简单。

对于新安装的集群:

  1. 安装WAS主程序并升级补丁
  2. 建立Deployment Manager profile
  3. 新建两个Custom profile,建立过程中就完成联合节点工作
  4. 启动两个node中的nodeagent
  5. 进入控制台,新建集群,分别在两个节点添加application server

如果新建Custom profile时出现问题,或者更多的情况是想把原来已经建立好的,带有应用的application server profiles联合到DM中来建立集群,那么:

  1. 安装WAS主程序并升级补丁
  2. 建立Deployment Manager profile
  3. 新建两个application server profile(或者原先已经有了)
  4. 到profiles/bin目录下执行addnode命令:addnode DM所在IP或主机名 8879(端口)-includeapps(如果有应用的话)-username {用户名} -password {密码}
  5. 启动app profiles下的nodeagent
  6. 进入控制台,新建集群,用已经存在的application转化为cluster的member

复习一下安装profile的过程

安装DM profile

建立application server profiles

看一下如何新建集群:注意先运行addnode命令,然后启动node agent

看明白了么?没琢磨清的来这里:WebSphere v5 ND在AIX环境中安装和配置

WebSphere V7.0在Windows下的集群配置

还有一份在Unix/Linux下配置V6.1的集群文件比较大,Google Docs无法上传,其实和V7.0没有差别,照着V7做就可以了。传到了纳米盘,《WebSphere v6.1 ND在Unix&Linux环境中安装和配置》,由IBM应用开发合作中心撰写。步骤清晰,图文并茂,最重要是中文。从WebSphere Application Server、IHS、Plugins的安装配置,到WebSphere集群的搭建、节点代理程序(Node agent)的起停方法、如何生存和传播Webserver插件,回话(Session)复制,如何安装补丁。居家旅行必备文档啊

WebSphere v6.1 ND在Unix_Linux环境中安装和配置.pdf

微软的SkyDrive的嵌入方式使用的是iframe,wordpress在2.2之后就不支持iframe语法,所以大家点进去下吧。


Server Node Cell Cluster-WebSphere拓扑结构及术语介绍下

2009年5月4日 hashei 没有评论

紧接上文,我们了解了Application Server,profiles,Managed Node、Umanaged Node等概念,知道了最简单的stand-alone拓扑结构。那为了弥补stand-alone模式的可扩展性(Scalability)可靠性(reliability)要求,有必要提出Cluster的解决方案。

cluster

       这副图里我们可以看到分布在两台Machine上的两个Node,每个Node含有三个Application Server,其中两个Server与另一个Node中的两个Server构成了Cluster,这个Cluster通过Node agent被一个Deployment Manager管理。同时我们可以看到每个Node另有一个单独的Application Server,这个Server和之前介绍的Stand-alone application server可以看作是等价的,只是现在被加入到Network Deployment中,接受DM的统一管理。整个的绿色大背景则是一个单元(Cell)。

术语四 Deployment Manager(DMgr):在分布式拓扑中管理一个或多个节点的特殊profile,通过Node agent把配置和管理动作传达到每个Node中的Server上。可以通过PMT工具建立DM profile,它包含了主配置库,以及各个节点上有的配置文件——启动这个节点所需的XML配置和应用程序文件 。由此可见,各个节点的配置文件是DM上有的子集,所以当我们修改节点上应用里WEB-INF下的诸如web.xml文件,除了在节点上的config目录中要做相应修改,DM节点上config目录里同样要修改,否则重启dm后,一切配置信息将同步到和DM里有的状态。

cell

术语五 单元(Cell):是一个逻辑上的管理域的称呼,提供了对节点的单独管理入口,这个域由跨多台主机上的Node和一个DM组成,

了解了以上这些术语,那集群的概念就很简单:集群就是一组多个Application Server组成的group,运行着同样的应用程序。一个集群可以运行在一个Node上,或者同一台机器的不同node上(垂直集群),可以运行在不同机器的不同Node上(水平集群)。由此提供故障转移。配合web server,则能做到负载均衡。

web with cluster

有了这些概念,再大的Topology都不怕。

下文将讲述建集群的详细操作步骤。

Server Node Cell Cluster—Websphere拓扑结构及术语介绍上

2009年5月2日 hashei 1 条评论

/**   下文是我根据自己一年多的工作经验,结合IBM的PPT写成,如果你觉得表述的不是很明白,可以前往阅读IBM官方文档IBM WAS ND 分布式网络环境的理解与集群的实现。**/

Websphere入门篇(一)-was6.0安装中,我们配置了一个Websphere Application Server,前端联合了一个Http Server,后端连接Oracle数据库。这是WebSphere最简单的拓扑结构——带Web服务器的单机环境(Stand-alone Application Server Topology with Web Server )

Standalone

Stand-alone Application Server拓扑方式的安装是指在一个单独的节点上(Node)运行一个(仅能一个)Application Server进程的安装方式。如果你需要多个Application Server,那么你就要起多个profiles,而在ND环境中一个Profile可以起多个Application Server。在Stand-alone的环境下,Web服务器只能定义一个,ND环境下则无此限制。

术语一 Application Server:一个为J2EE应用提供了web容器、EJB容器、Naming、JMS等服务,同时提供配置和管理功能的运行平台。在Windows、Unix等分布式操作系统上,一个Server单只一个JVM实例,我们看到的就是一个java进程;但在z/OS平台上,一个Server可以包含多个操作系统进程,每个进程都单独运行一个JVM实例。

术语二 WebSphere profiles:一个application server所需要用到的User files的集合,包括诸如环境变量是如何设定的、各种资源是如何配置的、日志文件的记录格式……所有的这些构成了application server的运行时环境。

与之相对应的是Product files——运行application server所需要的二进制文件,这些二进制文件是各个profiles共享的。因为只有这一份二进制文件集,所以websphere代码的变更,比如补丁的升级,可以被旗下所有的profiles享用到,无需为每一个Profiles单独操作,节省了磁盘空间。

由此可知,如果需要为不同的应用使用不同的补丁版本,或者为某个应用打一个小fix,那么只能重新安装一个完整的WAS程序,而不仅仅是单独建立一个profile。而不同机器间WAS的迁移,也必然不能简简单单的拷贝WAS安装目录了事,至少需要安装WAS程序,profiles因为是配置的集合,和机器的相关性比较小——主机名、端口号等配置还是需要注意的——可以“偷懒”拷贝一下。

术语三 节点(Node):节点是受管服务器(Server)的逻辑分组。节点通常与具有唯一 IP主机地址的逻辑或物理计算机系统对应,节点不能跨多台计算机。

分为Managed Node:可以被Deployment manager管理,在ND环境下的application server必然是Managed Node,同时也会有一个对应的Node agent,通过在profile name/bin目录下运行startNode命令,可以让DM来管理application server。当一个Stand-alone的application server联合到ND环境下时,Node agent会自动生成,当然之前是没有的。

node

与之对应的是Unmanaged Node:顾名思义是无法直接通过DM来管理的节点,一般是作为Web Server所在节点存在的,特别是当Web server位于DMZ区,而app server位于防火墙之后。虽然是Unmanaged Node,但是生成插件、传播插件是可以的,只是起停web server需要手动执行。unmanaged node

关于 Node、Profile 与 Server:

这三个概念比较容易混淆,我们拿出来对比说明:Node=Profile。Node 是管理上使用的概念,Profile 是实际的概要文件,它们代表同一事物。Server 就是所谓的 Application Server Instance , 这是我们实际要布署 Application 的地方。在IBM WAS ND 产品中受管节点的 Node Agent 目的就是让 Deployment Manager Server 可以透过 Node Agent 来管 Node (Profile) 中的 Application Server Instance,一个 Node (Profile) 中可以有多个 Application Server Instance。

如果是非 ND 版本 , 则属于 Single Server 版本,那么一个 Node (Profile) 中只能有一个 Application Server Instance,如果你希望在一台机器上有多个 Application Server Instance,那就只能透过创建多个 Profile (Node) 来达成,但这些 Node (Porfile) 彼此独立没有管理上的关系 (RelationShip),只要使用的 TCP/IP Port 不要冲突即可。

摘自WebSphere Application Server 常见问题及解答:什么是单元(Cell)?什么是节点(Node)?Node、Profile 与 Server 之间的关系是什么?

如果stand-alone的结构无法满足应用程序的可扩展性(Scalability),可靠性(reliability)要求,那么我们就需要使用Network Deployment Topology,进而配置Cluster来满足以上两个要求。具体见下文。

WebSphere Information Integrator安装过程

2009年5月1日 admin 1 条评论

 

Wii是WebSphere Information Integrator的简称,原先是DB2中的一个组件,现在是单独的软件包,包括Websphere Federation Server,Websphere Replication Server和Websphere Data Event Publisher。现在WII又改名成Infosphere information Integrator,所以搜索找资料的时候,注意关键词的选用。

我这次装的版本是RepServ_9.5_Win_32-bit,补丁打到了sp2,sp3补丁地址见文中。

安装主机

192.16.29.234

Oracle 9.2.0.7,本地建立客户端并配置好

192..16.29.235:1521 sid:reposity

 

 

 

选择安装目录

 

选择需要安装的包装器

 

勾上简体中文语音

 

填入本地以创建的一个具有管理员权限的用户

 

 

安装完成。

 

阅读全文…

一次因为系统参数而导致的WAS无响应

2009年4月30日 admin 1 条评论

最近一个项目在做压力测试的时候,压力测试人员设置完脚本运行8小时后,第二天总会发现虽然脚本运行正常,但是有一个节点上的Server没有相应。查看日志说日志没有任何报错,记录的最后一条总是前一天的半夜。因为半夜正好是做批处理的时候,一开始怀疑是否是这导致的宕机,但是停掉批处理程序后依旧发生这种现象(而且是在下班时刻发生),也就排除了这个可能。

下面是我的排错经过:

查看无法提供服务的app2的systemout.log日志,发现从昨天晚上5点09分后,没有新的日志输出。最后的日志为

[4/15/09 17:09:28:193 GMT+08:00] 00000953 IncidentStrea W com.ibm.ws.ffdc.IncidentStreamImpl write FFDC0013I: FFDC failed to write to incident stream file /was/IBM/WebSphere/AppServer/profiles/AppSrv01/logs/ffdc/APP2_44ca44ca_09.04.15_17.09.28_0.txt, caught exception java.lang.NullPointerException

 

查看system.err文件,没有发现有价值的内容

于是查看ffdc目录下的17:09生成的日志,在APP2_7b2c7b2c_09.04.15_17.09.27_0.txt中发现有Stack Dump = javax.imageio.IIOException: Can’t create output stream!信息。

在APP2_2e542e54_09.04.15_17.09.27_1.txt中发现有Caused by: [SOAPException: faultCode=SOAP-ENV:Client; msg=Error opening socket: java.net.SocketException: Too many open files; targetException=java.lang.IllegalArgumentException: Error opening socket: java.net.SocketException: Too many open files]

 

于是使用ulimit –a命令查看AIX的limit参数

APP2:/was/IBM/WebSphere/AppServer/profiles/AppSrv01/logs/ffdc#ulimit -a
time(seconds) unlimited
file(blocks) 2097151
data(kbytes) 131072
stack(kbytes) 32768
memory(kbytes) 32768
coredump(blocks) 2097151
nofiles(descriptors) 2000

 

发现一个进程可以打开的最大文件数为2000.

用ps –ef | grep java命令找到app2的sid,然后用procfiles sid命令查看app2的进程现在打开了多少文件

APP2:/was/IBM/WebSphere/AppServer/profiles/AppSrv01/bin#procfiles 815304

815304 : /was/IBM/WebSphere/AppServer/java/bin/java -Declipse.security -Dwas.status.sock

Current rlimit: 2000 file descriptors

………………

1993: S_IFREG mode:0444 dev:10,15 ino:160745 uid:0 gid:0 rdev:0,0

O_RDONLY size:15694

1994: S_IFREG mode:0444 dev:10,15 ino:160745 uid:0 gid:0 rdev:0,0

O_RDONLY size:15694

1995: S_IFREG mode:0444 dev:10,15 ino:160745 uid:0 gid:0 rdev:0,0

O_RDONLY size:15694

1999: S_IFREG mode:0444 dev:10,15 ino:164300 uid:0 gid:0 rdev:0,0

O_RDONLY size:1042

打开文件数已经到达2000,于是app2无法创建新的systemout.log日志文件,也就无法再提供服务。

由此分析得AIX的nofiles参数对于websphere来说不够大(对于Hp-ux,安装前调整系统参数时就需要把maxfiles调整为8192,但是AIX内核是自调整,所以IBM安装要求上没有提到需要手动修改什么参数)特别是在压力测试时候,短时间内的积累可能会达到2000的限制,实际生产环境中也可能会遇到如此情况,当然集群中另外一台APP跑的好好的也挺让人奇怪。

接下来就是调整ulimit中的nofiles限制到4096,然后重启nodeagent,再由控制台重启app即可。当然也可以直接用命令重启app,但是因为nodeagent没有重启过,环境变量没有生效,下次在控制台中重启app后nofiles依旧会被限制在2000。