Sun Java System Application Server Enterprise Edition 8.1 2005Q2 Performance Tuning Guide

- Previous: Tuning for Solaris on x86
- Next: Chapter 6 Tuning for High-Availability

# Tuning for Linux platforms

To tune for maximum performance on Linux, you need to make adjustments to the following:

- File Descriptors

- Virtual Memory

- Network Interface

- Disk I/O Settings

- TCP/IP Settings

## File Descriptors

You may need to increase the number of file descriptors from the default. Having a higher number of file descriptors ensures that the server can open sockets under high load and not abort requests coming in from clients.

Start by checking system limits for file descriptors with this command:

    cat /proc/sys/fs/file-max
    8192

The current limit shown is 8192. To increase it to 65535, use the following command (as root):

    echo "65535" > /proc/sys/fs/file-max

To make this value to survive a system reboot, add it to `/etc/sysctl.conf` and specify the maximum number of open files permitted:

    fs.file-max = 65535

Note: The parameter is not `proc.sys.fs.file-max`, as one might expect.

To list the available parameters that can be modified using `sysctl`:

    sysctl -a

To load new values from the `sysctl.conf` file:

    sysctl -p /etc/sysctl.conf

To check and modify limits per shell, use the following command:

    limit

The output will look something like this:

    cputime         unlimited
    filesize        unlimited
    datasize        unlimited
    stacksize       8192 kbytes
    coredumpsize    0 kbytes
    memoryuse       unlimited
    descriptors     1024
    memorylocked    unlimited
    maxproc         8146
    openfiles       1024

The `openfiles` and `descriptors` show a limit of 1024. To increase the limit to 65535 for all users, edit `/etc/security/limits.conf` as root, and modify or add the `nofile` setting (number of file) entries:

    *         soft    nofile                     65535
    *         hard    nofile                     65535

The character “`*`” is a wildcard that identifies all users. You could also specify a user ID instead.

Then edit `/etc/pam.d/login` and add the line:

    session required /lib/security/pam_limits.so

On Red Hat, you also need to edit `/etc/pam.d/sshd` and add the following line:

    session required /lib/security/pam_limits.so

On many systems, this procedure will be sufficient. Log in as a regular user and try it before doing the remaining steps. The remaining steps might not be required, depending on how pluggable authentication modules (PAM) and secure shell (SSH) are configured.

## Virtual Memory

To change virtual memory settings, add the following to `/etc/rc.local`:

    echo 100 1200 128 512 15 5000 500 1884 2 > /proc/sys/vm/bdflush

For more information, view the man pages for `bdflush`.

For HADB settings, refer to Chapter 6, Tuning for High-Availability.

## Network Interface

To ensure that the network interface is operating in full duplex mode, add the following entry into `/etc/rc.local`:

    mii-tool -F 100baseTx-FD eth0

where eth0 is the name of the network interface card (NIC).

## Disk I/O Settings

### To tune disk I/O performance for non SCSI disks

1. Test the disk speed.

   Use this command:

       /sbin/hdparm -t /dev/hdX

2. Enable direct memory access (DMA).

   Use this command:

       /sbin/hdparm -d1 /dev/hdX

3. Check the speed again using the `hdparm` command.

   Given that DMA is not enabled by default, the transfer rate might have improved considerably. In order to do this at every reboot, add the `/sbin/hdparm` `-d1 /dev/hdX` line to `/etc/conf.d/local.start`, `/etc/init.d/rc.local`, or whatever the startup script is called.

   For information on SCSI disks, see: System Tuning for Linux Servers — SCSI.

## TCP/IP Settings

### To tune the TCP/IP settings

1. Add the following entry to `/etc/rc.local`

       echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
       echo 60000 > /proc/sys/net/ipv4/tcp_keepalive_time
       echo 15000 > /proc/sys/net/ipv4/tcp_keepalive_intvl
       echo 0 > /proc/sys/net/ipv4/tcp_window_scaling

2. Add the following to `/etc/sysctl.conf`

       # Disables packet forwarding
       net.ipv4.ip_forward = 0
       # Enables source route verification
       net.ipv4.conf.default.rp_filter = 1
       # Disables the magic-sysrq key
       kernel.sysrq = 0
       net.ipv4.ip_local_port_range = 1204 65000
       net.core.rmem_max = 262140
       net.core.rmem_default = 262140
       net.ipv4.tcp_rmem = 4096 131072 262140
       net.ipv4.tcp_wmem = 4096 131072 262140
       net.ipv4.tcp_sack = 0
       net.ipv4.tcp_timestamps = 0
       net.ipv4.tcp_window_scaling = 0
       net.ipv4.tcp_keepalive_time = 60
       net.ipv4.tcp_keepalive_intvl = 15
       net.ipv4.tcp_fin_timeout = 30

3. Add the following as the last entry in `/etc/rc.local`

       sysctl -p /etc/sysctl.conf

4. Reboot the system.

5. Use this command to increase the size of the transmit buffer:

       tcp_recv_hiwat ndd /dev/tcp 8129 32768

- Previous: Tuning for Solaris on x86
- Next: Chapter 6 Tuning for High-Availability

- © 2010, Oracle Corporation and/or its affiliates