저는 Docker(v20.10.12) 컨테이너가 실행되는 Ubuntu 18.04 서버를 실행하고 있습니다. 한 번에 약 5개의 컨테이너가 실행되고 있으며 일반적으로 약 1.5GB의 메모리를 소비하는 반면 내 서버에는 8GB의 메모리가 사용 가능합니다. 이 5개 컨테이너 중 하나는 18~24시간마다 메모리 누수를 일으키고 나머지 메모리를 모두 소모하며 스왑에 약 4~5GB를 사용하므로 CPU 및 디스크 사용량이 100%로 급증하고 이로 인해 OOM 킬러가 생성되고 컬링 프로세스를 시작하고 그 중 하나가 dockerd입니다.
dockerd가 종료된 후에는 메모리 누수가 발생한 해당 컨테이너의 로그를 찾을 수 없습니다. 파일 시스템에 있는 유일한 로그는 dockerd가 다시 시작된 후 생성된 컨테이너이기 때문입니다. 그래서 저는 로그 없이 그 컨테이너에서 실제로 무슨 일이 일어났는지 완전히 알지 못하며 이것이 바로 제가 찾으려고 하는 것입니다.
어떤 컨테이너가 유출되었는지 파악 grep VmPeak /proc/{PID}/status
하고 PID를 얻었습니다 docker inspect -f '{{.State.Pid}}' {CONTAINER_ID}
. 한 경우에는 최대 11GB의 메모리 사용량이 나열되었습니다. 하지만 /var/lib/docker/containers/
모든 폴더 에 가서 확인해 보니 실제 OOM 킬러 스와이프 및 dockerd 재시작 시간 이전에는 로그가 하나도 없었습니다. 또한 살펴보았지만 var/log/syslog
OOM 킬러가 작업을 수행하고 다양한 네트워크 및 방화벽 오류로 인해 당황한 Dockerd만 표시되었습니다. 제가 틀렸고 syslog를 자세히 조사해야 한다면 알려주시기 바랍니다.
반드시 이러한 로그를 가져올 필요는 없습니다. 다음에 충돌이 발생할 때 확인할 수 있도록 로그를 다른 곳에 보존하는 다른 솔루션을 설정하는 데 도움이 되는 것도 매우 도움이 되며 문제를 해결할 수도 있습니다. 그러나 이것은 당면한 문제와 관련이 없으므로 무시해도 이해됩니다.