# Tuning {#tuning}

## Operating System and Kernel

For minimum latency several kernel and driver settings can be optimized.
A [PREEMPT_RT patched Linux](https://rt.wiki.kernel.org/index.php/Main_Page) kernel is recommended.
Precompiled kernels for Fedora can be found here: http://ccrma.stanford.edu/planetccrma/software/

- Install `tuned` package and activate the `realtime` profile. This profile will:
  - Reserve some CPU cores solely for VILLASnode (Kernel cmdline: `isolcpus=[cpu_numbers]`)
  - Activate sub-profiles:
     - `network-latency`
     - `latency-performance`
  - See `/etc/tuned/realtime-variables.conf`
  - See `/usr/lib/tuned/realtime/`

- VILLASnode configuration:
  - `affinity`: Maps network card IRQs and threads to isolated cores
  - `priority`: Increases priority of network packets and threads

- Configure NIC interrupt coalescence with `ethtool`:

    $ ethtool -C|--coalesce devname [adaptive-rx on|off] [adaptive-tx on|off] ...

- Configure NIC kernel driver in `/etc/modprobe.d/e1000e.conf`:

    # More conservative interrupt throttling for better latency
    # https://www.kernel.org/doc/Documentation/networking/e1000e.txt
    option e1000e InterruptThrottleRate=

## Hardware

This are some proposals for the selection of appropriate server hardware:

- Server-grade CPU: Intel Xeon
  - A multi-core systems allows parallization of send/receive paths.

- Server-grade network cards: Intel PRO/1000
  - These allow offloading of UDP checksumming to the hardware