시스템 리소스 제한이 예상대로 작동하지 않습니다.

시스템 리소스 제한이 예상대로 작동하지 않습니다.

저는 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" 메모리가 512MB까지 올라가서 중지되지만 "VIRT" 메모리는 계속 올라가고 할당이 스왑을 사용하도록 전환됩니다. 스왑 공간이 모두 소모되면 운영 체제는 결국 애플리케이션을 종료합니다.

LimitAS 및/또는 LimitDATA 옵션을 사용하는 경우 예상대로 512MB에 도달하면 애플리케이션이 종료됩니다.

여기서 무슨 일이 일어나고 있는 걸까요? systemd는 LimitXXX보다 MaxMemory를 사용할 것을 권장합니다(참조여기), 그렇다면 왜 같은 방식으로 작동하지 않는 걸까요?

답변1

대답은 문서를 좀 더 주의 깊게 읽어보는 것입니다. 특히,이 구역:

전환을 쉽게 하기 위해 두 가지 버전의 설정 간에 변환하기 위해 모든 노력을 기울였습니다. 각 컨트롤러에 대해 통합 계층에 대한 설정이 존재하는 경우 이전 계층에 대한 모든 설정이 무시됩니다. 생성된 설정이 다른 유형의 계층 구조에 적합한 경우 구성은 적용되기 전에 변환됩니다.

여기서 두 번째 문장을 잘 이해하지 못하지만 내 시스템은 통합 계층 구조를 사용하지 않는 것 같습니다. 그리고 통합 계층 구조 전용 설정인 겉보기에 관련이 없어 보이는 또 다른 설정(AllowedCPUs=)이 있습니다. 이 옵션을 제거하면 MemoryMax=가 예상대로 작동합니다.

관련 정보