Deploying IBM Lotus Connections: Post-installation tuning

This article, part 2 in a seven-part series about deploying IBM Lotus Connections, focuses on post-installation tuning tips to ensure that your deployment does not suffer from common performance pitfalls. Learn from an expert on recommended practices to perform after the initial installation of Lotus Connections is complete.

Luis Benitez, Consulting IT Specialist, IBM

Luis Benitez is a Consulting IT Specialist with IBM TechWorks. Luis leads the Lotus Connections community within IBM and has been working on early adopter customer deployments of Lotus Connections since January 2007. Luis joined IBM TechWorks in early 2008, and prior to that he worked as a consultant for IBM Software Services for Lotus. You can reach Luis at Luis_Benitez@us.ibm.com.


developerWorks Contributing author
        level

11 September 2007 (First published 07 August 2007)

Also available in Chinese Russian Japanese

This article covers some of the most common steps to follow after you install IBM Lotus Connections. At a high level, it takes into consideration all the different components required to run Lotus Connections: database, LDAP directory, Web server, and application server. Some common tuning parameters are outlined in this article to help customers and I/T specialists understand which configuration attributes could affect the overall performance of the system.

Introduction

This article outlines some post-installation tasks that are optional, but that are strongly recommended to improve the performance of a Lotus Connections deployment. This article covers tips to individually optimize the performance of the different infrastructure components. Although this article is specific to Lotus Connections, most tips apply to any J2EE Web application.

The recommended practices illustrate how to optimize the performance of the Web server, application server, LDAP server, and database server.


Optimizing Web server performance

This section contains various tips to ensure that the HTTP server does not cause a bottleneck for your Lotus Connections deployment.

Plug-in optimization

IBM WebSphere Application Server generates a plug-in for your Web server. For example, for the IBM HTTP Server, this file is usually located on \<IHS_INSTALL_ROOT>\Plugins\config\webserver1\plugin-cfg.xml. The first two lines of the plu-in should be similar to the code shown in listing 1.

Listing 1.Plugin-cfg.xml optimization
<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"/>

Note the elements in bold in the code listing. First, the RefreshInterval parameter tells the Web server how often the plug-in needs to be reloaded. This information is useful when a lot of applications are being deployed across multiple application servers. If application deployment is limited, though, then adjust this parameter accordingly. By default, the value is set to 60 seconds. A good production value is 3600 seconds (or one hour).

Second, the LogLevel parameter tells the Web server how detailed the logging output should be. By default, the level is set to Error, and it should be left as is in production. A value of Trace significantly degrades the performance of the Web server, although it provides the highest level of logging output, which is useful during troubleshooting.

Logging optimization

If you use IBM HTTP Server as your Web server, be aware that by default every file requested from the Web server is logged to the file system. This means that every time a user visits a page, the request for all images, CSS files, JSPs, HTMLs, and so on is logged. As more and more users use Lotus Connections, this log file grows significantly, consuming disk space and slowing down the process of delivering content to users.

To avoid this potential bottleneck, follow these steps:

  1. Log on as Administrator to the Web server.
  2. Open the IHS config directory (for example, /opt/IBMHttpServer/conf).
  3. Save a copy of the httpd.conf file.
  4. Open httpd.conf with your favorite text editor.
  5. Find the following line:

    CustomLog logs/access.log common
    And change it to:

    #CustomLog logs/access.log common

By commenting this line out, you instruct the Web server to no longer save all requests to the file system.

Moving static elements to the Web server

Each server in your deployment topography has a specific purpose. Lotus Connections uses the LDAP directory exclusively to store data needed by other enterprise applications. The database server is used exclusively to store application data. The Web server is used exclusively to serve static content and serve as a proxy to the application server.

The application server, in this case WebSphere Application Server, is where the core of Lotus Connections runs; it contains all the application and business logic. Queries to the database are made from the application server, and data is manipulated and organized for presentation there as well. The application server also holds the logic to dynamically build views of the data. As such, it can use a lot of processing cycles.

The application server, however, is often used to serve static content (that is, content that does not change), such as images, cascading style sheets, JavaScript files, and so on. Static content should be served by a Web server because it doesn’t change and because the Web server is specifically designed to store and serve static content over a network.

When static content is left on the application server, precious network bandwidth is also used. In this case, the static content needs to be sent from the application server to the Web server, and then the Web server forwards this content to the user. There is no need to have the Web server act as the middleman here.

Consequently, to improve performance, move static Web content to the Web server. Alternatively, use a caching proxy to avoid fetching static elements from the application server each time.

Lotus Connections distributes its static content as part of each feature (for example, Profiles). The following subsections explain how to move the static content to the Web server for each Lotus Connections feature in the case where a caching proxy is not used. It is assumed that the application server and the Web server are on two separate physical servers. Otherwise, the steps that follow do not provide any significant performance gain.


Static content for Activities

To move the static content for the Activities feature from the application server to the Web server, follow these steps:

  1. Log on as Administrator to the Web server.
  2. Open the IBM HTTP Server DocumentRoot directory (for example, /opt/IBMHttpServer/htdocs/en_US).
  3. Create a directory called activities.
  4. In that newly created directory, create a subdirectory called nav. You should now have a directory structure similar to:

    /opt/IBMHttpServer/htdocs/en_US/activities/nav
  5. Copy the images and templates directories from the application server /opt/WAS/profiles/<profileName>/installedApps/<cellName>/Activities.ear/sn-nav.war to the /activities/nav folder you created in step 4. Also copy any HTML and GIF files that are in the sn-nav.war directory as shown in figure 1.
Figure 1. Activities navbar static content copied to the Web server
Activities navbar static content copied to the Web server
  1. Open the plugin-cfg.xml usually in /<IHS_INSTALL_ROOT>/Plugins/config/webserver1 .
  2. Find the following line:

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

    and replace it with the code shown in listing 2.
Listing 2. Plugin-cfg.xml entries for Activities Nav Bar optimization
 <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid"
 Name="/activities/nav/header.js"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/activities/nav/custom.css"/>
  1. The static files for the Activities navigation bar (navbar) have now been copied to the Web server. You have to follow similar steps for the rest of the Activities static content.
  2. Copy the following directories: activities_help, activities_help_old, images, images_old, javascript, javascript3, movie, rte, and stylesheet directories from the application server /opt/WAS/profiles/<profileName>/installedApps/<cellName>/Activities.ear/oawebui.war to the /activities folder you created in step 4.
  3. Open the plugin-cfg.xml usually in /<IHS_INSTALL_ROOT>/Plugins/config/webserver1.
  4. Find the following line:

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

    and replace it with the code shown in listing 3.
Listing 3. Plugin-cfg.xml entries for Activities application optimization?
<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/*"/>

All of the Activities static content has now been copied to the Web server as shown in figure 2. The plug-in has been configured to forward only certain traffic to the application server (for example, *.jsp). A similar procedure is required for the other Lotus Connections features and is abbreviated in the following sections.

Figure 2. Activities static content copied to the Web server
Activities static content copied to the Web server

Static content for Blogs

To move the static content for the Blogs feature from the application server to the Web server, follow these steps:

  1. Create a directory called blogs on the Web server’s document root.
  2. In that newly created directory, create a subdirectory called nav. You now have a directory structure similar to: /opt/IBMHttpServer/htdocs/en_US/blogs/nav.
  3. Copy the images and templates directories from the application server /opt/WAS/profiles/<profileName>/installedApps/<cellName>/Blogs.ear/sn-nav.war to the /blogs/nav folder you created in step 2. Also copy any HTML and GIF files that are in the sn-nav.war directory.
  4. Open the plugin-cfg.xml usually in /<IHS_INSTALL_ROOT>/Plugins/config/webserver1 .
  5. Find the following line:

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

    and replace it with the code shown in listing 4.
Listing 4. Plugin-cfg.xml entries for Blogs Nav Bar optimization
 <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid"
 Name="/blogs/nav/header.js"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/blogs/nav/custom.css"/>
  1. Copy the images, roller-ui, theme, and themes directories from the application server /opt/WAS/profiles/<profileName>/installedApps/<cellName>/Blogs.ear/blogs.war to the /blogs folder you created in step 2. Also, copy favicon.ico and robots.txt from the blogs.war directory.
  2. Open the plugin-cfg.xml usually in /<IHS_INSTALL_ROOT>/Plugins/config/webserver1 .
  3. Find the following line:

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

    and replace it with the code shown in listing 5.
Listing 5. Plugin-cfg.xml entries for Blogs application optimization
<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/*"/>

Static content for Communities

To move the static content for the Communities feature from the application server to the Web server, follow these steps:

  1. Create a directory called communities on the Web server’s document root.
  2. In that newly created directory, create a subdirectory called nav. You should now have a directory structure similar to:
    /opt/IBMHttpServer/htdocs/en_US/communities/nav
  3. Copy the images and templates directories from the application server /opt/WAS/profiles/<profileName>/installedApps/<cellName>/Communities.ear/sn-nav.war to the /communities/nav folder you created in step 2. Also copy any HTML and GIF files that are in the sn-nav.war directory.
  4. Open the plugin-cfg.xml usually in /<IHS_INSTALL_ROOT>/Plugins/config/webserver1.
  5. Find the following line:

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

    and replace it with the code shown in listing 6.
Listing 6. Plugin-cfg.xml entries for Communities Nav Bar optimization
 <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
 Name="/communities/nav/header.js"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/communities/nav/custom.css"/>
  1. Copy the help, images, javascript, movies, rte, and stylesheets directories from the application server /opt/WAS/profiles/<profileName>/installedApps/<cellName>/Communities.ear/tango.web.ui.war to the /communities folder you created in step 2.
  2. Open the plugin-cfg.xml usually in /<IHS_INSTALL_ROOT>/Plugins/config/webserver1 .
  3. Find the following line:

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

    and replace it with the code shown in listing 7.
Listing 7. Plugin-cfg.xml entries for Communities application optimization
<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/*"/>

Static content for Dogear

To move the static content for the Dogear feature from the application server to the Web server, follow these steps:

  1. Create a directory called dogear on the Web server’s document root.
  2. In that newly created directory, create a subdirectory called nav. You should now have a directory structure similar to /opt/IBMHttpServer/htdocs/en_US/dogear/nav.
  3. Copy the images and templates directories from the application server /opt/WAS/profiles/<profileName>/installedApps/<cellName>/Dogear.ear/sn-nav.war to the /dogear/nav folder you created in step 2. Also copy any HTML and GIF files that are in the sn-nav.war directory.
  4. Open the plugin-cfg.xml usually in /<IHS_INSTALL_ROOT>/Plugins/config/webserver1.
  5. Find the following line:

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

    and replace it with the code shown in listing 8.
Listing 8. Plugin-cfg.xml entries for Dogear Nav Bar optimization
 <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
 Name="/dogear/nav/header.js"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/dogear/nav/custom.css"/>
  1. Copy the favicon, h3, misc, rte, script, scriptaculous, and tools directories from the application server /opt/WAS/profiles/<profileName>/installedApps/<cellName>/Dogear.ear/dogear.webui.war to the /dogear folder you created in step 2. Also copy favicon.ico from the dogear.webui.war folder.
  2. Open the plugin-cfg.xml usually in /<IHS_INSTALL_ROOT>/Plugins/config/webserver1.
  3. Open the plugin-cfg.xml usually in /<IHS_INSTALL_ROOT>/Plugins/config/webserver1.
  4. Find the following line:

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

    and replace it with the code shown in listing 9.
Listing 9. Plugin-cfg.xml entries for Dogear application optimization
      <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/*"/>

Static content for Profiles

To move the static content for the Profiles feature from the application server to the Web server, follow these steps:

  1. Create a directory called profiles on the Web server’s document root.
  2. In that newly created directory, create a subdirectory called nav. You now have a directory structure similar to: /opt/IBMHttpServer/htdocs/en_US/profiles/nav.
  3. Copy the images and templates directories from the application server /opt/WAS/profiles/<profileName>/installedApps/<cellName>/peoplepages.ear/sn-nav.war to the /profiles/nav folder you created in step 2. Also copy any HTML and GIF files that are in the sn-nav.war directory.
  4. Open the plugin-cfg.xml usually in /<IHS_INSTALL_ROOT>/Plugins/config/webserver1.
  5. Find the following line:

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

    and replace it with the code shown in listing 10.
Listing 10. Plugin-cfg.xml entries for Profiles Nav Bar optimization
 <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
 Name="/profiles/nav/header.js"/>
<Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" 
Name="/profiles/nav/custom.css"/>
  1. Copy the css, demo_movie, help, images, and javascript directories from the application server /opt/WAS/profiles/<profileName>/installedApps/<cellName>/peoplepages.ear/peoplepages.war to the /profiles folder you created in step 2.
  2. Open the plugin-cfg.xml usually in /<IHS_INSTALL_ROOT>/Plugins/config/webserver1.
  3. Find the following line:

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

    and replace it with the code shown in listing 11.
Listing 11. Plugin-cfg.xml entries for Profiles application optimization
<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/*"/>

Optimizing WebSphere Application Server Performance

One of the most challenging pieces of infrastructure to tune for performance is the application server. Each deployment is used differently, and each requires different settings to ensure optimal server performance. Usually, a load test is recommended prior to a production go-live test, which exercises the product for a specific set of use cases. IBM Tivoli Performance Viewer is often used to monitor the various resources (for example, Thread Pool, JDBC Connection Pool, memory utilization, and so on). After various runs, the application server is successfully tuned.

As of version 6 of WebSphere Application Server, Tivoli Performance Viewer is embedded as part of the server's administrative console. Refer to the WebSphere Application Server InfoCenter for information on how to use Tivoli Performance Viewer.

–

This section covers some basic recommendations to help you get the most out of your application server. Consider these recommendations a starting point. The Resources section –link-- includes links to documentation written specifically to help you tune WebSphere Application Servers.

Memory utilization

If you are running all five of the Lotus Connections features on one node (that is, one physical server), but on different application server instances, ensure that each application server is allocated enough memory so that it does not interfere with the other services. On a server with 4GB of RAM, for example, assign a maximum of 512MB of RAM per service. Internal testing has shown that values higher than this degrade performance as the Java Virtual Machine (JVM) spends more time performing garbage collection than anything else.

To do this, log on to the WebSphere Application Server Administrative Console (for example, http://yourserver.acme.com:9060/ibm/console) and choose Application Servers - <serverName> - Java and Process Management - Process Definition - Java Virtual Machine.

Additionally, set the Initial Heap Size and Maximum Heap Size to the same value, as shown in figure 3, to avoid unnecessary garbage collection.

Figure 3. Java Virtual Machine settings for the ActivitiesServer
Java Virtual Machine settings for the ActivitiesServer

Do this for each application server.

Connection pool

If you notice that the application responds slowly, yet processor utilization is low, there may not be enough connections available to perform a query on the database. By default, the maximum number of connections per database is 10. Depending upon how your Lotus Connections deployment is used, you may want to increase the maximum number of connections for a particular feature.

For example, if you expect a large number of concurrent users on a particular feature, you need to modify the respective JDBC Data Source to increase the maximum number of connections. A good starting value for Maximum connections for a load of 100-500 concurrent users is 30. This parameter should be set to 50 if you are expecting 1000 concurrent users. The best way to determine if this value needs to be adjusted is to use Tivoli Performance Viewer.

Additionally, set the minimum number of connections to 15. This causes the server to create the necessary connections to handle a large number of concurrent users immediately after startup.

To change this value, log on to the WebSphere Application Server Administrative Console, and choose Resources - JDBC - Data Sources - <dsName> - Connection pool properties. See figure 4.

Figure 4. JDBC Connection pool settings for the activities data source
JDBC Connection pool settings for the activities data source

One final note: Ensure that your database server has been properly configured to handle the specified number of connections per database. Check your database vendor’s documentation for how to configure this parameter.

Thread pool

If response times are slow even though processor utilization is low, the server may not have enough threads to handle incoming requests. Assuming a large number of concurrent users (for example, 2000), a good starting value for the maximum thread count is 100. This value should always be at least the same value specified as the maximum size of the JDBC Connection pool. To set the thread pool size, log on to the WebSphere Application Server Administrative Console and choose Application Servers - <serverName> - Thread Pools - Web Container.

Figure 5. Thread pool settings for the ActivitiesServer's WebContainer
Thread pool settings for the ActivitiesServer's WebContainer

NOTE: The Web server has a thread pool setting, and the two servers should complement each other. Otherwise, you could find yourself in a situation where the application server is ready to handle more requests, but the Web server doesn’t have enough threads to forward traffic to the application server, or the reverse. In the IBM HTTP Server, this setting is called ThreadsPerChild, and it is configured in the httpd.conf file.


Optimizing LDAP performance

To understand which factors affect the performance of your LDAP server, you need to understand first how Lotus Connections uses the LDAP server. The different features depend upon an LDAP directory for user authentication and information. Lotus Connections caches the user information locally in the respective database. This methodology improves performance because Lotus Connections does not need to have a direct connection to the LDAP when retrieving user information such as first name, last name, and email address.

Additionally, each LDAP directory vendor supports a mechanism for performance tuning. For example, some allow you to create indexes on the data, while others have the capability to configure caching and buffering options. This section discusses the recommended steps to index data used by Lotus Connections properly.

Index attributes for profile import

The Profiles feature, however, depends more heavily on an LDAP server than any other Lotus Connections feature. By default, the user information is imported into the Profiles database from the LDAP server periodically. The Profiles feature makes use of an IBM Tivoli Directory Integrator Assembly Line, which extracts user information from the LDAP server given a search filter. A search filter is the input into the LDAP search engine, and it defines what is looked up.

For example, a search filter may look like this:

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

Given this sample search filter, Tivoli Directory Integrator searches across all the objects in the LDAP repository and returns those objects that have the attribute ou=Americas and objectclass=inetOrgPerson. It’s critical then that your LDAP repository be indexed on the attributes specified in the search filter. LDAP lookups are much slower if an index doesn’t exist on those attributes.

For more information on how to configure and create indexes for particular attributes on your LDAP, refer to your vendor-specific documentation.

Index attributes for login

Another important attribute to index is the login attribute, which is usually uid or mail. Indexing these attributes accelerates the login process.

For more information on how to configure/and create indexes for particular attributes on your LDAP, refer to your vendor-specific documentation.


Optimizing database performance

Each database has very specific tuning parameters that depend on the operating system on which you are running your database. Here are some tips to keep in mind while deploying the Lotus Connections databases:

  • Connection pool. Ensure that your database can handle the number of connections specified in the data source’s connection pool. By default, each data source is configured to use a maximum of 10 connections. If all the databases for all the features are on one database server, ensure that it can handle at least 50 connections.
  • Hard disk utilization. Additionally, if you use the same database server for all features, you may want to consider deploying each database to a separate physical hard disk.

The Resources section includes links to documentation written specifically to tune DB2 and Oracle databases.


Conclusion

This article covered optimizing the performance of the different components required as part of the Lotus Connections infrastructureFor the Web server, this article highlights how to optimize the plug-in, logging, and moving static elements from the application server to the Web server. The article also discusses how to initially configure the memory, thread pool, and JDBC connection pool on the application server. For the LDAP server, it’s extremely important that indexes exist for the logon and searchable attributes. Finally, several tips were offered when considering tuning a database server.

Resources

Learn

Discuss

Comments

developerWorks: Sign in

Required fields are indicated with an asterisk (*).


Need an IBM ID?
Forgot your IBM ID?


Forgot your password?
Change your password

By clicking Submit, you agree to the developerWorks terms of use.

 


The first time you sign into developerWorks, a profile is created for you. Select information in your profile (name, country/region, and company) is displayed to the public and will accompany any content you post. You may update your IBM account at any time.

All information submitted is secure.

Choose your display name



The first time you sign in to developerWorks, a profile is created for you, so you need to choose a display name. Your display name accompanies the content you post on developerWorks.

Please choose a display name between 3-31 characters. Your display name must be unique in the developerWorks community and should not be your email address for privacy reasons.

Required fields are indicated with an asterisk (*).

(Must be between 3 – 31 characters.)

By clicking Submit, you agree to the developerWorks terms of use.

 


All information submitted is secure.

Dig deeper into IBM collaboration and social software on developerWorks


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=1
Zone=Lotus
ArticleID=245349
ArticleTitle=Deploying IBM Lotus Connections: Post-installation tuning
publish-date=09112007