システムサービスの複数インスタンスの合計メモリ使用量の制限

システムサービスの複数インスタンスの合計メモリ使用量の制限

Ubuntu 16.04(まもなく18.04予定)で、一部の.NET Coreプロセスをsystemdサービスとして実行しています。次のシステム構成ファイル()があります。/lib/systemd/system/[email protected]

[Unit]
Description=My Service %i

[Service]
Type=simple
User=myservice
EnvironmentFile=/etc/environment
WorkingDirectory=/home/myservice/instances/%i
ExecStart=/opt/dotnet/dotnet My.Service.dll

[Install]
WantedBy=multi-user.target

制限したいみんなRAMの量みんなこのサービスのインスタンスを使用できます。単一インスタンスのRAMをそれ以下に制限したくないので、MemoryHigh同じ設定はMemoryMax役に立ちません。

私はsystemdがサービステンプレートのcgroupを生成することを知っているので、どういうわけかそのcgroupのメモリ制限を変更したいと思います。

Ubuntu 18.04では手動で編集できます/sys/fs/cgroup/memory/system.slice/system-myservice.slice/memory.limit_in_bytesが、これは基本的に私が望むことをしますが(合計メモリ使用量が制限を超えるとプロセスが終了します)、このアプローチにはいくつかの問題があります。

  • このファイルは、サービスが開始されるまで開始時には必ずしも存在しません。
  • Ubuntu 18.04では、systemctl daemon-reloadこのファイルを呼び出すたびに上書きされます。
  • ファイルに書き込もうとすると、時々返されることがあります。write error: Device or resource busy

(Ubuntu 16.04では、サービスが開始されるたびに制限がリセットされているように見えるため、何の効果もありません。)

システム自体でこの値を設定して戦う必要がないようにする方法はありますか?それとも、プロセスグループの総メモリ使用量を制限する他の方法はありますか?すべて同じユーザーとして実行されるため、そのユーザーが使用するRAMが制限される可能性があります。

手動でcgroup(cgcreate -t myservice:myservice -g memory:mycgroup)を作成し、ExecStartサービス構成をに変更しようとしましたが、再び機能しましたが/usr/bin/cgexec -g memory:mycgroup /opt/dotnet/dotnet My.Service.dll信頼できませんでした。私が書いたメモリ制限があるmemory.limit_in_bytes時点でリセットされたので、いつ、なぜそれがわからないのですか。

ベストアンサー1

いよいよ成功しました!秘密は、独自のスライスを作成し、それをサービスファイルに次のように設定することでした。

[Service]
# Everything else as in the original question
Slice=my_service_limit.slice

次に、次のようにスライスユニットファイルを作成します/lib/systemd/system/my_service_limit.slice

[Unit]
Description=Slice that limits memory for all my services

[Slice]
# MemoryHigh works only in "unified" cgroups mode, NOT in "hybrid" mode
MemoryHigh=500M
# MemoryMax works in "hybrid" cgroups mode, too
MemoryMax=600M

メモ:-で説明されているように、階層区切り記号と同様に、スライス名を指定するときは注意してください。https://systemd.io/CGROUP_DELEGATION- この機能を設定したいすべての人にとって非常に便利なページです。出力を見ると、サービスが実際に構成されたフラグメントを使用していることを確認できます。出力には次のものがsystemctl status myservice必要です。

  CGroup: /my_service_limit.slice/[email protected]

systemd.unified_cgroup_hierarchy=1(次のように)設定する必要はありません。松本龍太郎答え)MemoryMaxが機能するようにするには以前はMemoryHighに必要 - 「ハイブリッド」モード(Ubuntu 18.04のデフォルト)でも自動的に無視されます。

また、これは使用されている物理RAMにのみ適用されることに注意する価値があります。いいえ使用されたスワップ領域を含みます。 (MemorySwapMaxには別の設定があるようですが、MemorySwapHighはありません。)

おすすめ記事