部署 IBM Lotus Connections: 安装后的调优

本文是系列文章(共 6 篇文章)的第 2 部分,将讨论 IBM Lotus Connections 的部署,重点讨论安装后的调优技巧,从而确保所作部署不会受困于常见的性能缺陷。通过本文了解专家推荐的完成 Lotus Connections 初始安装之后应执行的操作。

Luis Benitez, 高级 I/T 专家, EMC

Luis Benitez 是 IBM Software Services for Lotus 的高级 I/T 专家。Luis 从 2007 年 1 月 开始从事 IBM Lotus Connections 的早期适配器客户部署工作。他于 2004 年初加入 IBM Software Services,在此之前就职于 IBM Lotus LearningSpace 和 IBM Lotus Learning Management 系统产品开发小组。您可以通过 Luis_Benitez@us.ibm.com 与 Luis 联系。



2007 年 8 月 20 日

本文介绍了完成 IBM Lotus Connections 安装之后所使用的一些最常用步骤。在较高的层面上,考虑了 Lotus Connections 运行所需要的各种组件:数据库、LDAP 目录、Web 服务器和应用服务器。本文还对一些常见的调优参数进行了概述,有助于客户和 I/T 专家了解哪些配置属性能够影响系统的总体性能。

简介

本文扼要地介绍了一些可供选择的安装后任务,但是强烈推荐使用这些任务以改善 Lotus Connections 部署的性能。本文涵盖了用于单独优化各种基础设施组件性能的技巧。尽管本文是针对 Lotus Connections 进行讨论的,但大多数技巧适用于任何 J2EE Web 应用程序。

所推荐的操作实践阐明了如何优化 Web 服务器、应用服务器、LDAP 服务器和数据库服务器的性能。


优化 Web 服务器性能

本节所讨论的技巧将确保 HTTP 服务器不会引起 Lotus Connections 部署瓶颈。

插件优化

IBM WebSphere Application Server 将生成 Web 服务器插件。例如,对于 IBM HTTP Server,该文件通常位于 \<IHS_INSTALL_ROOT>\Plugins\config\webserver1\plugin-cfg.xml。该插件的前两行类似于清单 1 所示代码。

清单 1.Plugin-cfg.xml 优化
<Config ASDisableNagle="false" AcceptAllContent="false" AppServerPortPreference=
"HostHeader" ChunkedResponse="false" FIPSEnable="false" IISDisableNagle="false" 
IISPluginPriority="High" IgnoreDNSFailures="false" RefreshInterval="60" 
ResponseChunkSize="64" VHostMatchingCompat="false">
     <Log LogLevel="Error" 
Name="C:\IBM\HTTPServer\Plugins\logs\webserver1\http_plugin.log"/>

请注意清单中以粗体显示的元素。首先,RefreshInterval 参数将告知 Web 服务器过多长时间需要重新载入一次插件。在多个应用服务器上部署大量应用程序时,上述信息是很有用的。如果应用程序部署是受限的,则相应地调整该参数。默认情况下,该值设置为 60 秒。比较好的设置值为 3600 秒(或 1 个小时)。

第二,LogLevel 参数将把日志输入的详细程度告知 Web 服务器。默认情况下,该级别设置为 Error,并且应保持与生产过程中一样的详细程度。Trace 值将大大降低 Web 服务器的性能,尽管它将提供最高级别的日志输出;该值在故障检修中是很用的。

日志优化

如果使用 IBM HTTP Server 作为 Web 服务器,请注意 Web 服务器所请求的每一个文件都会被记入文件系统日志。这意味着用户每次访问页面时,所有对图像、CSS 文件、JSP、HTML 等的请求都会被记入日志。随着 Lotus Connections 用户的增加,这个日志文件会显著增大,将消耗更多磁盘空间并减慢向用户传递内容的过程。

若要避免这种潜在瓶颈,请执行以下步骤:

  1. 以 Administrator 身份登录 Web 服务器。
  2. 打开 IHS config directory(例如 /opt/IBMHttpServer/conf)。
  3. 保存 httpd.conf 文件的副本。
  4. 使用您喜欢的文本编辑器打开 httpd.conf。
  5. 找到以下一行代码:
    CustomLog logs/access.log common 然后将其更改为:
    #CustomLog logs/access.log common

将该行代码变为注释后,即通知 Web 服务器不要再将所有请求保存到文件系统。

将静态元素移至 Web 服务器

部署中的每个服务器都有一个特定用途。Lotus Connections 所使用的 LDAP 目录专用于存储其他企业应用程序所需要的数据。数据库服务器仅供存储应用程序数据使用。而 Web server 仅供静态内容使用并用作应用服务器的代理。

应用服务器(在这里是 WebSphere Application Server)是运行 Lotus Connections 核心的位置;它包含所有应用程序和业务逻辑。将在应用服务器上进行数据库查询,还将在这里操作并组织数据以供展示。应用服务器上也保存了用于动态构建数据视图的逻辑。同样,它可以使用大量处理循环。

但是,通常会使用应用服务器为如图像、层叠样式表、JavaScript 文件等静态内容(即内容不发生更改)提供服务。不要使用 Web 服务器为静态内容提供服务,因为静态内容不会发生更改,而 Web 服务器是专门通过网络存储静态内容并提供服务的。

在应用服务器上保存静态内容时,还需要比较大的网络带宽。在这种情况下,需要将静态内容从应用服务器发送到 Web 服务器,然后 Web 服务器将该内容转发给用户。这里没有必要将 Web 服务器用作中间人。

因此,若要改善性能,则将更多静态 Web 内容移至 Web 服务器。或者,使用缓存代理,从而避免每次从应用服务器获取静态元素。

Lotus Connections 将分配它的静态内容,作为每个特性(例如,Profiles 特性)的一部分。以下章节将讨论在没有使用缓存代理的情况下,如何将静态内容移至每个 Lotus Connections 特性的 Web 服务器上。我们假定应用服务器和 Web 服务器位于两个独立的物理服务器上。否则,以下步骤不会提供任何有意义的性能收益。


Activities 的静态内容

若要将 Activities 特性的静态内容从应用服务器移至 Web 服务器,请执行以下步骤:

  1. 以 Administrator 身份登录 Web 服务器。
  2. 打开 IBM HTTP Server DocumentRoot 目录(例如,/opt/IBMHttpServer/htdocs/en_US)。
  3. 创建名为 activities 的目录。
  4. 在所创建的目录中,创建一个名为 nav 的子目录。现在应具有以下目录结构:
    /opt/IBMHttpServer/htdocs/en_US/activities/nav
  5. 将 images 和 templates 目录从应用服务器的
    /opt/WAS/profiles/<profileName>/installedApps/<cellName>/Activities.ear/sn-nav.war
    复制到步骤 4 中所创建的 /activities/nav 文件夹中。还需要复制 sn-nav.war 目录中所有 HTML 和 GIF 文件,如图 1 所示。
图 1. 将 Activities 目录下 navbar 中的静态内容复制到 Web 服务器
将 Activities 目录下 navbar 中的静态内容复制到 Web 服务器
  1. 打开通常位于 /<IHS_INSTALL_ROOT>/Plugins/config/webserver1 中的 plugin-cfg.xml。
  2. 找到以下代码:

    <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" Name="/activities/nav/*"/>


    然后用清单 2 中的代码替换上述代码。
清单 2. 用于优化 Activities Nav Bar 的 Plugin-cfg.xml
 <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
 Name="/activities/nav/header.js"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/activities/nav/custom.css"/>
  1. 已经将 Activities navigation bar (navbar) 的静态文件复制到 Web 服务器。必须对 Activities 静态内容的其他部分执行以上步骤。
  2. 将以下目录从应用服务器的 /opt/WAS/profiles/<profileName>/installedApps/<cellName>/Activities.ear/oawebui.war 复制到步骤 4 中所创建的 /activities 文件夹:activities_help、activities_help_old、images、images_old、javascript、javascript3、movie、rte 和 stylesheet 目录。
  3. 打开通常位于 /<IHS_INSTALL_ROOT>/Plugins/config/webserver1 中的 plugin-cfg.xml 文件。
  4. 找到以下代码:

    <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" Name="/activities/*"/>

    然后用清单 3 中的代码替换上述代码。
清单 3. 用于优化 Activities 应用程序的 Plugin-cfg.xml
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/activities"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/activities/"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/activities/j_security_check"/>

<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/activities/*.jsp"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/activities/auth/*"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/activities/bookmarklets/*"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/activities/email/*"/>
 <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
 Name="/activities/error/*"/>
 <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
 Name="/activities/firefox/*"/>
 <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
 Name="/activities/notesplugin/*"/>
 <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
 Name="/activities/templates/*"/>
 <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
 Name="/activities/service/*"/>

现在已经将所有 Activities 静态内容复制到 Web 服务器,如图 2 所示。对插件进行了配置,仅将某些流量转发到应用服务器(例如 *.jsp)。需要对其他 Lotus Connections 特性进行类似处理,以下章节将进行简要介绍。

图 2. 将 Activities 静态内容复制到 Web 服务器
将 Activities 静态内容复制到 Web 服务器

Blogs 的静态内容

若要将 Blogs 特性的静态内容从应用服务器移至 Web 服务器,请执行以下步骤:

  1. 在 Web 服务器的文档根下创建名为 blogs 的目录。
  2. 在所创建的目录中,创建一个名为 nav 的子目录。 现在应具有以下目录结构:/opt/IBMHttpServer/htdocs/en_US/blogs/nav。
  3. 将 images 和 templates 目录从应用服务器的
    /opt/WAS/profiles/<profileName>/installedApps/<cellName>/Blogs.ear/sn-nav.war
    复制到步骤 2 中所创建的 /blogs/nav 文件夹中。还需要复制 sn-nav.war 目录中所有 HTML 和 GIF 文件。
  4. 打开通常位于 /<IHS_INSTALL_ROOT>/Plugins/config/webserver1 中的 plugin-cfg.xml。
  5. 找到以下代码:

    <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" Name="/blogs/nav/*"/>

    用清单 4 中的代码替换上述代码。
清单 4. 用于优化 Blogs Nav Bar 的 Plugin-cfg.xml
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/blogs/nav/header.js"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/blogs/nav/custom.css"/>
  1. 将 images、roller-ui、theme 和 themes 目录从应用服务器的
    /opt/WAS/profiles/<profileName>/installedApps/<cellName>/Blogs.ear/blogs.war
    复制到步骤 2 中所创建的 /blogs 文件夹中。还需要复制 blogs.war 目录中的 favicon.ico 和 robots.txt。
  2. 打开通常位于 /<IHS_INSTALL_ROOT>/Plugins/config/webserver1 中的 plugin-cfg.xml。
  3. 找到以下代码:

    <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" Name="/blogs/*"/>

    然后用清单 5 中的代码替换上述代码。
清单 5. 用于优化 Blogs 应用程序的 Plugin-cfg.xml
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/blogs"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/blogs/"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/blogs/j_security_check"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/blogs/home/*"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/blogs/services/*"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/blogs/*.jsp"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/blogs/*.do"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/blogs/comments/*"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/blogs/language/*"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/blogs/resources/*"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/blogs/rsd/*"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/blogs/flavor/*"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/blogs/rss/*"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/blogs/atom/*"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/blogs/page/*"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/blogs/search/*"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/blogs/xmlrpc/*"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/blogs/editor/*"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/blogs/admin/*"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/blogs/planetrss/*"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/blogs/roller-ui/*.jsp"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/blogs/roller-ui/authoring/preview/*"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/blogs/roller-ui/authoring/previewresource/*"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/blogs/roller-ui/authoring/thumbnail/*"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/blogs/roller-ui/authoring/userdata/*"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/blogs/roller-ui/blog/*"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/blogs/roller-ui/myblogs/*"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/blogs/roller-ui/rendering/*"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/blogs/roller-services/*"/>

Communities 的静态内容

若要将 Communities 特性的静态内容从应用服务器移至 Web 服务器,请执行以下步骤:

  1. 在 Web 服务器的文档根下创建名为 communities 的目录。
  2. 在所创建的目录中,创建一个名为 nav 的子目录。现在应具有以下目录结构:
    /opt/IBMHttpServer/htdocs/en_US/communities/nav.
  3. 将 images 和 templates 目录从应用服务器的
    /opt/WAS/profiles/<profileName>/installedApps/<cellName>/Communities.ear/sn-nav.war
    复制到步骤 2 中所创建的 /communities/nav 文件夹中。还需要复制 sn-nav.war 目录中的所有 HTML 和 GIF 文件。
  4. 打开通常位于 /<IHS_INSTALL_ROOT>/Plugins/config/webserver1 中的 plugin-cfg.xml。
  5. 找到以下代码:

    <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" Name="/communities/nav/*"/>

    然后用清单 6 中的代码替换上述代码。
清单 6. 用于优化 Communities Nav Bar 的 Plugin-cfg.xml
 <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
 Name="/communities/nav/header.js"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/communities/nav/custom.css"/>
  1. 将 help、images、javascript、movies、rte 和 stylesheets 目录从应用服务器的
    /opt/WAS/profiles/<profileName>/installedApps/<cellName>/Communities.ear/tango.web.ui.war
    复制到步骤 2 中所创建的 /communities 文件夹。
  2. 打开通常位于 /<IHS_INSTALL_ROOT>/Plugins/config/webserver1 中的 plugin-cfg.xml。
  3. 找到以下代码:

    <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" Name="/communities/*"/>

    然后用清单 7 中的代码替换上述代码。
清单 7. 用于优化 Communities 应用程序的 Plugin-cfg.xml
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/communities"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/communities/"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/communities/j_security_check"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/communities/*.jsp"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/communities/*.do"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/communities/service/*"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/communities/javlin/*"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/communities/xmlProxy/*"/>

Dogear 的静态内容

若要将 Dogear 特性的静态内容从应用服务器移至 Web 服务器,请执行以下步骤:

  1. 在 Web 服务器的文档根下创建名为 dogear 的目录。
  2. 在所创建的目录中,创建一个名为 nav 的子目录。现在应具有以下目录结构:/opt/IBMHttpServer/htdocs/en_US/dogear/nav。
  3. 将 images 和 templates 目录从应用服务器的
    /opt/WAS/profiles/<profileName>/installedApps/<cellName>/Dogear.ear/sn-nav.war
    复制到步骤 2 中所创建的 /dogear/nav 文件夹中。还需要复制 sn-nav.war 目录中所有 HTML 和 GIF 文件。
  4. 打开通常位于 /<IHS_INSTALL_ROOT>/Plugins/config/webserver1 中的 plugin-cfg.xml。
  5. 找到以下代码:

    <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" Name="/dogear/nav/*"/>

    然后用清单 8 中的代码替换上述代码。
清单 8. 用于优化 Dogear Nav Bar 的 Plugin-cfg.xml
 <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
 Name="/dogear/nav/header.js"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/dogear/nav/custom.css"/>
  1. 将 favicon、h3、misc、rte、script、scriptaculous 和 tools 目录从应用服务器的
    /opt/WAS/profiles/<profileName>/installedApps/<cellName>/Dogear.ear/dogear.webui.war
    复制到步骤 2 中所创建的 /dogear 文件夹。还需要复制 dogear.webui.war 文件夹中的 favicon.ico。
  2. 打开通常位于 /<IHS_INSTALL_ROOT>/Plugins/config/webserver1 中的 plugin-cfg.xml。
  3. 找到以下代码:

    <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" Name="/dogear/*"/>

    然后用清单 9 中的代码替换上述代码。
清单 9. 用于优化 Dogear 应用程序的 Plugin-cfg.xml
      <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
      Name="/dogear"/> 
      <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
      Name="/dogear/"/> 
      <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
      Name="/dogear/j_security_check"/> 
	  <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
	  Name="/dogear/auth/j_security_check"/> 
      <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
      Name="/dogear/*.jsp"/> 
      <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
      Name="/dogear/logout/*"/> 
      <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
      Name="/dogear/post/*"/> 
      <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
      Name="/dogear/delete/*"/> 
      <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
      Name="/dogear/html/*"/> 
      <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
      Name="/dogear/tabtags/*"/> 
      <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
      Name="/dogear/tabpeople/*"/> 
      <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
      Name="/dogear/tabsubs/*"/> 
      <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
      Name="/dogear/toolbox/*"/> 
      <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
      Name="/dogear/about/*"/> 
      <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
      Name="/dogear/help/*"/> 
      <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
      Name="/dogear/linkroll/*"/> 
      <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
      Name="/dogear/click/*"/> 
      <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
      Name="/dogear/atom/*"/> 
      <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
      Name="/dogear/atomclick/*"/> 
      <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
      Name="/dogear/json/*"/> 
      <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
      Name="/dogear/xbel/*"/> 
      <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
      Name="/dogear/snippet/*"/> 
      <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
      Name="/dogear/jsclick/*"/> 
      <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
      Name="/dogear/lisnippet/*"/> 
      <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
      Name="/dogear/api/*"/> 
      <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
      Name="/dogear/export/*"/> 
      <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
      Name="/dogear/count/*"/> 
      <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
      Name="/dogear/tagsets/*"/> 
      <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
      Name="/dogear/tags/*"/> 
      <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
      Name="/dogear/tagslike/*"/> 
      <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
      Name="/dogear/peoplelike/*"/> 
      <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
      Name="/dogear/favicon/*"/>

Profiles 的静态内容

若要将 Profiles 特性的静态内容从应用服务器移至 Web 服务器,请执行以下步骤:

  1. 在 Web 服务器的文档根下创建名为 profiles 的目录。
  2. 在所创建的目录中,创建一个名为 nav 的子目录。现在应具有以下目录结构:/opt/IBMHttpServer/htdocs/en_US/profiles/nav.
  3. 将 images 和 templates 目录从应用服务器的
    /opt/WAS/profiles/<profileName>/installedApps/<cellName>/peoplepages.ear/sn-nav.war
    复制到步骤 2 中所创建的 /profiles/nav 文件夹中。还需要复制 sn-nav.war 目录中的所有 HTML 和 GIF 文件。
  4. 打开通常位于 /<IHS_INSTALL_ROOT>/Plugins/config/webserver1 中的 plugin-cfg.xml。
  5. 找到以下代码:

    <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" Name="/profiles/nav/*"/>

    然后用清单 10 中的代码替换上述代码。
清单 10. 用于优化 Profiles Nav Bar 的 Plugin-cfg.xml
 <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid"
 Name="/profiles/nav/header.js"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/profiles/nav/custom.css"/>
  1. 将 css、demo_movie、help、images 和 javascript 目录从应用服务器的
    /opt/WAS/profiles/<profileName>/installedApps/<cellName>/peoplepages.ear/peoplepages.war
    复制到步骤 2 中所创建的 /profiles 文件夹。
  2. 打开通常位于 /<IHS_INSTALL_ROOT>/Plugins/config/webserver1 中的 plugin-cfg.xml。
  3. 找到以下代码:

    <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" Name="/profiles/*"/>

    然后用清单 11 中的代码替换上述代码。
清单 11. 用于优化 Profiles 应用程序的 Plugin-cfg.xml
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/profiles"/> 
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/profiles/"/> 
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/profiles/j_security_check"/> 
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/profiles/*.jsp"/> 
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/profiles/*.do"/> 
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/profiles/html/*"/>

优化 WebSphere Application Server 性能

基础设施中最具挑战性的部分之一就是应用服务器的性能调优。每个部署的使用各不相同,并且均需要进行不同设置,从而确保优化服务器性能。通常,推荐在进行生产上线测试之前先进行载入测试,将使用一组特定用例对产品进行测试。IBM Tivoli Performance Viewer 经常被用于监视各种资源(例如,Thread Pool、JDBC Connection Pool、内存使用等)。经过各种测试运行,即对应用服务器进行了成功调优。

从 WebSphere Application Server 6 开始,将嵌入 Tivoli Performance Viewer 作为管理控制台的一部分。请参考 WebSphere Application Server InfoCenter,获取有关如何使用 Tivoli Performance Viewer 的信息。

本节涵盖了一些基本建议,有助于您从应用服务器得到最多收益。应以这些建议为起点。参考资料部分包含一些文档链接,这些文档是专为调优 WebSphere Application Servers 而编写的。

内存使用

如果在一个节点(即,一个物理服务器)的不同应用服务器实例上运行 Lotus Connections 的 5 个特性,请确保为每个应用服务器分配了足够内存,从而避免各服务之间发生冲突。例如,在一个具有 4GB RAM 的服务器上,每个服务最多可分配 512MB 的 RAM。内部测试表示如果大于 512 MB 的话,会降低性能,因为 Java Virtual Machine (JVM) 将更多时间花费在垃圾收集上。

为了解决上述问题,登录到 WebSphere Application Server Administrative Console(例如 http://yourserver.acme.com:9060/ibm/console),然后选择 Application Servers - <serverName> - Java 和 Process Management - Process Definition - Java Virtual Machine。另外,将 Initial Heap Size 和 Maximum Heap Size 设置为相同值,从而避免不必要的垃圾收集,如图 3 所示。

图 3. ActivitiesServer 的Java Virtual Machine 设置
ActivitiesServer 的Java Virtual Machine 设置

对每个应用服务器执行以上操作。

连接池

如果发现应用程序响应变慢,但处理器使用比较低,可能是没有足够的可用连接用于执行数据库查询。默认情况下,每个数据库的最大连接数目是 10。根据 Lotus Connections 部署的使用方式,可以增大某个特定特性的最大连接数目。

例如,如果某个特定特性上有大量并发用户,则需要修改相应的 JDBC Data Source,从而增大最大连接数目。对于负载量为 100-500 个并发用户来说,比较适宜的 Maximum connections 初始值为 30。如果期望 1000 个并发用户,将该参数设置为 50。确定该值是否需要调优的最佳方法是使用 Tivoli Performance Viewer。

另外,将最小连接数目设置为 15。这样使得服务器可以在启动后立即创建处理大量并发用户所必需的连接。

若要更改该值,登录 WebSphere Application Server Administrative Console,然后选择 Resources - JDBC - Data Sources - <dsName> - Connection pool 属性。参见图 4。

图 4. activities 数据源的 JDBC Connection pool 设置
activities 数据源的 JDBC Connection pool 设置

最后一点注意事项:确保正确配置了数据库服务器,以便处理每个数据库的特定连接数目。查看数据库提供商文档,学习如何配置该参数。

线程池

如果响应时间比较慢,处理器使用也比较低,可能是服务器没有足够的线程用于处理输入请求。假定有大量并发用户(例如,2000 个),比较适宜的 Maximum thread count 初始值为 100。该值至少应与所指定的最大 JDBC Connection pool 大小相同。若要设置 thread pool 大小,则登录 WebSphere Application Server Administrative Console,然后选择 Application Servers - <serverName> - Thread Pools - Web Container。

图 5. ActivitiesServer 的 WebContainer 的 Thread pool 设置
ActivitiesServer 的 WebContainer 的 Thread pool 设置

注意:Web 服务器有一个 thread pool 设置,且两个服务器应互相实现。否则,您会发现自己将面临这样一种情况,应用服务器准备处理更多请求,但 Web 服务器没有足够多的线程用于将流量转发到应用服务器,反之亦然。在 IBM HTTP Server 中,该设置被称为 ThreadsPerChild,并在 httpd.conf 文件中进行配置。


优化 LDAP 性能

若要了解哪些因素将影响 LDAP 服务器的性能,首先必须了解 Lotus Connections 是如何使用 LDAP 服务器的。各种特性取决于保存用户身份验证和信息的 LDAP 目录。Lotus Connections 将在相应数据库中从本地缓存用户信息。这种方法将改善性能,因为在检索如姓、名和电子邮件地址等用户信息时,Lotus Connections 不必直接连接到 LDAP 服务器。

另外,每个 LDAP 目录提供商都支持性能调优机制。例如,某些机制允许您在数据上创建索引,而其他机制能够配置缓存和缓冲选项。本节将讨论为 Lotus Connections 所使用数据正确创建索引的推荐步骤。

Profiles 导入的索引属性

与其他 Lotus Connections 特性相比,Profiles 特性更需要 LDAP 服务器。默认情况下,用户信息将周期性地从 LDQP 服务器导入 Profiles 数据库。Profiles 特性将使用 IBM Tivoli Directory Integrator Assembly Line,它将从指定了搜索过滤器的 LDAP 服务器提取用户信息。搜索过滤器是 LDAP 搜索引擎的输入,它定义了要查找的内容。

例如,某个搜索过滤器如下所示:

(&(ou=Americas)(objectclass=inetOrgPerson).

假定使用上述示例搜索过滤器,这样 Tivoli Directory Integrator 将搜索 LDAP 存储库中的所有对象,然后返回具有 ou=Americas 和 objectclass=inetOrgPerson 属性的对象。那么,根据搜索过滤器所指定的属性对 LDAP 存储库创建索引是至关重要的。如果在这些属性上不存在索引,LDAP 查找会变得比较慢。

有关如何配置 LDAP 的特定属性并为其创建索引的更多信息,请参考特定于提供商的文档。

登录的索引属性

另一个重要的索引属性是登录属性,通常是 uid 或邮件。对这些属性进行索引将加快登录过程。

有关如何配置 LDAP 的特定属性并为其创建索引的更多信息,请参考特定于提供商的文档。


优化数据库性能

每个数据库都有非常特殊的参数,这些参数取决于运行数据库的操作系统。在部署 Lotus Connections 数据库时,请牢记以下一些技巧:

  • 连接池。确保您的数据库能够处理数据源连接池中所指定的连接数目。默认情况下,将每个数据源配置为最多使用 10 个连接。如果所有特性的数据库都位于一个数据库服务器上,那么确保它可以处理至少 50 个连接。
  • 硬盘使用。另外,如果所有特性使用相同数据库,可以考虑将每个数据库部署到单独的物理硬盘。

参考资料 部分包含一些文档链接,这些文档是专为调优 DB2 和 Oracle 数据库而编写的。


结束语

本文讨论了不同组件的性能优化,这些组件是 Lotus Connections 基础设施所必需的组件。对于 Web 服务器,本文强调了如何优化插件、日志以及将静态元素从应用服务器移至 Web 服务器。本文还讨论了如何在应用服务器上配置内存、线程池和 JDBC 连接池的初始值。对于 LDAP 服务器,非常重要的是为登录和可搜索属性创建索引。最后,给出了在调优数据库服务器时需要考虑的一些技巧。

参考资料

学习

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Lotus
ArticleID=249316
ArticleTitle=部署 IBM Lotus Connections: 安装后的调优
publish-date=08202007