1. WSL2의 문제
새로운 노트북을 구입하였기에 개발 세팅을 하였다. 그리고 오늘 외출할 일이 있어 배터리만으로 사용을 하였는데 배터리 소모가 너무 빨랐다. 스펙상 17시간을 곧이곧대로 믿은 건 아니었지만 생각보다 너무 빨랐다. 별다른 작업을 하지도 않는데 6시간도 되기 전에 0%가 되는 속도였다.
무엇이 문제일까 살펴보다가 발견한 점이 몇 가지 있는데. 그중 한 가지가 개발환경 설치로 인해 인스톨하였던 wsl2기반 docker desktop이었다. wsl2기반 docker을 사용하면 필연적으로 프로세스에 vmmem 프로세스가 등장한다. 자세하게 아는 것은 아니지만 이는 도커, 우분투 터미널 등과 관련 있는 가상 머신 관련 프로세스일 것이다. 문제는 hyper-v와 다르게 이 것의 메모리 소모량이 어마 무시하게 높다는 것이다. 구형 노트북에서는 hyper-v였으나, 이런 문제가 없었다.
2. MS 측은 이 문제를 파악하고 있는가?
WSL2 github에는 이 램 소모에 대한 이슈도 등장했고 해결이 어려운지 1년이 넘는 기간 동안 open 상태이다.
https://github.com/microsoft/WSL/issues/4166
하지만 현재까지 MS가 내놓는 뚜렷한 해결책이 없다. 도커를 안 쓸 수도 없고.. hyper-v로 사용하자니, 내 운영체제는 Home이라 사용할 수 없다. 업그레이드할 수는 있지만, 귀찮고 번거롭다.. 그렇다고 놔두면 어마어마한 배터리 소모량은 필연적으로 따라온다.
3. 문제의 원인은 무엇인가?
외국 웹을 뒤져보니 알 수 있었는데 문제는 크게 두 가지의 특성이 결합돼 생긴 문제였다.
- 리눅스에서 파일 액세스할 때, 리눅스 OS는 그 정보를 캐시로 사용하기 위해 메모리에 보존한다.
이는 메모리가 부족해 더 이상 보존할 수 없을 때까지 반복된다. - WSL2는 Linux의 메모리 사용량에 따라 사용 메모리 크기를 동적으로 증가/감소시킨다.
시뮬레이션을 돌려보자.
- 리눅스에서 파일 액세스의 정보를 WSL2에서 배당받은 메모리에 보존한다.
- 이는 파일 열람을 할 때마다 매번 발생한다.
- 리눅스의 배당받은 메모리가 한계에 달한다.
- WSL2가 메모리를 추가 할당한다.
- 리눅스가 배당받은 메모리가 한계에 달한다.
- 무한 악순환
웹에서 조사한 내용이니 다소 다를 수도 있지만, 대강 이런 문제인듯하다. 이는 최대 PC 메모리 사용량의 80%까지(16g 메모리는 12.8G) 악순환이 반복된다 하니 무시 못할 문제이다. MS 측이 쉽게 해결하지 못하는 것을 보니, 고질적이고 근본적인 이슈로 보인다. 경위야 어찌 됐든 우리는 우리의 메모리를 아껴줄 필요가 있다. 그러지 않으면 도커 컨테이너를 사용하면서 코딩을 하면 메모리 사용량이 천정부지 치솟는 지옥도를 몸소 체감할 수 있을 것이다. (+ 발열)
4. 어떻게 대처할까?
인터넷에서 수시간 조사, 개인적으로 생각한 결과 대강 세 가지 방법이 있었다.
- WSL2에 메모리 할당 강제
- 리눅스 OS 안에서 메모리 대처
- 사용할 때만 Docker Desktop을 쓰자
위에서부터 천천히 알아보도록 하겠다.
4-1. WSL2에 메모리 할당 강제
이는 wsl2의 컨테이너에 할당되는 메모리를 강제하는 방식이다. 먼저 자신의 유저 디렉터리 밑( C:\Users\사용자이름 )에. wslconfig 파일을 하나 만들어준다. 그 뒤 아래의 내용을 적어준다
[wsl2] memory=6GB swap=0 |
memory의 설정은 자신의 컴퓨터 메모리의 여유 정도를 봐가며 설정하자.
이로써 메모리 할당 문제에 대해 임시방편적 대처가 가능하다. 적용이 됐나 확인을 해보자. 우분투 컨테이너에서 free -h로 메모리 사용량을 확인하는 방법으로 진행했다.
이는. wslconfig 파일을 만들기 전에 실행한 컨테이너이다.
이는. wslconfig 파일을 만든 뒤 실행 컨테이너이다
확실히 차이가 보인다. 임시방편이기는 하지만 가장 확실한 방법이다. swap은 비활성화하면 리눅스가 메모리가 부족하게 되어 이상 행동을 일으킬 수 있지만, 활성화하면 SSD에서 input/output이 많이 발생하기에, SSD 수명을 단축시킬 수 있단다. 내 노트북에서 하는 작업이 프로덕션 작업도 아니니, 나는 비활성화 처리를 하였다.
4-2. 리눅스 OS 안에서 메모리 대처
두 번째 방법은 리눅스 OS 안에서 stress를 이용해 대처하는 방법이다. stress는 여러 가지 상황에서 테스트를 하기 위해, 그에 걸맞은 환경을 제공해주는 소프트웨어이다. 이에 포함된 기능이 메모리 제한 기능인데, 이를 이용하면 메모리를 효율적으로 제한할 수 있다. 먼저 stress를 설치하자
root@9c5728b82080:/# apt install -y stress |
그 뒤 테스트를 해보겠다. 먼저 설치만 하고 어떤 행동도 하지 않은 우분투 20 기본 상태의 메모리 사용량이다. vmmem이 1.4G로 되어있는 것을 확인할 수 있다.
그 뒤 아래의 명령어로 메모리를 제한한다.
root@9c5728b82080:/# stress --vm 1 --vm-bytes 800m --vm-keep |
이는 프로세스 한 개(vm)의 메모리를 800m로 제한한다.라는 의미이다. 이러고 작업 관리자에서 메모리 사용량을 확인해보면, 1.4G에서 추가로 800m가 더해져 2.2G로 제한된 것을 알 수 있다.
시험 삼아 6G를 늘려보았다.
7.6G로 사용되는 것을 볼 수 있다. 이 상태에서는 메모리가 할당받은 상태로 동작하니(--vm-keep) 리눅스 운영체제가 이 이상 메모리를 할당하지 못할 것이다. 자신의 상황에 맞추어 프로세스 수(--vm) 메모리 할당량(--vm-bytes)을 조절하여 사용하면 될 것이다. 백그라운드 실행은 가장 뒤에 &를 붙여주고 사용하면 된다.
4-3. 사용할 때만 Docker Desktop을 쓰자
어떻게 대처할까 싶어 몇 번 동작을 확인해봤다. vmmem의 메모리 소모량은 이하의 순과 같았다.
경우 | 메모리 소모량 |
Docker desktop, Ubuntu terminal 기동 직후 | 약 1.3G |
Docker desktop 기본 ( 실행컨테이너0 ) | 약 1.3G |
Ubuntu termianl 기동 직후 | 약 400M |
둘 다 기동하지 않음 | 0 (vmmem 종료) |
이를 보고 우분투 터미널도, 도커 데스크톱도 "필요할 때만 기동 하자"라는 결론에 다다랐다. 기본 실행 1.4G도 무시 못할 메모리 사용량이니 사용하지 않을 때는 꺼주는 게 어찌 보면 가장 확실한 방법이다. 우분투 터미널은 부팅 시 바로 시작되지 않으니 별 문제가 없는데, Docker Desktop은 기본 실행이 디폴트이다. 때문에 부팅 시 자동실행을 꺼주기로 했다.
도커 설정에 들어가서 작업표시줄의 도커 아이콘으로 설정에 진입, general에 들어가 start docker desktop when you log in의 체크를 해제해주면 된다.
그런데 이렇게 좀 사용하다 보니 매번 터미널 작업 중에 docker desktop을 찾아서 사용하는 것이 너무 귀찮았다.. 그래서 파워쉘로 스크립트를 하나 만들었다. (나는 도커 작업을 파워쉘로 하는 편이다)
내용은 별거 없는데 docker desktop.exe 파일을 실행시켜주는 커맨드이다. 내 경우는 기본 경로인데 본인의 docker desktop 설치경로가 기본 설정과 다르다면 수정해 적용하도록 하자. 그리고 이 파일을 적당한 디렉터리에 넣어주고디렉터리 경로를 복사한다. 이는 디렉토리 경로를 path환경변수에 추가하기 위함이다.
그리고 아래의 작업으로 패스를 추가해준다.
그리고 사용했더니 에러가 떴는데 Set-ExecutionPolicy Unrestricted 명령어로 해결 가능하다
다시 실행해보니 성공
원래 스크립트에 매개변수를 넣어서 시작, 종료 설정을 한 스크립트 안에서 조작할 수 있도록 하려 했는데 생각보다 어렵고 잘 안돼서 docker desktop 시작만(....) 스크립트로 만들었고 사용 안 할 때 종료는 수동으로 종료해주려 한다. 혹시 더 좋은 방법을 아시는 분이 있으시다면 공유해주시면 좋을 것 같다. 앞으로는 작업을 시작하기 전에 stdoc.ps1 명령어로 간단하게 흐름 끊기는 일 없이 진행할 수 있을 것이다.
5. 마치며
vmmem 메모리 문제와 임시방편에 대해 알아보았다. 자신의 상황에 맞추어 위 방법들을 활용하면 메모리 소모량을 최소화할 수 있을 것이다. 하지만 사실 이 방법들은 근본적인 방법이 아닐 뿐만 아니라, 메모리의 사용을 유연하게 가져갈 수 있는 wsl2의 장점도 살릴 수 없는 좋지 못한 방법이다. 빨리 MS 측에서 이 문제를 개선하여 쾌적한 가상 환경 라이프를 즐길 수 있으면 좋겠다.
'운영체제 > Docker(vmware)' 카테고리의 다른 글
docker ps 명령어 / 옵션 정리 (0) | 2020.08.12 |
---|---|
Windows 10 Home에서 Docker 사용하기 (feat. wsl2) (1) | 2020.07.23 |