編集する

編集する

緊急時にttyセッションを作成し、メモリを大量に消費するXアプリケーションを終了できるように、少量のCPUとメモリを予約したいと思います。cgroupこの機能を提供してください。すべてのXアプリケーションを自動的にcgroupに入れるには?

答え1

私はDebianを使用しているので、ソリューションはsystemdcgroupの実装に基づいています。

最初のステップはcgroups階層をチェックすることです:

> systemd-cgls
-.slice
├─user.slice
│ └─user-1000.slice
│   ├─[email protected]
.....
│   └─session-2.scope
│     ├─1376 lightdm --session-child 14 21
│     ├─1400 x-window-manager
.....

systemdcgroup を端末セッションに自動的に割り当てます。 cgroup階層内にsession-*.scopeXアプリケーションがあることを確認する必要があります。デフォルトの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です)を追加することをお勧めします。これにより、システムデーモンには常に利用可能なリソースがあります。

関連情報