In version 0.5.2 of McLaren Labs’
rtpmidi, we made the use of locked memory the default. Locked memory dedicates fixed RAM to the rtpmidi process, and prevents it from being swapped to disk. The use of locked memory (through the mlockall() function call) can be a benefit to realtime applications like MIDI and Audio, but its use can be to the detriment of other processes. So it should be used carefully.
On Ubuntu 18.04 and 20.04 enabling memlock as the default option seemed benign enough. On Ubuntu 20.10, however, this default caused problems. With memlock enabled, the process printed strange errors and aborted. Example:
***MEMORY-ERROR***: rtpmidi: GSlice: failed to allocate 8176 bytes (alignment: 8192): Cannot allocate memory
Ubuntu 20.10 (Groovy Gorilla) accounts for locked memory pages differently, and even though the memory limit is higher, with all things accounted for, it is not enough.
Checking the Limit
In BASH, you can use the
ulimit command with the
-a option to list all of the limits.
# Ubuntu 20.10 default $ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 15499 max locked memory (kbytes, -l) 503374 ... # Ubuntu 20.04 default $ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 15499 max locked memory (kbytes, -l) 65536
As you can see, the max-locked-memory limit is different in Ubuntu 20.04 and 20.10. The Ubuntu 20.10 team raised the default limit. We suspect this is because the newer kernel accounts for locked pages using a different algorithm, but we cannot confirm this presently.
But it is true that the two Operating System releases are using different kernels.
Ubuntu 20.04 - Kernel 5.4 Ubuntu 20.10 - Kernel 5.8
Changing the default limit
User limits are set at boot time and are specified in the file shown below. (Read this excellent article: https://stackoverflow.com/questions/46978524/mlockall-cannot-allocate-memory.)
To raise the default limit, add a new line to the end of the file for the user ID that should get the raised limit. Example:
MYUSERNAME - memlock 1000000
Then reboot. Re-run the
'ulimit -a command and you should see the raised limit.
Running rtpmidi with memlock
-M option is provided to enable memlock. Enable locked pages like this:
$ /opt/rtpmid_0.6.1_xxx/bin/rtpmidi gui -M 1 ...
or disable it like this:
$ /opt/rtpmid_0.6.1_xxx/bin/rtpmidi gui -M 0 ...
McLaren Labs tries to distrbute its products with sensible defaults that “just work” but with the knobs available to optimize performance for users who are up to the task. This article described how to adjust the Linux
memlock limit for one particular user, and described how to invoke
rtpmidi with the memlock option.