DB에서 왜 인덱스가 필요한지. 다양한 성능을 테스트 해보기 위해 docker로 mysql을 띄워서 삽입 및 입력 테스트를 해보려고 한다.🧐
이때, 제한을 걸어서 각각 단계마다 어떤 결과가 나오는지 보려고 한다.
DB에 데이터 삽입 및 쿼리를 날려보기 앞서 docker 컨테이너 자원 할당에 대해 훑고 가자.
제한하려는 자원 | 명령어 | 단위 |
---|---|---|
메모리 자원 할당 | --memory | m(megabyte), g(gigabyte) |
swap 메모리 자원 할당 | --memory-swap | m(megabyte), g(gigabyte) |
CPU 자원 할당 | --cpu-shares | 1024(1cpu) |
CPU 자원 할당 (호스트에 CPU가 여러 개 있을 때) | --cpuset-cpu | 사용하고 싶은 특정 cpu (0부터 시작합니다.) |
디스크 읽기 쓰기 속도 제한 | --device-write-bps, --device-read-bps | kb, mb, gb |
이미지 다운로드
$ docker pull mysql:8.0.27
MySQL 띄우기
docker run --name mysql-cpu1-memory64m -e MYSQL_ROOT_PASSWORD=root -d --cpu-shares=1024 --memory=64m -p 3309:3306 mysql:8.0.27
OOM(Out Of Memory) Error가 발생하면서 MySQL이 죽어버렸다.😇
docker run --name mysql-cpu1-memory128m -e MYSQL_ROOT_PASSWORD=root -d --cpu-shares=1024 --memory=128m -p 3309:3306 mysql:8.0.27
OOM(Out Of Memory) Error가 발생하면서 MySQL이 죽어버렸다.😇
docker run --name mysql-cpu1-memory256m -e MYSQL_ROOT_PASSWORD=root -d --cpu-shares=1024 --memory=256m -p 3309:3306 mysql:8.0.27
드디어 잘 돌아간다.😍
컨테이너의 리소스 사용량 통계를 보자.
docker stats mysql-cpu1-memory256m
docker desktop stats에는 228.3 MB이라고 나와있는데, 왜 다를걸꽈🧐 아무튼 이 정도의 메모리가 필요하구만!
Container가 Host의 OOM Killer
에 의해 중지된 경우 STATUS를 Exited (137) xxx ago와 같이 표시한다.
64mb랑 128mb는 중지된 것을 알 수 있다.
Docker and OOM(Out Of Memory) Killer란?
이렇게 memory commit에서는 먼저 주소값만 리턴하고, 해당 주소값에 쓰기 요청이 들어왔을 때 비로서 해당 주소값을 실제 물리 메모리에 바인딩하게 되는데, 이 때 실제 메모리와 가상 메모리공간(Swap memory)을 전부 활용해도 더 이상 메모리 확보가 불가능한 경우, 쓸모없다고 판단되는 프로세스를 강제 종료시켜 여유 메모리를 확보하는 Linux Kernel의 메커니즘을 OOM(Out Of Memory) Killer라고 한다.
여기에 들어가면, 기가 막힌 설명글이 있다.