システムリソース制限が期待どおりに機能しません。

システムリソース制限が期待どおりに機能しません。

私は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 =が期待どおりに機能します。

おすすめ記事