저는 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=가 예상대로 작동합니다.