본문 바로가기

잡다/docker

[docker] Vmmem 이 지나치게 메모리를 잡아먹는 현상

문제점

 윈도우 운영체제에서 WSL2를 이용하여 도커 사용 중 우연히 작업관리자를 보았는데, Vmmem이라는 프로그램이 엄청난 양의 메모리를 사용하고 있다는 사실을 알게 되었다.

9GB에 달하는 엄청난 양의 메모리를 이용중이다.

 Vmmem은 윈도우 환경에서 WSL을 이용할 때 사용하는 프로그램으로, 윈도우 환경에서 리눅스 운영체제를 구현하기 위해 사용되는 가상 머신이라고 한다. 인터넷을 통해 찾아본 결과, 많은 사람들이 WSL 에서 WSL2로 업데이트 한 이후 메모리를 과다하게 이용 + 메모리 해제가 되지 않는 현상을 겪었다고 한다. 이 현상은 docker desktop을 이용할 때 더욱 두드러진다.

 docker-desktop 사용시 WSL2 환경에서 기본 운영체제 이외의 다른 서비스도 함께 시작되는데, 해당 환경들이 상당한 메모리를 잡아먹고도 제대로 메모리 해제를 수행하지 않는 것으로 보인다.


해결책

 현재로서는 메모리 사용량을 "줄이는" 방법은 없는 것으로 보이며, 대신 1) docker-desktop 을 종료하거나, 2) docker-desktop 의 메모리 사용량을 제한하는 방법을 사용할 수 있다.

docker-desktop 관련 가상환경 종료

콘솔 창에 다음 명령을 입력한다.

wsl --shutdown

현재 실행중인 wsl 기반 가상 환경을 모두 종료하는 코드이다. 해당 명령 사용 시 docker-desktop 환경을 모두 종료하기 때문에, 해당 환경에서 사용중이던 메모리를 돌려받을 수 있다.

메모리 사용량이 크게 줄었다.
docker-desktop이 Stopped 상태가 되었다.

단, 이 경우 docker을 사용할 수 없게 된다. 만약 docker을 다시 실행하고 싶다면, 다음 절차를 따른다.

  1. docker desktop 앱 열기
  2. 우상단의 벌레 모양(Troubleshoot) 클릭하기
  3. Restart Docker Desktop 실행하기

해당 절차를 따르면, docker-desktop이 Running 상태가 된 것을 볼 수 있다.

다만 이 방법은 일시적인 것으로, 도커를 사용하다 보면 다시 메모리 사용량이 증가할 수 있다는 단점이 있다.

docker-desktop 메모리 사용량 제한

 리눅스 환경이라면 docker desktop 의 설정 -> Resources -> ADVANCED 에서 직접 메모리 할당량 등을 지정할 수 있다고 하지만, 사실 리눅스 환경이었다면 이런 문제도 발생하지 않았을 것이다. 우리는 윈도우 환경이므로, 다음 설정을 수행해야 한다.

마이크로소프트 공식문서 : https://docs.microsoft.com/en-us/windows/wsl/wsl-config#example-wslconfig-file

요약하면 다음과 같다.

  • C:\Users\<username> 폴더에 .wslconfig 파일을 만든다. ( C:\Users\<UserName>\.wslconfig )
  • 공식 문서에서 설명하는 규칙에 따라 설정을 지정한다.
    [wsl2]
    
    # 메모리 크기 제한
    memory=4GB 
    
    # 사용할 가상 프로세서 개수 제한
    processors=2 
    
    # 이외 여러 설정들 ...

WSL 버전을 2에서 1로 다운그레이드

 인터넷을 계속 찾아본 결과, 일부 사람들은 WSL의 버전을 WSL2에서 WSL1으로 다운그레이드 한 이후 메모리 과사용 현상이 줄어들었다고 한다. 원한다면 해당 정보를 찾아보자.

검색어 추천 : downgrade from WSL2 to WSL1, revert from WSL2 to WSL1


 wsl2 환경이 전반적으로 wsl1에 비해 좀 더 리눅스에 가까운 환경이라고는 하나, 윈도우 및 리눅스 사이에는 분명한 차이가 있어, 이로 인해 발생하는 에러가 아직까지는 꽤 많다고 느낀다. 2022년 현 시점에서는 공식문서에서도 현재 글의 주제인 WSL2에서의 메모리 할당 및 해제 문제가 아직 해결되지 않았다고 설명하고 있으며, 메모리 사용량이 계속 늘어나다보면 전체 컴퓨터 환경에 문제가 생길 수도 있는 부분이므로, 윈도우 환경에서 WSL2에 기반한 docker 서버를 운영하는 것은 현 시점에서는 큰 의미가 없는 것 같다. 다행히도 대부분 상황에서 윈도우 서버 + 도커 의 조합이 보기 드물다는 점은 그나마 위안이 된다. 

 지금 도커를 윈도우 환경에서 제대로 이용하고 싶다면, 아직까지는 WSL2 보다는 WSL1이 더 나을 수 있어 보인다.

https://docs.microsoft.com/en-us/windows/wsl/compare-versions#exceptions-for-using-wsl-1-rather-than-wsl-2