Tetapkan batas sumber daya default untuk semua pengguna dengan grup sistemd

9

Saya dapat menetapkan batas memori untuk pengguna seperti:

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

Apakah ada cara untuk menerapkan ini untuk semua pengguna? Saya ingin setiap pengguna mendapatkan 24G, bukan total 24G untuk semua proses pengguna (yang saya pikir akan menjadi hasil pengaturan user.slicelangsung).

kai
sumber

Jawaban:

7

Tampaknya tidak ada cara yang didukung secara resmi untuk melakukan itu. (Ini salah. Lihat bagian bawah) Cara yang secara resmi tidak disarankan (karena memanipulasi cgroup) adalah sebagai berikut:

Jadikan file berikut sebagai /etc/systemd/system/[email protected]/set-memhigh.conf

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

Kemudian buat file berikut ini sebagai "/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

Anda dapat melihat apakah itu berfungsi atau tidak dengan menjalankan

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

Jika "/sys/fs/cgroup/user.slice" tidak ada, maka hierarki cgroup terpadu tidak diaktifkan. Kami harus mengaktifkannya sebagai https://unix.stackexchange.com/a/452728/297666

Meskipun berfungsi, saya tidak yakin apakah Anda suka ini ...

Catatan ditambahkan pada 25 Juli: Membuat file berikut /etc/systemd/system/user-1000.sliceuntuk setiap pengguna (mengganti 1000 dengan UID pengguna) membebankan batasan memori pada pengguna itu. Saya memverifikasinya di systemd 237 di ubuntu 18.04 dan Debian strecth dengan systemd 237 diinstal dari stretch-backports:

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

Ketidaknyamanannya adalah kita harus membuat file di atas untuk setiap pengguna. Dengan systemd 239 , kita dapat membuat file di atas /etc/systemd/system/user-.slice.d/memory.confdan batasan memori dikenakan pada setiap pengguna. Tetapi ada bug di systemd 239 (bug ini diperbaiki pada 240) dan tidak berfungsi sebagaimana dimaksud. Untuk mengatasi bug, buat file berikut sebagai user-0.slicedan jalankan systemctl enable user-0.slice. Kami tidak harus membuat file berikut untuk setiap pengguna.

[Unit]
Before=systemd-logind.service
[Slice]
Slice=user.slice
[Install]
WantedBy=multi-user.target
Ryutaroh Matsumoto
sumber
Ini terlihat seperti solusi yang layak untuk sementara, tetapi saya akan bertahan untuk versi yang lebih resmi.
Kai
1
@ Kai Saya menemukan cara resmi untuk pembatasan memori dan menambahkannya ke jawaban saya di atas. Semoga bermanfaat.
Ryutaroh Matsumoto
1
Saya akan mengujinya, tapi ini sepertinya persis apa yang saya butuhkan (kecuali untuk bug itu)
kai