현재 위치 - 인적 자원 플랫폼망 - 미니프로그램 개발 - 메모리 제한에 도달한 후 Docker 컨테이너의 동작
메모리 제한에 도달한 후 Docker 컨테이너의 동작
컨테이너가 전체 호스트보다 더 많은 메모리를 사용하도록 요청하면 커널은 메모리를 확보하기 위해 컨테이너 또는 Docker 데몬을 종료하여 모든 서비스를 사용할 수 없게 만들 수 있습니다. 이 오류를 방지하려면 각 컨테이너에 대해 적절한 메모리 양을 제한해야 합니다.

다음 구성을 사용하여 Docker-Compose 또는 Docker Stack 환경에서 컨테이너의 메모리 사용량을 제한할 수 있습니다.

다음으로, 위의 구성을 살펴보겠습니다. 메모리

컨테이너에 허용되는 최대 메모리 양은 4M입니다.

컨테이너가 제한보다 많은 메모리를 사용하여 GC 또는 Kill을 트리거하면 어떻게 될까요?

유감스럽게도 공식 문서에는 메모리 제한에 대해 자세히 설명되어 있지 않지만 Google에서 도움을 받을 수 있으며 다음 문서에서 몇 가지 단서를 찾을 수 있다.

실험 결과 프로그램이 제한보다 많은 메모리를 사용하면 컨테이너가 킬되는 것으로 나타났다.memory limit (cgroup의 리소스 _. 관리 _ 가이드/초-메모리).

요약하면, 이 실험에는 redis 컨테이너를 사용하여 메모리를 10M로 제한하고 많은 데이터를 redis에 추가한 다음 컨테이너의 상태를 확인할 수 있습니다.

우리는 실제로 컨테이너를 완전히 죽이는 것이 아니라 Redis가 정리 로직을 트리거하여 일정 시간 동안 서비스를 사용할 수 없게 만드는 것을 원합니다(다시 시작되기는 하지만).

어떻게 해야 할까요

다양한 조사 끝에 메모리 예약, 커널 메모리, 옴-킬-비활성화 등 정부에서 제공하는 다른 파라미터로는 문제가 해결되지 않는 것으로 밝혀졌습니다.

어리석게도 이 문제를 해결할 수 없는 것 같습니다. 프로그램의 GC를 트리거하려면 어떻게 해야 할까요?

일반적으로 프로그램은 메모리가 부족하다고 판단되면 자체 GC 메커니즘을 갖지만, 도커 컨테이너 메모리 제한 동작 이해 문서에서 설명한 것처럼 도커 컨테이너에서 실행되는 프로그램은 메모리 제한에 보이지 않으며, 프로그램은 여전히 도커 제한보다 큰 메모리를 요청하여 궁극적으로 OOM 킬로 이어집니다.

이것은 를 사용하려면 redis의 최대 메모리 구성 및 java의 JVM 구성과 같은 추가 프로그램을 구성해야 합니다. 안타깝게도 모든 프로그램이 mysql과 같이 자체 메모리 제한 설정이 있는 것은 아니므로 이 경우 프로그램 성능을 낮추고 프로그램에 충분한 메모리를 확보하는 것이 좋습니다.

서버에 스왑이 설정되어 있는 경우 또 다른 문제가 발생할 수 있습니다. 컨테이너가 메모리 제한에 도달하려고 할 때 특히 느려지고 디스크 IO가 높아집니다(피크).

메모리 스왑을 설정하지 않으면 메모리 제한 값의 두 배가 되는 메모리 스왑 매개변수도 무시되기 때문입니다. limit-memory=300M이 설정되어 있고 memory-swap이 설정되어 있지 않으면 컨테이너가 300M 메모리와 300M 스왑을 사용할 수 있다는 뜻입니다. /config/containers/resource _ constraints/#-memory.

스왑은 무손실이 아니라는 점에 주목할 필요가 있습니다. 대신 매우 느리기 때문에(메모리 대신 디스크를 사용하므로) 비활성화해야 합니다.

그러나 Synthesis Files v3는 아쉽게도 메모리 스왑 제한 설정을 지원하지 않습니다.

그렇다면 호스트 스왑을 끌 수밖에 없습니다.

메모리 제한에 도달하면 컨테이너가 전송하는 내용 요약:

ed