메모리 누수를 방지하기 위해 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을 사용하여 리소스 제한을 구현하므로 서비스가 2GB 이상의 메모리를 사용하려고 하면 Cgroup이 이를 종료합니다. 다시 시작하는지 확인하려면 Restart=on-failure또는 Restart=on-abort(일 수도 있음 StartLimitIntervalSec)을 추가하세요.

~에서systemd.resourcecontrol:

최대 메모리 =바이트...이것은 memory.max제어 그룹 속성을 제어합니다.

이 답변을 작성할 당시 systemd는 이미 252이고 MemoryLimit더 이상 사용되지 않으므로(cgroup v1 옵션) 더 이상 설명서 페이지에 표시되지 않습니다.

~에서cgroup v2 문서존재하다 memory.max:

cgroup의 메모리 사용량이 이 제한에 도달하고 줄일 수 없는 경우 cgroup에서 OOM Killer가 호출됩니다.

관련 정보