Skip to main content

Tuning Ubuntu 22.04 for Ember

Author: Valery Svistunou

September 2023

Preface​

This document describes how to tune Ubuntu Server 22.04 (Ubuntu) for better Ember performance. Some advices from this article might be applicable to other Debian-based distributions as well.

Kernel selection and configuration​

We strongly recommend to use a tickless kernel. Such a kernel allows to reduce system noise on particular CPU cores by disabling periodic system's timers on it. For that purpose, you may either re-build the default kernel, which is shipped with Ubuntu, or install a real-time kernel, which is available via linux-realtime package. If you prefer your own kernel, make sure that it has been built with CONFIG_NO_HZ_FULL=y parameter.

Whatever kernel is selected, it should be properly configured via boot parameters. The table below show recommended parameters:

ParameterDescription
isolcpus=CPUS_LISTIsolate a list of CPUs from the general schedule (these cores will be used by Ember).
nohz_full=CPUS_LISTSpecifies a list of CPUs whose tick will be stopped whenever possible. Should match with isolcpus parameter.
transparent_hugepage=neverDisable THP.
intel_pstate=disableDo not enable intel_pstate as the default scaling driver for the supported processors.
intel_idle.max_cstate=0Disable intel_idle if the driver is intel_idle. (Run cat /sys/devices/system/cpu/cpuidle/current_driver to check.)
processor.max_cstate=0Limits processor to the maximum C-state.
mce=ignore_ceIgnore corrected errors in machine checks
nosoftlockup=0Disable the soft-lockup detector.
audit=0Disable the audit-subsystem.
idle=pollDon't do power saving in the idle loop using HLT, but poll for rescheduling event.
nmi_watchdog=0Turn hardlockup detector in nmi_watchdog off
mitigations=offDisable all optional CPU mitigations. This improves system performance, but it may also expose users to several CPU vulnerabilities.
apparmor=0Disable AppArmor at boot time
rcu_nocbsTBD...

Note: proper CPU isolation should include both virtual cores, which share the same physical core (for CPUs with HyperThreading enabled). CPU core's topology could be retrieved with lscpu -p command.

To set kernel's parameters:

  1. Edit the file called /etc/default/grub.

    sudo vi /etc/default/grub
  2. Find or add the line GRUB_CMDLINE_LINUX_="" and add one or more parameters described below (space separated). If something goes wrong, boot in rescue mode and remove the bad changes.

    GRUB_CMDLINE_LINUX_="transparent_hugepage=never intel_pstate=disable intel_idle.max_cstate=0 processor.max_cstate=0 mce=ignore_ce nosoftlockup=0 audit=0 idle=poll nmi_watchdog=0 mitigations=off isolcpus=10-23,34-47 nohz_full=10-23,34-47"
  3. To apply changes, run the following command:

    sudo update-grub
  4. Reboot.

  5. After reboot, verify that the settings were applied using the command cat /proc/cmdline.

Runtime parameters configuration​

Some kernel parameters might be configured at runtime. Our advice is to change the parameters following:

net.core.rmem_max = 2097152
net.core.wmem_max = 2097152
vm.stat_interval = 3600
vm.mmap_min_addr = 4096

To persist the parameters between system reboots, save the content of the snipped above in a conf-file into /etc/sysctl.d directory. To apply changes without reboot, run sudo sysctl --system command.

Note: there is a file /etc/sysctl.d/10-zeropage.conf, which may override vm.mmap_min_addr parameter. It should be either removed or adjusted to a new value.

Tuned profile​

Additional parameters might be implicitly configured using tuned utility. Use the next commands to install and configure tuned:

sudo apt-get install tuned
sudo systemctl start tuned
sudo systemctl enable tuned
sudo tuned-adm profile latency-performance

This will configure tuned to use latency-performance profile, which is our choise for the best latency.

Disable unused services​

Ubuntu Server 22.04 comes with moderate set of services out of the box. Nevertheless, some of them should be disabled to improve latency. We recommend disabling AppArmor and UFW services:

sudo systemctl stop ufw
sudo systemctl stop apparmor
sudo systemctl disable ufw
sudo systemctl disable apparmor

Disable swap​

Permanently disable swap. To do that, edit /etc/fstab and comment out swap line (usually the last entry).

sudo vi /etc/fstab

For example:

#/dev/mapper/cl-swap     swap                    swap    defaults        0 0