緊急時にttyセッションを作成し、メモリを大量に消費するXアプリケーションを終了できるように、少量のCPUとメモリを予約したいと思います。cgroupこの機能を提供してください。すべてのXアプリケーションを自動的にcgroupに入れるには?
答え1
私はDebianを使用しているので、ソリューションはsystemd
cgroupの実装に基づいています。
最初のステップはcgroups階層をチェックすることです:
> systemd-cgls
-.slice
├─user.slice
│ └─user-1000.slice
│ ├─[email protected]
.....
│ └─session-2.scope
│ ├─1376 lightdm --session-child 14 21
│ ├─1400 x-window-manager
.....
systemd
cgroup を端末セッションに自動的に割り当てます。 cgroup階層内にsession-*.scope
Xアプリケーションがあることを確認する必要があります。デフォルトのXセッション範囲番号は常に同じです。
範囲内のすべてのプログラムのメモリ制限を設定するには、次のように入力します。
> systemctl set-property session-2.scope MemoryLimit=14G
このコマンドは、再起動するまでメモリ制限をセッション2に設定します。
このルールを永久に作成するには、次の手順を実行します。
> sudo systemctl edit session-2.scope
テキストエディタに入力
[Scope]
MemoryLimit=14G
そして保存してください。このルールは再起動後も維持されます。同じファイルで異なるリソース制限を設定できます。
編集する
derobertが指摘したように、Xセッションの範囲番号は同じであることは保証されません。より安定した解決策は、実行時にこの数を決定することです。
文書/usr/local/bin/resource_limit.sh
:
#!/bin/bash
for s in $(systemd-cgls --no-pager --user-unit \
| grep --extended-regexp --only-matching \
'session-.{1,3}\.scope');do
systemctl set-property --runtime "$s" MemoryLimit="$1"
done
文書/etc/systemd/system/resource_limit.service
:
[Unit]
Description=Limit resources
Requires=multi-user.target
After=multi-user.target
[Service]
Type=oneshot
ExecStartPre=/bin/sleep 5
ExecStart=/usr/local/bin/resource_limit.sh 14G
ExecStop=/usr/local/bin/resource_limit.sh 20G
RemainAfterExit=true
[Install]
WantedBy=graphical.target
上記のファイルをシステムにコピーし、コマンドを実行します。
systemctl daemon-reload
その後、コマンドを使用して指定された制限(この場合は14G)を設定できます。
systemctl start resource_limit.service
設定を無効にするには、コマンドを使用します(いくつかのより高い制限設定)。
systemctl stop resource_limit.service
再起動時にこのスクリプトを自動的に実行するには、次のコマンドを実行します。
systemctl enable resource_limit.service
注1
X セッションが十分速く開始されない場合は、ExecStartPre
サービスを手動で有効にしてサービス待ち時間を増やす必要があります。
ノート2
[email protected]
わずかに大きな制限(ここでは1000はUIDです)を追加することをお勧めします。これにより、システムデーモンには常に利用可能なリソースがあります。