프로그램이 실행될 때 cgroup을 사용하여 메모리 제한

프로그램이 실행될 때 cgroup을 사용하여 메모리 제한

cgroup을 생성하고 cgroup에 200MB의 메모리 제한을 연결한다고 가정합니다. 그런 다음 cgroup 내에서 메모리 집약적인 프로세스를 실행했는데 200MB 제한을 모두 사용했습니다.

프로세스가 실행되는 동안 프로세스의 메모리 소비를 줄이는 것이 가능합니까? 그러면 프로세스가 이미 실행 중이고 200MB를 사용하고 있는 경우 100MB로 제한을 설정할 수 있나요? 그렇다면 커널은 cgroup이 사용하고 있는 100MB의 메모리를 얼마나 빨리 해제하며, 프로세스가 해당 메모리에 액세스하려고 하면 어떻게 됩니까?

답변1

예, "할당"의 의미에 따라 다릅니다. 수량을 줄이거나 늘릴 수 있습니다물리적프로세스에 사용 가능한 메모리입니다.

사용 중인 메모리에는 다음이 포함됩니다.

  • 프로세스에 매핑된 디스크 이미지(예: 공유 라이브러리, 실행 파일)
  • IO 캐시 계층에 의해 캐시된 디스크 페이지
  • 익명 메모리는 스왑에서 지원될 수도 있고 지원되지 않을 수도 있습니다.

cgroup을 줄일 때 memory.limit_in_bytes시스템은 디스크 캐시와 디스크 이미지(예: 실행 파일)에서 페이지를 삭제합니다. 필요한 경우 이러한 페이지를 항상 다시 로드할 수 있기 때문입니다.

스와핑이 활성화된 경우 익명 메모리를 호출할 수도 있습니다.

프로세스에 대한 cgroup을 생성하고 제한을 설정하십시오.

# Create a cgroup
mkdir /sys/fs/cgroup/memory/my_cgroup
# Add the process to it
echo $PID > /sys/fs/cgroup/memory/my_cgroup/cgroup.procs

# Set the limit to 40MB
echo $((40 * 1024 * 1024)) > /sys/fs/cgroup/memory/my_cgroup/memory.limit_in_bytes

시스템은 한도 미만이 될 때까지 즉시 교체하며 프로세스를 한도 미만으로 유지하기 위해 계속 교체합니다.

커널이 처음에 프로세스나 그룹을 제한 아래에 두는 것이 불가능하다면(일부 메모리를 스왑할 수 없기 때문에, 예를 들어 스왑이 없거나 일부 커널 페이지를 스왑할 수 없는 경우) 오류가 발생합니다. 한도는 변경되지 않습니다.

나중에 이 작업을 수행할 수 없는 경우 OOM 킬러는 프로세스(또는 해당 하위 프로세스 중 하나)를 종료합니다.

키를 사용하여 그룹의 프로세스를 일시 중지할 수 있지만 oom_control제한을 높이거나 하나 이상의 프로세스를 종료하여 문제를 직접 해결해야 합니다.

추가 정보

열쇠 도 있습니다 memory.soft_limit_in_bytes. 이는 oom Killer를 호출하지 않지만 이를 사용하여 시스템에 메모리가 부족할 때(그리고 다른 경우에도) 먼저 교체할 프로세스를 결정합니다.

프로세스나 그룹 내에서

프로세스는 현재 사용량과 하드 및 소프트 제한을 쿼리하도록 인코딩하여 메모리 제한을 인식할 수 있습니다. 그런 다음 제한 위반을 방지하기 위한 조치를 취할 수 있습니다. 예를 들어 메모리 할당, 하위 프로세스 생성, 새 연결 허용 또는 기존 연결 종료와 같은 사용량 감소 등을 수행할 수 있습니다.

프로세스는 cgroups 알림 API를 사용하여 알림을 구독할 수 있습니다.

당신은 또한 볼 수 있습니다

커널 문서는 다음 위치에 있습니다.

답변2

아니요, 실행 중인 프로그램이 성공적으로 메모리를 할당하면 해당 메모리를 제거할 수 없습니다.

또한 프로세스에서 사용하는 메모리에는 제한이 있습니다. 이를 초과하면 커널이 가장 많은 메모리를 사용하는 cgroup의 프로세스를 종료하게 되지만 프로그램 내에서는 메모리 할당 오류가 발생하지 않습니다.

관련 정보