次のようにユーザーのメモリ制限を設定できます。
systemctl set-property user-UID.slice MemoryHigh=24G
これをすべてのユーザーに適用する方法はありますか?すべてのユーザープロセスの合計24Gではなく、各ユーザーに24Gを取得してほしい(user.slice
に直接設定した結果だと思います)。
正式にサポートされている方法はないようです。 (これは誤りです。下部を参照してください)(cgroupを操作するため)公式に推奨されない方法は次のとおりです。
次のファイルを/etc/systemd/system/[email protected]/set-memhigh.conf
として作成します
[Service]
Type=simple
ExecStartPost=+/root/set-memoryhigh.sh %i
次のファイルを「/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
動作するかどうかを確認するには、
cat /sys/fs/cgroup/user.slice/user-${UID}.slice/memory.high
「/sys/fs/cgroup/user.slice」が存在しない場合、統合されたcgroup階層は有効になっていません。 https://unix.stackexchange.com/a/452728/297666 として有効にする必要があります
動作しますが、これが好きかどうかはわかりません...
7月25日に追加されたメモ:次のファイルを/etc/systemd/system/user-1000.slice
としてeachユーザー(ユーザーのUIDで1000を置き換える)は、そのユーザーにメモリ制限を課します。私はそれをubuntu 18.04のsystemd237で確認し、systemd237ストレッチバックポートからインストール:
[Slice]
Slice=user.slice
MemoryHigh=24G
不便なのは、eachユーザー用に上記のファイルを作成する必要があることです。 systemd239を使用すると、上記のファイルを/etc/systemd/system/user-.slice.d/memory.conf
として作成でき、メモリ制限がすべてのユーザーに課されます。しかし systemd 239にはバグがあります(このバグは240で修正されました)で、意図したとおりに機能しません。バグを回避するには、次のファイルをuser-0.slice
として作成し、systemctl enable user-0.slice
を実行します。ユーザーごとに次のファイルを作成する必要があるではありません。
[Unit]
Before=systemd-logind.service
[Slice]
Slice=user.slice
[Install]
WantedBy=multi-user.target