Scaling Linux with IBM Lotus Domino

Anthony Barker

June 19, 2002

 

Update kernel

For better performance upgrade to the 2.4.18 or better kernel. It is quite stable and the performance increase is tremendous over the 2.2 series kernel.

All the major Linux distros (Redhat, Suse, Mandrake, Debian, Gentoo) now offer the 2.4.18 kernel precompiled and patched for you. So you don't have to do it yourself.

The 2.5x kernel looks like it will have many performance advantages - particularly on multiple cpu machines - but you shouldn't yet use this kernel in production. Aslo follow the information in the redbook for Lotus Domino for increasing the number of threads.

Update rc.local file
Try these parameters and if they work add them to your rc.local file so that they take effect each time you boot the machine. This will increase the number of file handles available and the number of inodes.

locate rc.local
pico /etc/rc.d/rc.local
echo "65536" > /proc/sys/fs/file-max
echo "196608" > /proc/sys/fs/inode-max
(inode limit should be 2..3 times file limit).

Set inode-state and inode-nr

chattr -R +A /local/notesdata
sets noatime for file system below notesdata directory. Oracle users say that this gives them a 5-8% boost - I have seen mild improvements in domino.

Edit the /etc/sysctl.conf file (redhat)

and add the following line:

# Improve the number of open files
fs.file-max = 8192

su to the domino account and issue
ulimit -n 90000

Which allows domino 90000 file descriptors
ulimit -a #see the new settings


A couple of other ones:

echo "100 1200 128 512 15 5000 500 1884 2">/proc/sys/vm/bdflush
(one line)
echo 300 400 500 > /proc/sys/vm/freepages


TCPIP Settings

Make sure you have a good network card - some do not give full 10/100 Meg Access.
Upgrade to 2.4.18 or better as the kernel tcpip stack performance is much better.

For a Web Server:
echo "10240 61000" > /proc/sys/net/ipv4/ip_local_port_range
echo "134217728" > /proc/sys/kernel/shmmax
echo 300 > /proc/sys/net/ipv4/tcp_keepalive_time


On a LAN
echo 0 > /proc/sys/net/ipv4/tcp_timestamps

disable TCP timestamps

echo 0 > /proc/sys/net/ipv4/tcp_window_scaling
disable window scaling

echo 0 > /proc/sys/net/ipv4/tcp_stack
disable selective acks

Even better - recompile the kernel

Note -changing your kernel can cause problems. Typically problems are displayed in Domino by giving you a "insufficient memory" error. Here are some kernel hacks you can try - I have tried most of them - but I typically do not yet use them on production machines.

1) modify values in include/linux/fs.h and limits.h and recompile the kernel.

limits.h
#define NR_OPEN 1024 /* 256*/
#define OPEN_MAX 1024 /* 256*/ /* # open files a process may
have */

fs.h:
#define NR_OPEN 1024 /*256*/
#define NR_INODE 65536 /*3072*/ /* this should be bigger than NR_FILE */
#define NR_FILE 16384 /*1024*/ /* this can well be larger on a larger
system */

2) add some custom scalability patches

The three areas that domino will definitely benefit are:

  • Scheduler improvements
  • Threads
  • IO Improvements

If you decide to apply any of these patches make sure that you read all documentation.

Scheduler:

There are tons of different scheduler patches:

Threads

An excellent Next Generation Pthreads patch from IBM - you will need 2.4.19pre8 or better. It should allow you to have 30 -100,000 threads active at any given time.


Ingo Molgar has npt - which will probably be included in the 2.6 kernel glibc

IO

UPDATE: new sys_epoll from 2.5x has been backported to the 2.4x kernel by united linux and Notes 6.5 now uses this is on linux for the zOS s390.
I guess it is probably used by Domino 6.5x for Linux x86 as well....


Async O/I Patch
(libaio)
The existing select() and poll() model in the kernel exhibits rapid decay with 1000s of users because the way they are written each user/(process) requires more file descriptors. With this project they are trying to take on the the Posix AIO specification and Windows I/O Completion Ports (IOCP). I am guessing that this is the I/O improvement in the Redhat Advanced Server. IOCP exists on Widoze NT, AIX, & OS/400 - It is patented by MS. You can thus assume that domino is/will be optimized for it. SGI has a nice kaio library. Unless they rewrite Domino to use it - it won't help.

Check out kegel for more overview
or this paper
and this document

Bounce Buffers
Systems with a large amount of high memory and intense I/O activity can create a large number of bounce buffers that can cause memory shortage problems. In addition, the excessive number of bounce buffer data copies can lead to performance degradation.
File name: block-highmem-all-18b.bz2

Raw I/O Variable-Size Optimization Patch
The raw I/O variable-size patch changes the block size used for raw I/O from hardsect_size (normally 512 bytes) to 4 kilobytes (K). The patch improves I/O throughput and CPU utilization by reducing the number of buffer heads needed for raw I/O operations.
File name:10_rawio-vary-io-1.

I/O Request Lock Patch
improves SCSI I/O performance on Linux 2.4 multi-processor systems by providing concurrent I/O request queuing.

 

How do you tell which patches are applied to a particular kernel?

from Alan Cox: "unpack the source rpm"

What does this mean? Because the source is GPL - you can determine which patches a particular distribution uses by:

rpm2cpio foo.rpm | cpio -idmv --no-absolute-filenames

and then look at the patches directory. Voila - the mystery of the different distros is gone.

 

>>> More linux & Domino info

>>company homepage

 Comments:

 
Warning: main(/home/ant/public_html/comments/annotate.php3): failed to open stream: No such file or directory in /home/ant/public_html/linux/dominoscale.php on line 223

Fatal error: main(): Failed opening required '/home/ant/public_html/comments/annotate.php3' (include_path='.:/usr/lib/php:/usr/local/lib/php') in /home/ant/public_html/linux/dominoscale.php on line 223