Parece que no hay una forma oficial de hacerlo. (Esto es incorrecto. Vea la parte inferior)
Una forma oficialmente desaconsejada (porque manipula el cgroup) es la siguiente:
Haga el siguiente archivo como /etc/systemd/system/user@.service.d/set-memhigh.conf
[Service]
Type=simple
ExecStartPost=+/root/set-memoryhigh.sh %i
Luego haga el siguiente archivo como "/root/set-memoryhigh.sh"
#!/bin/bash
exec >>/var/tmp/log.txt 2>&1 # for logging
set -x # for logging
for d in /sys/fs/cgroup /sys/fs/cgroup/user.slice /sys/fs/cgroup/user.slice/user-$1.slice; do
echo "+memory" >>${d}/cgroup.subtree_control
done
/bin/echo "24G" >> /sys/fs/cgroup/user.slice/user-$1.slice/memory.high
Puede ver si funciona o no ejecutando
cat /sys/fs/cgroup/user.slice/user-${UID}.slice/memory.high
Si "/sys/fs/cgroup/user.slice" no existe, entonces la jerarquía unificada de cgroup no está habilitada. Tenemos que habilitarlo como https://unix.stackexchange.com/a/452728/297666
Aunque funciona, no estoy seguro si te gusta esto ...
Nota agregada el 25 de julio: Hacer el siguiente archivo /etc/systemd/system/user-1000.slice
para cada usuario (reemplazando 1000 por el UID del usuario) impone una limitación de memoria a ese usuario. Lo verifiqué en systemd 237 en ubuntu 18.04 y Debian strecth con systemd 237 instalado desde estiramiento-backports:
[Slice]
Slice=user.slice
MemoryHigh=24G
El inconveniente es que tenemos que hacer el archivo anterior para cada usuario. Con systemd 239 , podemos hacer el archivo anterior como /etc/systemd/system/user-.slice.d/memory.conf
y la limitación de memoria se impone a cada usuario. Pero hay un error en systemd 239 (este error se corrigió en 240) y no funciona según lo previsto. Para evitar el error, cree el siguiente archivo como user-0.slice
y ejecútelo systemctl enable user-0.slice
. Nosotros no tenemos que hacer la siguiente archivo para cada usuario.
[Unit]
Before=systemd-logind.service
[Slice]
Slice=user.slice
[Install]
WantedBy=multi-user.target