我们在了解完WebSphere的基本使用并成功部署项目后,还需要做一步操作,那就是WebSphere性能调优。之所以要进行性能调优是为了在合理的利用服务器资源情况下为我们的应用程序提供最优的运行环境。在进行性能调优之前,我们要明确以下几个概念:
线程池:线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。WAS线程池使服务器组件能够复用线程而不是在运行时创建新线程。创建新线程通常是很耗费时间和资源的操作。
连接池:连接池是创建和管理一个物理连接的缓冲池,其中会保留一定数量创建的物理连接不关闭,当有客户端请求时,调用连接池,可以有效减少物理连接的创建次数,降低直连所带来的系统开销,缓解应用服务器压力,提高程序性能。
最大连接数:指当前连接池中允许创建的最大物理连接数,当到达指定值后,将不允许创建物理连接。和连接超时相对应,当达到最大值后,连接请求将等待,直到池中有空闲连接为止,否则报连接超时错误。
最小连接数:指当前连接池要保留的最小物理连接,其决定未使用超时维护机制的下限,连接池的创建不是根据最小连接数而特意创建,而是根据用户请求而创建,系统会一直维护最小的连接数目。最小连接数使应用服务器保持一定数量的物理连接,利用应用服务器维护机制,合理分配服务器资源。当应用程序访问频繁,但访问人数少的情况下,最小连接数的合理配置,可以将有效的资源进行充分利用,满足特定应用需求
在明确以上几个概念后,我们就可以开始进行性能调优了,在浏览器输入“https://IP:9043/ibm/console/logon.jsp” 访问WebSphere控制台,输入账号密码登录控制台
所谓线程池调优也就是Web Container最小、最大并发用户调优。Web Container维护着一个线程池,用来处理接收到的请求,如果这个线程池设置较小(3-5)则会影响应用的性能,如果这个线程池设置过大(200-2000),则会占用服务器资源。那么如何才能设置一个比较合适的线程池大小呢?这就需要我们预估应用上线后的最大用户并发数,然后将最大并发数提供给性能测试人员便于他们编写压测脚本对我们的应用程序进行压测,同时我们利用WebSphere提供的监控工具去获取合理的最小和最大值:
我们依次点击左边菜单项的“监视和调整 -> 性能查看器 -> 当前活动”进入监视工具页面:
勾选中状态为“活动”的服务器,然后点击上面的“启动监视”按钮进行监视该服务器
当看到下图所示的提示时则表示监视启动成功:
点击被监视的服务器进入监视的详情页
依次点击“性能模块 -> 线程池 -> WebContainer”,然后点击上面的“查看模块”按钮进行查看线程池的使用情况
从上图可表明ActiveCount并发活动线程数29。这解释了图中平均只使用 29 个线程处理来自 HTTP 负载驱动程序的 50 个并发客户机连接。根据此提供信息,我们就可以预估出合理的线程池大小了。
在知道合理的线程池大小后,我们就需要对线程池的大小进行调整。依次点击“服务器 -> 所有服务器”,然后点击我们前面监控的服务器名称进入服务器的详情页面:
详情页拉倒最下面,点击“线程池”进入到线程池的配置页面
线程池配置页面拉倒最下面,点击“Web Container”
在下图所示的区域中设置我们预估出的合理的最小最大线程池数量,然后点击“应用”或“确定”按钮进行保存
点击页面中的“保存”按钮,至此,线程池调优就完成了
在参数调整完成后,我们需要去查看一下节点的状态,依次点击“系统管理 -> 节点”,如果发现下图所示的区域中,状态为红色时,就需要勾选“Node01”,然后点击上面的“同步”按钮进行手动,后续的调优也需要在参数调完后查看一下节点,如果显示红色,也需要同步一下节点状态。
每次当应用程序尝试访问后端库时(比如数据库),它都需要资源来创建、维持和释放到该数据库的连接。为了缓解此过程对总体应用程序资源的压力,应用服务器允许我们建立一个后端连接池,用于在应用服务器上共享应用程序。连接池将连接开销分散分布在若干用户请求中,以便保留应用程序资源供未来请求使用。调优连接池的目标是确保各线程都有一个数据库连接,并且请求不需要排队以等待访问数据库。
连接池的大小影响资源占用和性能情况,如连接池过小(1-5),会影响性能处理能力,TPS降低,并发一段时间出现掉用户情况,不能满足现场环境应用高负载压力测试,如连接池过大(600-2000),则会长期占用服务器利用资源,且根据不同场景交易会出现提示错误信息,比如“Could not open JDBC Connection for transaction; nested exception is java.sql.SQLException: JZ006: 捕获到 IO 例外:java.net.SocketException: 打开的文件过多”等一些相关错误信息。那么如何才能设置一个比较合适的连接池大小呢?这也需要我们预估应用上线后的最大用户并发数,然后将最大并发数提供给性能测试人员便于他们编写压测脚本对我们的应用程序进行压测,同时我们利用WebSphere提供的监控工具去获取合理的最小和最大值:
我们依次点击左边菜单项的“监视和调整 -> 性能查看器 -> 当前活动”进入监视工具页面:
勾选中状态为“活动”的服务器,然后点击上面的“启动监视”按钮进行监视该服务器
当看到下图所示的提示时则表示监视启动成功:
点击被监视的服务器进入监视的详情页
依次点击“性能模块 -> JDBC连接池 -> ORACL_JDBC_DRIVER”,然后勾选需要调优的连接名称,最后点击上面的“查看模块”按钮进行查看该连接池的使用情况
通上图可以看出poolSize池的大小47,而空闲池的大小20,说明有部分池没有使用。根据这里显示值就可预估出合理的连接池大小了。
在知道合理的连接池的大小为多少后,我们就可以开始调整了,依次点击“资源 -> JDBC -> 数据源”进入数据源列表页面,然后选择需要调整的数据源所在域,然后点击该数据源名称:
点击右边的“连接池属性”进入连接池属性配置页面
输入我们任何合理的连接池最小和最大值,然后点击“应用”或“确定”按钮进行保存
点击“保存”按钮即可完成连接池的调整
JVM堆大小参数将直接影响垃圾收集行为。通过增加 JVM 堆大小,可以在出现分配故障并触发垃圾收集之前创建更多对象。这通常可以让应用程序增加各垃圾收集 (GC) 周期之间的间隔时间。遗憾的是,增加堆大小的一个缺点是查找和处理需要垃圾收集的对象所需的时间也会随之增加。因此,JVM 堆大小调优经常涉及确定垃圾收集之间的间隔时间与执行垃圾收集所需的暂停时间之间的平衡点。
依次点击“服务器 -> 所有服务器”进入服务器列表页面,然后点击需要调整的服务器名称
拉倒最下面,在右边选择“Java和进程管理 -> 进程定义”选项
点击右边的“Java虚拟机”选项
输入我们想要调整的堆内存最大和最小值,然后点击“应用”或“确定”按钮
点击“保存”按钮即可完成调整
在进行JVM堆内存大小调优时,我们也需要借助监控工具来进行。按照前面线程池和连接池的步骤,进入到被监控的服务器里面,然后选择“性能模块 -> JVM运行时”,然后点击“查看模块”按钮查看堆内存的使用情况:
经过对JVM堆大设置从50-256、256-512、512-1024、1024-2048调整,验证了堆设置过小,会使得对象可分配空间变小,从而会频繁的使用垃圾收集机制来释放内存空间,而每次垃圾收集,都会耗用一定的系统资源。应此要通过试验和监控数据,堆设置过小时垃圾收集回收频繁。堆设置过大,会占用过多的内存,使内存资源耗尽,从而会频繁的进行IO操作来使用虚拟内存。
谈起内存大家都比较熟悉,而内存监控工具很多,比如JDK自带的jvisualvma、JProfiler、jconsole等工具,大家可以试一下这些工具。在经过验证后我们能得到一个合适的JVM堆内存大小的区域。
上面我们对WebSphere的服务器(server)进行了JVM堆内存大小的调整,我们知道WebSphere在启动时要启动控制台、节点和服务器。所以我们在进行JVM堆内存调整时,也需要对控制台和节点的JVM进行调整,而且如果一个节点下包含了多个服务器(server)的话,一定要确保节点有足够的内存让服务器(server)运行,不然server也会启动失败。控制台的JVM堆内存大小决定我们在控制台操作的流畅度,以及我们在使用控制台进行应用部署时,如果控制台的堆内存太小,可能会导致控制台卡死或长时间没有反应。所以综合上面所说,我们在进行JVM堆内存调整时,一定要将控制台、节点和服务器的内存一起调整。控制台的JVM堆内存调整的方法如下:
依次点击左侧菜单栏的“系统管理 -> Deployment Manager”,然后选择右侧的“Java和进程管理”
然后后续步骤按照上面服务器(server)调整JVM堆内存的方法进行即可。节点的JVM堆内存调整方法如下:
依次点击左侧菜单的“系统管理 -> Node Agent”选项,然后点击右边的“Java和进程管理”选项
后续步骤按照服务器(server)的进行即可,至此JVM堆内存调优完成。
进入到需要查看的服务器(server)的JVM内存大小调整页面,在下图所示的区域中添加如下内容:
-Djavax.management.builder.initial= -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=1099
其中:
-Dcom.sun.management.jmxremote.port:这个是配置远程connection的端口号的要确定这个端口没有被占用,可以自己设置号。
-Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false:这两个是固定配置,是JMX的远程服务权限
点击“保存”按钮即可
然后重启该服务器,重启完成后就可以通过Visual VM工具查看到该服务器堆内存的使用情况了,如下图所示:
如果在使用Visual VM工具连接服务器时出现下图所示的问题时,我们需要检查服务器的防火墙是否关闭或者是是否开放了1099端口,如果防火墙已关闭并且也已经开放了1099端口,那么就使用putty工具连接服务器,然后输入“hostname -i”命令,查看显示的是不是服务器的ip地址,如果显示的是“127.0.0.1”,那么就需要使用root用户修改“/etc/hosts”文件,将主机名对应的“127.0.0.1”修改成服务器的ip地址,然后重新启动WebSphere服务器,最后再使用Visual VM工具就能连接上了。(本人就是这种情况)