|
|
[[_TOC_]]
|
|
|
|
|
|
# General
|
|
|
|
|
|
To avoid xruns and other hiccups while processing audio, there are some configuration options that can be done.
|
|
|
|
|
|
# Kernel
|
|
|
|
|
|
On recent kernels configured with PREEMPT_DYNAMIC, you can boot the kernel with and extra
|
|
|
`preempt=full` option.
|
|
|
|
|
|
You could also try to install a realtime kernel for your distro.
|
|
|
|
|
|
# Realtime scheduling
|
|
|
|
|
|
Realtime priorities are given to the data processing threads in both the clients and the server.
|
|
|
|
|
|
There are currently 2 modules that implement this, a native pthread implementation and one based on RTkit.
|
|
|
|
|
|
The RTKit implementation is potentially better because it can implement a global policy and does not require extra permissions from the client. It however needs DBus and is currently not configured optimally in many distributions. It also does not work with flatpaks because it does not know about the namespace of the thread ids in the sandbox.
|
|
|
|
|
|
# Config
|
|
|
|
|
|
The configuration of the realtime priorities and the implementation can be done in the different server and client config files:
|
|
|
|
|
|
- `/usr/share/pipewire/pipewire.conf` for the PipeWire daemon settings
|
|
|
- `/usr/share/pipewire/pipewire-pulse.conf` for the PipeWire pulseaudio server
|
|
|
- `/usr/share/pipewire/client-rt.conf` for the PipeWire native client settings
|
|
|
- `/usr/share/pipewire/jack.conf` for the PipeWire JACK clients
|
|
|
- `/usr/share/pipewire/media-session.d/media-session.conf` for the PipeWire media session
|
|
|
|
|
|
The relevant module is enabled in the `context.modules` section:
|
|
|
|
|
|
```
|
|
|
context.modules = [
|
|
|
# Uses RTKit to boost the data thread priority.
|
|
|
{ name = libpipewire-module-rtkit
|
|
|
args = {
|
|
|
#nice.level = -11
|
|
|
#rt.prio = 88
|
|
|
#rt.time.soft = 2000000
|
|
|
#rt.time.hard = 2000000
|
|
|
}
|
|
|
flags = [ ifexists nofail ]
|
|
|
}
|
|
|
....
|
|
|
```
|
|
|
Use `libpipewire-module-rtkit` or `libpipewire-module-rt` to select the RTKit or native thread implementation respectively. The arguments for both modules are the same.
|
|
|
|
|
|
- `nice.level` this will be the nice value set for the application thread. It improves performance of the communication with the pipewire daemon.
|
|
|
- `rt.prio` this is the realtime priority of the data thread. Higher values are higher priority.
|
|
|
- `rt.time.soft`, `rt.time.hard` The amount of CPU time an RT thread can consume without doing any blocking calls before the kernel kills the thread. This is a safety measure to avoid lockups of the complete system when some thread consumes 100%.
|
|
|
|
|
|
The native implementation will use FIFO scheduling with the indicated priorities.
|
|
|
|
|
|
The RTKit module might not be able to configure the given values, depending on the limits as configured in RTKit.
|
|
|
|
|
|
# RTkit
|
|
|
|
|
|
RTKit can be configured by passing extra arguments to the `/usr/libexec/rtkit-daemon` process. You can try `/usr/libexec/rtkit-daemon --help` to see the options.
|
|
|
|
|
|
Depending on the distro, you would do something like this:
|
|
|
|
|
|
* Make `/usr/lib/systemd/system/rtkit-daemon.service.d/limits.conf` with:
|
|
|
|
|
|
```systemd
|
|
|
[Service]
|
|
|
EnvironmentFile=/etc/sysconfig/rtkit
|
|
|
ExecStart=
|
|
|
ExecStart=/usr/libexec/rtkit-daemon $RTKIT_ARGS
|
|
|
```
|
|
|
|
|
|
* Make `/etc/sysconfig/rtkit` with:
|
|
|
|
|
|
```ini
|
|
|
RTKIT_ARGS="--scheduling-policy=FIFO
|
|
|
--our-realtime-priority=89
|
|
|
--max-realtime-priority=88
|
|
|
--min-nice-level=-19
|
|
|
--rttime-usec-max=2000000
|
|
|
--users-max=100
|
|
|
--processes-per-user-max=1000
|
|
|
--threads-per-user-max=10000
|
|
|
--actions-burst-sec=10
|
|
|
--actions-per-burst-max=1000
|
|
|
--canary-cheep-msec=30000
|
|
|
--canary-watchdog-msec=60000
|
|
|
"
|
|
|
```
|
|
|
# Extra
|
|
|
|
|
|
See also [here](https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/698) for more information. |
|
|
\ No newline at end of file |