깃허브 블로그 글을 작성하던중…
갑자기 컴퓨터가 끊기는 느낌이 들어서 메모리를 확인해보니 vmmem이라는 프로세스가 혼자서 8기가를 점유하고 있었습니다.
vmmem?
무슨 프로세스인지 몰라서 인터넷에 검색해보니 hyper-v, virtualbox라는 가상 머신 플랫폼으로 도커를 사용할 때 필요한 프로세스인 것 같습니다.
vmmem은 왜 이렇게 메모리를 많이 먹는가?
리눅스에서 파일을 액세스할 때, 리눅스 OS는 해당 데이터를 캐시로 사용하기 위해서 메모리에 보존하게 됩니다.
이 과정은 메모리가 부족해서 더 이상 보존할 수 없을 때 까지 반복됩니다.
WSL2는 Linux의 메모리 사용량에 따라 사용 메모리 크기를 동적으로 증가/감소 시킵니다.
즉 오래하게 사용하게 되면서 파일을 여러번 열게 되면 WSL2가 계속해서 메모리를 동적할당을 해서 메모리를 할당하게 되고 엄청나게 높은 메모리를 점유하게 되는 것입니다.
github issue에 해당 문제가 등록되어 있습니다.
https://github.com/microsoft/WSL/issues/4166
해당 issue를 보면 현재 빌드 20175에서 기본 메모리 할당을 호스트 메모리의 50% 또는 8GB로 조정하도록 하여 계속해서 할당하는 것을 방지한 것 같습니다. (이 패치 이전에는 80%를 사용했다고 합니다.)
https://docs.microsoft.com/en-us/windows/wsl/release-notes#build-20175
메모리를 할당하는 것을 줄일 수는 없을까?
https://github.com/microsoft/WSL/issues/4166
위의 이슈를 보면 메모리 사용을 줄이기 위해 2가지 방법을 사용하는 것 같습니다.
WSL2 재시작
powershell에서 다음 명령을 사용하여 WSL2를 종료하면 점유하고 있던 메모리를 다시 줄일 수 있습니다.
wsl --shutdown
다시 시작하려면 터미널을 다시 실행시키거나 docker desktop을 사용중일 경우 restart 시킬지 물어보기 때문에 restart를 눌러서 시작하면 됩니다.
.wslconfig 파일 사용하기
wsl2에서 메모리를 많이 할당할때마다 재시작을 하면 끝도 없이 재시작하게 될 것입니다.
그래서 wsl이 할당할 수 있는 메모리양을 .wslconfig 파일을 이용해서 지정할 수 있습니다.
-
win + r
키를 입력하여 실행창을 킨후%userprofile%
을 입력하고 실행하면 사용자의 홈 디렉터리가 나옵니다. -
해당 디렉터리에
.wslconfig
파일을 만듭니다. -
.wslconfig
파일을 다음과 같이 작성합니다.
[wsl2]
memory = 6GB
swap=0
위의 내용에서 메모리 부분을 자기가 설정하고 싶은 메모리로 지정하면 됩니다.
너무 작은 메모리를 줄 경우 wsl이 계속해서 뻗을 수 있으므로 자신에게 맞는 값을 잘 확인해야 합니다.