Menu

FreeBSD Tuning

This page contains information on tuning FreeBSD hosts connected at speeds of 1Gbps or higher.

Basic tuning configuration

Here are the recommended settings for /etc/sysctl.conf. Some of these are the default settings, but are included in case someone changed the defaults on your system. Explanations are below.

   # set to at least 16MB for 10GE hosts
kern.ipc.maxsockbuf=16777216
# set autotuning maximum to at least 16MB too
net.inet.tcp.sendbuf_max=16777216
net.inet.tcp.recvbuf_max=16777216
# enable send/recv autotuning
net.inet.tcp.sendbuf_auto=1
net.inet.tcp.recvbuf_auto=1
# increase autotuning step size
net.inet.tcp.sendbuf_inc=16384
net.inet.tcp.recvbuf_inc=524288
# set this on test/measurement hosts
net.inet.tcp.hostcache.expire=1
# Set congestion control algorithm to Cubic or HTCP
# Make sure the module is loaded at boot time - check loader.conf
# net.inet.tcp.cc.algorithm=cubic
net.inet.tcp.cc.algorithm=htcp

Advanced congestion control in FreeBSD

FreeBSD supports TCP autotuning and advanced congestion control algorithms in all currently-supported releases. You can check which are available in the running kernel using:

  sysctl net.inet.tcp.cc.available

To make additional algorithms available in the kernel, the appropriate module must be loaded. The congestion control modules are in /boot/kernel and begin with cc_ - they can be listed with the following command:

  ls /boot/kernel/cc_* | grep -v symbols

To load a particular congestion control algorithm (for example htcp) you can use:

  kldload cc_htcp

and you will then be able to set the congestion control algorithm using this:

  sysctl net.inet.tcp.cc.algorithm=htcp

FreeBSD 12 will support the BBR congestion control algorithm when it is released. Currently available versions of FreeBSD are listed here.

Enabling congestion control algorithms at boot time

Depending how your kernel is built, you may not have the algorthm you want available by default at boot time, and will need to load the driver during the boot process. To to this add the following to /boot/loader.conf:

  cc_htcp_load="YES"

The htcp algorithm will then be loaded at boot time, and will be enabled when sysctl.conf is processed at boot time and the net.inet.tcp.cc.algorithm=htcp variable is set.

Other information

By default, FreeBSD caches connection details such as the slow start threshold and the congestion windows size from the previous connection to the same host for 1 hour. While this is a good idea for a web server, it makes it hard to do network throughput testing, as 1 large congestion event will throttle performance for the next hour. To reduce this effect, set hostcache.expire to 1.

This will still cache values for 5 minutes, for reasons described in this article from the Centre for Advanced Internet Architectures (CAIA) at Swinburne University in Australia. This article has a lot of other good tuning information for FreeBSD too.