Setting up Arch Linux for audio performance

These notes are for setting up a new audio system on Arch Linux. It is assumed that you have an AUR helper like yay or paru installed (I use the latter here but exchange with yay if you use that). This isn’t a tutorial but just a collection of notes to help myself and perhaps others setup a high performance audio system in Arch Linux. The Arch Linux maintainers have done an amazing job in making it a good operating system for this kind of work by allowing users to easily setup the system with the right privileges and install the needed software.

Install audio tools

This will install all the audio tools I need on any system:

paru -S reaper-bin sws supercollider sc3-plugins jack2 mpv sox qjackctl pulseaudio-bluetooth pulseaudio-jack pulseaudio njconnect flac cadence alsa-firmware alsa-plugins alsa-utils realtimeconfigquickscan-git

And then to install all SuperCollider plugins on the AUR: paru -S supercollider-plugins

System checking tools

I use the script realTimeAudioConfigQuickScan to check how well I’m doing. By running it you can quickly see what needs to be optimized.

install from AUR:

paru -S realtimeconfigquickscan-git

If you want to go even deeper, there is a script called realtime-suggestions, also available on the AUR but I’ve not detected any performance differences when messing with the suggestions from that one.

Realtime privileges

Arch has a nice package will allow users in the realtime group to have realtime privileges, including unlocking memory and setting realtime priorities very high.

It’s easily setup:

sudo pacman -S realtime-privileges
sudo groupadd realtime
sudo usermod -a -G realtime $USER

Reduce swappiness

Add vm.swappiness=10 to /etc/sysctl.conf

sudo echo "vm.swappiness=10" >> /etc/sysctl.conf

CPU governor

This is by far the audio system improvement that makes the biggest difference on my systems. By setting your CPU governors to “performance” (instead of “powersave”) the performance stability (and energy usage) of your CPU increases. In practice, this often doubles the performance of my machines so it’s definately worth doing. The Arch wiki has a whole page dedicated to this, but I prefer using this approach using tuned.

paru -S tuned
systemctl enable --now tuned.service
tuned-adm profile latency-performance

You can setup a udev rule to automatically switch between power save mode and performance when plugging power into your laptop.

Create the file /etc/udev/rules.d/99-powerprofile_switch.rules and add this (thanks Kenneth Flak):

# Rule for when switching to battery
ACTION=="change", SUBSYSTEM=="power_supply", ATTR{type}=="Mains", ATTR{online}=="0" RUN+="/usr/bin/tuned-adm profile laptop-battery-powersave"
# Rule for when switching to AC
ACTION=="change", SUBSYSTEM=="power_supply", ATTR{type}=="Mains", ATTR{online}=="1" RUN+="/usr/bin/tuned-adm profile latency-performance"

Niklas Adam also recommends these aliases if you want to switch between the performance profiles dynamically. Add them to your .zshrc or whatever:

alias cpu-max='tuned-adm profile latency-performance'
alias cpu-balanced='tuned-adm profile balanced'
alias cpu-min='tuned-adm profile laptop-battery-powersave'

Windows VST Plugins

I use a lot of Windows VST plugins in my audio workflow. I use wine and yabridge to bridge them in Linux.

First install Wine. I use Wine TKG which has some performance patches: Installation instructions here. After installing that, you can run paru -S yabridge to install the vst bridge itself (more info here).

Realtime kernel

The default kernel on Arch is pretty good for audio performance. But you might be able to squeeze a bit more performance out of your system by installing realtime kernels.

To install prebuilt realtime kernels easily you can add this section:

Server =$arch

to your pacman configuration: /etc/pacman.conf

Then run

paru -Syyu linux-rt linux-rt-headers

And update your grub bootloader to include the new kernel when booting. Next time you reboot your computer you are able to choose it from the list of kernels in grub: sudo grub-mkconfig -o /boot/grub/grub.cfg