メモリリークを防ぐためにsystemctlサービスを制限する方法

メモリリークを防ぐためにsystemctlサービスを制限する方法

私は次の考えを共有し、これが通常よりも多くのメモリを消費するようにsystemctlサービスを制限する正しい方法であることを理解したいと思います。

たとえば、特定のサービスが2G以上のメモリを使用できないように制限しているとします。

もしそうなら、私の提案は次のことです:

[Service]
MemoryAccounting=yes
MemoryCurrent=2097152 
MemoryLimit=2097152 

今最大の質問は、上記の設定でサービスが2Gに達するとどうなりますか?

いくつかのオプションがあります

  1. サービスが失敗する

  2. サービスが再起動されます

しかし、もちろん、メモリ消費が2G制限に達すると、サービスが再起動されることを好みます。

引用する -

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/resource_management_guide/sec-modifying_control_groups

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/resource_management_guide/sec-modifying_control_groups

https://superuser.com/questions/1761261/redhat-machine-rsyslogd-eating-up-10-gb

答え1

SystemdはCgroupを使用してリソース制限を実装するため、サービスが2 GB以上のメモリを使用しようとすると、Cgroupはそれを終了します。再起動するかどうかを確認するには、またはRestart=on-failureRestart=on-abortかもしれませんStartLimitIntervalSec)を追加します。

~からsystemd.resourcecontrol:

最大メモリ =バイト...これはmemory.max制御グループ属性を制御します。

この回答を書くと、systemdはすでに252であり、廃止されたためMemoryLimit(cgroup v1オプション)、ドキュメントページには表示されなくなります。

~からcgroup v2 ドキュメント存在するmemory.max

cgroupのメモリ使用量がこの制限に達して減らせない場合、cgroupはOOM Killerを呼び出します。

関連情報