私はsystemd 245でUbuntu 20.04を実行しています。
私はsystemdのリソース制御機能、特にメモリ使用量制御をテストしています。私のユニットファイルの関連部分は次のとおりです。
[Unit]
Description=...
...
[Service]
...
MemoryMax=512M
#LimitAS=512M
#LimitDATA=512M
これシステム文書MemoryMaxに達すると、「メモリ不足キラー」によってサービスが終了すると主張します。
ただし、次のC ++コードなど、この制限を克服するように設計されたコードを実行すると、次のようになります。
int main()
{
while (true)
char *p = new char[100];
}
代わりに、(htopで見ると)「RES」メモリは512 MBまで上がって停止しますが、「VIRT」メモリは上がり続け、割り当てはスワップを使用するように切り替えられます。スワップ領域がすべて消費されると、オペレーティングシステムは最終的にアプリケーションを終了します。
LimitASおよび/またはLimitDATAオプションを使用している場合、期待どおりに512MBに達するとアプリケーションはシャットダウンします。
ここで何が起こっているのでしょうか? systemdはLimitXXXよりMaxMemoryを使用することをお勧めします(参照ここ)、それではなぜ同じように動作しないのですか?
答え1
答えは、文書をもっと注意深く読むことです。特に、このゾーン:
移行を容易にするために、2つのバージョンの設定を変換するためにすべての努力を払いました。各コントローラに統合レイヤーの設定が存在する場合、前のレイヤーのすべての設定は無視されます。生成された設定が他の種類の階層に適している場合、構成は適用前に変換されます。
ここでは2番目の文をよく理解していませんが、私のシステムは統合階層を使用していないようです。また、統合階層専用の設定である見かけには無関係に見える別の設定(AllowedCPUs=)があります。このオプションを削除すると、MemoryMax =が期待どおりに機能します。