« Archives on Sunday, August 5, 2007

Tuning the Linux kernel for more aggressive network throughput

Below is a snippet of what was forwarded to me via email from a friend, that was originally emailed out in the Builder AU newsletter on July 26th 2007. Hope people find it useful as I have, I have only tested the information below on a test box and was happy on the increase of throughput from that box. When i get a chance I’ll try to add couple before and after screenshots

The Linux kernel and the distributions that package it typically
provide very conservative defaults to certain network settings that
affect networking parameters. These settings can be tuned via the /proc
filesystem or using the sysctl program. The latter is often better, as
it reads the contents of /etc/sysctl.conf, which allows you to keep
settings across reboots.

The following is a snippet from /etc/sysctl.conf that may improve
network performance:

net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_syncookies = 1
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216

The above isn’t to replace what may already exist in /etc/sysctl.conf,
but rather to supplement it. The first command enables TCP window
scaling, which allows clients to download data at a higher rate by
enabling extra bits in TCP packets that are used to increase the window

The second command enables TCP SYN cookies, which is often enabled by
default and is extremely effective in preventing conditions such as SYN
floods that can drain the server of resources used to process incoming

The last four options increase the TCP send and receive buffers, which
allow an application to move its data out faster so as to serve other
requests. This also improves the client’s ability to send data to the
server when it gets busy.

By adding these commands to the /etc/sysctl.conf file, you ensure they
take effect on every reboot. To enable them immediately without a
reboot, use:

# sysctl -p /etc/sysctl.conf

To see all of the currently configured sysctl options, use:

# sysctl -a

This will list all of the configuration keys and their current values.
The sysctl.conf file allows you to configure and save new defaults;
what you see from this output are the defaults defined in the kernel
that are currently effective. To see the value of one particular item,

# sysctl -q net.ipv4.tcp_window_scaling

Likewise, to set the value of one item without configuring it in
sysctl.conf — and understanding that it won’t be retained across
reboots, use:

# sysctl -w net.ipv4.tcp_window_scaling=1

This can be useful for testing the effectiveness of certain settings
without committing them to being defaults.