Docker Lab #4

반영환·2023년 6월 20일
0

Docker

목록 보기
13/18
post-thumbnail

Docker Week 4

실행중인 컨테이너가 호스트 시스템의 메모리를 너무 많이 사용하지 않도록 하는 것이 중요하다.

리눅스 호스트에서 커널이 중요한 시스템 기능을 수행하기에, 충분한 메모리가 없음을 감지하면 OOME 즉, Out Of Memory Exception을 발생시켜 프로세스를 우선순위에 따라 종료시킨다.

Docker는 Docker 데몬에서 OOM 우선 순위를 조정하여 시스템의 다른 프로세스보다 죽을 가능성을 줄여 전체 컨테이너가 종료되는 상황을 막으려 한다.

컨테이너의 OOM 순위는 변경이 가능하나 Docker 데몬이 마련한 안전장치를 부수는 행위는 하지 않아야 한다.

컨테이너에 적절한 메모리 요구 사항을 이해하기 위해 배포 전 반드시 부하 테스트를 실시해 컨테이너가 필요로 하는 메모리 요구사항을 받아 적절한 수준으로 메모리 할당량을 조정해야 한다.

Limit Memory

docker run -m= 500m ... 

메모리 스왑은 하지 않는 것이 목표이다. 성능을 우선시 해야하기 때문에 사전에 적절한 테스트와 메모리 할당으로 스왑할 상황을 만들지 않는 것이 우선시돼야한다.

docker run --name c1 -m 129m --memory-swap 129m -d smlinux/stress stress --vm 1 --vm-bytes 127m

OOM KILLER

시스템 콜을 통해 리눅스 커널에 메모리 할당을 요청하게 되면 커널이 물리 메모리 위에 바로 바인딩을 하는 것이 아니라, 요청한 메모리 영역의 주소값만을 반환하는데 이를 memory commit 이라고 한다.

메모리 커밋이 일어날 때 물리 메모리의 양보다 더 큰 영역을 할당할 수도 있는데 이를 memory over commit 이라고 하며,메모리 할당 요청이 들어온 시점과 실제로 바인딩 되는 시점 사이에 더 많은 프로세스가 메모리를 사용할 수 있도록 하기 위한 최적화이다.

memory commit에서 먼저 주소값만 리턴하고, 해당 주소값에 쓰기 요청이 들어왔을 때, 해당 주소값에 실제로 바인딩하게 되는데 이때 더이상 메모리 확보가 불가능한 경우 OOM score에 따라 프로세스를 강제 종료 시켜 여유 메모리를 확보한다.

프로세스마다 커널에 의해 -1000 ~ 1000 사이의 score가 매겨지는데, -1000에 가까울 수록 좋은 프로세스, 1000에 가까울 수록 나쁜 프로세스이다.

Restart

profile
최고의 오늘을 꿈꾸는 개발자

0개의 댓글