Ustaw domyślny limit zasobów dla wszystkich użytkowników z systemd cgroups

9

Mogę ustawić limit pamięci dla użytkowników takich jak:

systemctl set-property user-UID.slice MemoryHigh=24G

Czy istnieje sposób, aby zastosować to dla wszystkich użytkowników? Chciałbym, aby każdy użytkownik otrzymał 24G, a nie 24G dla wszystkich procesów użytkownika (co, jak sądzę, byłoby wynikiem user.slicebezpośredniego włączenia go ).

kai
źródło

Odpowiedzi:

7

Wydaje się, że nie ma oficjalnie wspieranego sposobu na to. (Jest to nieprawidłowe. Zobacz na dole) Oficjalnie odradzany sposób (ponieważ manipuluje grupą cgroup) jest następujący:

Utwórz następujący plik jako /etc/systemd/system/[email protected]/set-memhigh.conf

[Service]
Type=simple
ExecStartPost=+/root/set-memoryhigh.sh %i

Następnie utwórz następujący plik jako „/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

Możesz sprawdzić, czy to działa, czy nie, uruchamiając

cat /sys/fs/cgroup/user.slice/user-${UID}.slice/memory.high

Jeśli „/sys/fs/cgroup/user.slice” nie istnieje, ujednolicona hierarchia grup cGroup nie jest włączona. Musimy włączyć to jako https://unix.stackexchange.com/a/452728/297666

Chociaż to działa, nie jestem pewien, czy ci się to podoba ...

Uwaga dodana 25 lipca: Utworzenie następującego pliku /etc/systemd/system/user-1000.slicedla każdego użytkownika (zastąpienie 1000 identyfikatorem UID użytkownika) nakłada na tego użytkownika ograniczenie pamięci. Sprawdziłem to na systemd 237 na Ubuntu 18.04 i Debian Strecth z systemd 237 zainstalowanym z backportu stretch:

[Slice]
Slice=user.slice
MemoryHigh=24G

Niedogodnością jest to, że musimy utworzyć powyższy plik dla każdego użytkownika. Dzięki systemd 239 możemy wykonać powyższy plik jako, /etc/systemd/system/user-.slice.d/memory.confa ograniczenie pamięci jest nakładane na każdego użytkownika. Ale jest błąd w systemd 239 (ten błąd został poprawiony w 240) i nie działa zgodnie z przeznaczeniem. Aby obejść błąd, utwórz następujący plik jako user-0.slicei uruchom systemctl enable user-0.slice. Mamy nie trzeba wprowadzać następujący plik dla każdego użytkownika.

[Unit]
Before=systemd-logind.service
[Slice]
Slice=user.slice
[Install]
WantedBy=multi-user.target
Ryutaroh Matsumoto
źródło
Tymczasem wygląda to na przyzwoite obejście, ale będę się starać o bardziej oficjalną wersję.
kai
1
@kai Znalazłem oficjalne sposoby ograniczenia pamięci i dodałem je do mojej powyższej odpowiedzi. Mam nadzieję, że to przydatne.
Ryutaroh Matsumoto
1
Przetestuję to, ale wygląda dokładnie tak, jak potrzebuję (z wyjątkiem tego błędu)
kai