级别: 初级 崔 康, 软件工程师, IBM 张 冰冰, 软件工程师, IBM
2009 年 8 月 28 日 Lotus Forms 系列产品提供了从设计、发布、显示、数据处理和后台集成等一整套电子表单解决方案。随着商业客户和合作开发伙伴的不断增多,他们在使用和扩展 Lotus Forms 产品时会遇到各种有关调优和诊断的问题。本文基于产品系统测试和客户支持的经验,总结了在诊断和调优 Lotus Forms 服务器端组件方面的建议,作为客户和合作伙伴的参考指南。
Lotus Forms 介绍
Lotus Forms 系列产品提供了从设计、发布、显示、数据处理和后台集成等一整套电子表单解决方案。Lotus Forms 家族包括 Viewer、Designer、Webform Server、Services Platform、API、Turbo 等产品。
- Lotus Forms Viewer 和 Designer 都是桌面客户端应用,分别用于查看和设计表单,不在本文的讨论范围之内。
- Services Platform 和 API 是 Lotus Forms 产品家族的根基,各种商业解决方案都是基于这两个组件搭建而成,因此在讨论 Turbo 和 Webform Server 等高层组件时会提到相关的调优和诊断。
- Webform Server 是 Viewer 在 Web 客户端的替代品,在后台服务器端把 XFDL 格式的 Lotus Forms 表单转化成普通浏览器(如 IE、Firefox)能够识别的 Javascript 和 HTML 页面,方便用户在不安装任何桌面应用的情况下通过浏览器访问 Lotus Forms 表单。
- Turbo 是一款完整的电子表单解决方案,把表单的设计、发布和反馈分析浓缩在一个 Web 应用中,属于 Lotus Forms 产品家族的缩微版,适应于中小型企业。
本文主要针对服务器端的 Webform Server 和 Turbo 等组件的调优和诊断做一探讨。
产品调优
本节主要介绍了 Lotus Forms 各个产品的调优方法,包括 Turbo、Webform Serve 等产品。
数据源
设定 Webform Server 和 Turbo 在 WebSphere 应用服务器中建立的 DataSource 数据源性能参数,该参数关系到 Web 应用服务器与后台 DB2 数据库做数据操作时的连接数,如果参数太小,当并发用户数太大时,会导致后台响应异常。
- Webform Server
在 WAS 的 JDBC 数据源中,找到 WebformAccessControlServerdataSource,修改其连接池属性中的最大连接数。建议将此最大连接数设置为和并发用户量相等且不超过 100 的数值。
图 1. Webform Server 设置数据源
- Turbo
Turbo 中包含 Webform Server,除了以上调优之外,其自身的调优类似于 Webform Server,但 Turbo 在 WebSphere 应用服务器中的数据源有两个,分别是:TotalForms_JCR_DB2_DataSource 和 TotalForms_Submission_DB2_DataSource,建议将此最大连接数设置为和并发用户量相等且不超过 100 的数值。值得注意的是,由于 Turbo 采用的是 WebSphere 应用服务器 Express 版,用户无法从 Web 管理控制台中设置,必须手动修改配置文件,数据源的配置文件位于类似 /opt/IBM/LotusForms/Turbo/3.5/WebSphere/profiles/AppSrv01/config/cells/[cellName]/nodes/[nodeName]/servers/server1/resource.xml 的路径中。
线程池
调整 Turbo 和 Webform Server 在 WebSphere 应用服务器中 Web Container 的线程池大小,该参数关系到 Web 应用服务器处理前端并发用户的线程数,如果参数太小,当并发用户数太大时,会导致后台响应异常。
- Webform Server
进入 TranslatorServer 的配置中,修改线程池属性。对于除 Linux 以外的系统,我们建议将 WebContainer 的最大大小设置为并发用户量 -20 到并发用户量 +20 之间的数值,最小值不变。并且还要选中允许线程分配超过最大线程值。但是对于 Linux 系统,必须将最大值和最小值设置成一致的,并且去掉允许线程分配超过最大线程值,否则 Server 会有严重的内存泄漏问题。由于对 Linux 限制了超过最大线程大小,所以在设置线程最大和最小时,最好选择并发用户量到并发用户量 +20 之间的数值。
图 2. Webform Server 设置线程参数
- Turbo
除了包括以上调优之外,Turbo 的调优类似于 Webform Server,用户无法从 Web 管理控制台中设置,必须手动修改配置文件,数据源的配置文件位于类似 /opt/IBM/LotusForms/Turbo/3.5/WebSphere/profiles/AppSrv01/config/cells/[cellName]/nodes/[nodeName]/servers/server1/server.xml 的路径中。
Java 虚拟机
根据并发用户的使用情况设置 Turbo 和 Webform Server 在 WebSphere 应用服务器堆初始值、最大值,包括一般情况、特定操作系统和 Forms 特定功能下的特殊调优。由于 Turbo 和 Webform Server 都是运行于 WebSphere 应用服务器之上,所以 Java 占用堆的大小直接关系到相关 Web 应用能否承受一定的并发请求。
- Webform Server
进入 WAS TranslatorServer 中 Java 虚拟机的参数配置。在打印操作多用户并发量少的情况下,建议将初始堆大小设置为 256,最大堆大小设置成 512. 如果打印操作并发量多,尤其是采用 GIF 和 PNG 模式打印的情况下,建议增大最大堆大小,但是最大最好不要超过 1024M。
图 3. Webform Server 设置 Java 堆大小
- Turbo
由于 Turbo 是 Lotus Forms 产品家族的缩微版,包含了太多功能,因此占用的 Java 内存比较大,建议把初始堆大小至少设为 256M,否则用户操作的响应时间会较长,并且可以随着并发用户数增加初始堆的大小,最大堆大小设为 1024 或 768M,手动配置文件位于 /opt/IBM/LotusForms/Turbo/3.5/WebSphere/profiles/AppSrv01/config/cells/[cellName]/nodes/[nodeName]/servers/server1/server.xml。
属性文件
Webform Server(同样适用于 Turbo)属性文件位置可以参照路径 \Server\3.5\WebformServer\Translator\translator.properties。修改此文件里的参数对 TranslatorServer 的性能有着非常重要的作用。需要注意的是,修改了此属性文件后,需要重启 TranslatorServer 后才可以生效。
- fcCacheSize
这个参数表示在内存所缓存的表单实例数,默认值是 30。建议设置为并发用户量 +10。
<entry key="fcCacheSize">70</entry>
- maxPrintProcesses
这个参数表示允许的最大的并发打印数量,默认值为 3. 由于打印操作对内存等资源消耗很大,所以如果此 TranslatorServer 不是仅仅做打印操作,而还有很多其他的典型操作,如保存、提交等,建议不要将此值不要超过 5。在并发打印用户超过此处设置的最大限制时,用户会看到服务器忙的提示。
问题诊断
本节主要介绍了在运行 Lotus Forms 产品时问题诊断的方法和步骤。
数据收集
- 产品日志
对于 Webform Server 来说,它有自己的 Log Server,在运行程序的时候请务必确认 LogServer 已经开启,这样才会对 TranslatorServer 在工作期间所有的动作和错误进行记录。LogServer 记录的日志的位置可参照 *\Server\3.5\WebformServer\LogServer\logs。其中主要包含 3 个目录:porltet、servlet 和 translator。如果您是基于 Lotus Forms 提供的 Framework 做的 Portlet 或者 Servlet 的二次开发,那么相关的日志就会记录在这 portlet 或 servlet 目录中,而 TranslatorServer 本身的日志是记录在 tranlator 这个目录下的。
- 应用服务器日志
由于 Webform Server 和 Turbo 都是运行于 WebSphere 应用服务器之上,因此可以分别从对应 Profile 下面的 Translator 和 Server1 目录下的 SystemOut 和 SystemErr 文件中查看运行日志,其中包含了 Web 应用在运行时 Java 抛出的各种异常,比如硬盘空间不够等等,用户通过查看应用服务器日志,可以简单的分析出比较明显的问题,对于比较复杂或者函数调用层次较深的异常则可以提供给产品支持工程师。
针对 WebSphere 修改日志大小参数,把日志文件大小设为 100M,文件数为 10 个,这样可以获取最多 1G 的日志。同时,还要打开 GC 收集功能,确保可以监控 Java 内存占用的趋势,在必要的时候抓取 Java Heapdump 和 JavaCore 文件。
- 操作系统资源
由于 Webform Server 和 Turbo 的底层使用 C 语言编写,因此仅仅监控 Java 内存占用是不够的,还需要监控操作系统层面 Java 进程的 CPU 利用率、内存。Widnows 采用 perfmon 工具,非 Windwos 平台采用 svmon、ps 等命令。通过监控日志可以比较出内存等方面的异常。有很多解决方案是在 Webform Server 或者 Turbo 的基础上做二次开发,有些时候需要分析内存泄露出自于产品本身还是二次开发的代码,因此两种日志缺一不可。
常见问题
- 通过 Webform Server 打开带有中文字体的表单时,中文无法显示或者是乱码。
这证明 Webform Server 没有获得中文的字体,在这种情况下,需要先去检查 Webform Server 的属性文件,找到 fontDirectory 这个属性。这个属性就指示了 Webform Server 读取字体文件的路径。您可以将需要用到的中文字体文件,拷贝进入这个目录,重启 TranslatorServer 即可。特别值得注意的是,当您拷贝字体文件的时候,请仅仅拷贝自己需要的字体文件,因为导入过多的字体文件会在某些方面降低 TranslatorServer 的性能。
- Linux 操作系统上,内存泄漏严重。
参见 Webform Server 在线程池上的配置。
- Webform Server 的 error.xml 错误日志中经常提示在 formcache 中无法载入表单
方法 1:检查 operational.xml 操作日志中,是否经常有 purge 操作。如果有的话,则是因为属性文件中 fcCacheSize 设置的过小,增大该参数到并发用户量 +10。重启 TranslatorServer。
方法 2:在这种情况之前是否发生过 Server crash。如果发生过,且发生无法载入的表单的实例号总是重复的几个,可以进入数据库中删除掉所有 WS 开头的表,同时进入到 SharedFileCache 目录下,将所有的以实例号为名字的目录删除。重启 TranslatorServer。
问题分析步骤
如果是直接使用 Lotus Forms 产品出现问题,需要确认 Forms 产品是否可以正常工作,检查 Webform Server 自带的 error.xml 日志、WebSphere 应用服务器后台 SystemOut 和 SystemErr 日志、Java 内存、CPU 使用率是否出现异常,如果是硬盘空间不足或者内存不够等配置问题,用户可以自己解决,如果是其他异常,则需要把日志报告给相关产品部门解决。
如果是二次开发时出现问题,则还要确认 WebSphere 应用服务器中的日志:异常来源于产品本身还是二次开发的代码?内存泄露的对象来自于产品本身还是二次开发的代码?这需要对比 Java GC 日志和 Java 进程内存占用情况。
结束语
本文基于产品系统测试和客户支持的经验,总结了在诊断和调优 Lotus Forms 服务器端组件的建议,作为客户和合作伙伴的参考指南。
参考资料
作者简介  | |  | 崔康,现就职于 IBM 中国软件开发中心,主要从事 Web 应用性能测试方面的工作,感兴趣的领域包括 Web 性能诊断与调优、Java 虚拟机等。 |
 | |  | 张冰冰,现就职于 IBM 中国软件开发中心。2007 年开始从事 Lotus Forms 项目的 SVT 测试,积累了很多关于 Lotus Forms 产品调优和诊断的经验。主要从事 Web 应用性能测试方面的工作,感兴趣的领域包括 Web 性能诊断与调优、内存泄漏诊断等。 |
对本文的评价
|