WSL2 튜닝 — 메모리·systemd·DNS·I/O 한 번에 잡기
WSL2를 설치한 다음 가장 자주 막히는 7가지 — .wslconfig·systemd·DNS·디스크 압축·VS Code 통합·네트워크.
Windows 11 초기 셋업에서 WSL2를 설치했다면 두 번째 단계는 튜닝이다. 기본값 그대로 쓰면 메모리 폭주·DNS 단절·디스크 비대화·systemd 부재 같은 문제가 누적된다. 이 가이드는 7가지 튜닝을 한 번에 정리한다 — 한 번 적용하면 매일 누리는 차이가 크다.
대상: Windows 11 (22H2 이상) + WSL2 + Ubuntu (또는 다른 systemd 기반 배포판).
TL;DR
| 튜닝 | 파일 | 효과 |
|---|---|---|
1. .wslconfig | %USERPROFILE%\.wslconfig (Windows) | 메모리/CPU/스왑 한도 + GUI · 미러 네트워크 |
2. wsl.conf systemd | /etc/wsl.conf (WSL 내) | systemd 활성화 → snap·docker·systemctl 정상 |
| 3. DNS 안정화 | /etc/wsl.conf + /etc/resolv.conf | 회사 VPN·재부팅 후 DNS 끊김 방지 |
| 4. I/O 성능 | 작업 위치 선택 | Windows 경로(/mnt/c/...) 대신 WSL 네이티브(/home/...) 사용 |
| 5. 디스크 압축 | export/import | 늘어난 vhdx 다시 축소 (수십 GB 회수 가능) |
| 6. VS Code Remote-WSL | 확장 1개 | WSL의 파일을 네이티브 속도로 편집 |
| 7. 미러 네트워킹 | .wslconfig networkingMode=mirrored | VPN·회사망 친화 (Win11 22H2+) |
사전 조건
- Windows 11 22H2 이상 (일부 기능은 23H2+ 권장)
- WSL2 설치됨 + Ubuntu (또는 systemd 기반 배포) 1개 이상
- 미설치: 관리자 PowerShell에서
wsl --install
- 미설치: 관리자 PowerShell에서
- 관리자 권한 (
.wslconfig는 사용자 폴더라 일반권한 OK,wsl --shutdown은 관리자 권장)
1. .wslconfig — 메모리·CPU·스왑 한도
기본값으로는 WSL이 Windows RAM의 절반까지 점유 가능 → 큰 Node 빌드 시 Windows 본체가 스왑에 빠진다. 명시적으로 한도를 둔다.
1.1 템플릿 다운로드
.wslconfig# PowerShell
Invoke-WebRequest -Uri https://devalice.jaceclub.com/assets/windows/wsl-tuning/wslconfig-template.txt -OutFile $env:USERPROFILE\.wslconfig
Get-FileHash $env:USERPROFILE\.wslconfig -Algorithm SHA256
# 기대값: bfbdaf7ae486916d8aa4e792f9845416e1b6b6ea535f84e1bbcca2be9accb3c41.2 핵심 설정
# %USERPROFILE%\.wslconfig
[wsl2]
memory=8GB # 호스트 RAM의 50~75%
swap=4GB # 디스크 스왑 (0 = 비활성)
localhostForwarding=true
guiApplications=true # Linux GUI 앱 (Win11 기본 활성)
# processors=8 # 명시적 코어 제한 (선택)1.3 적용
wsl --shutdown # 모든 WSL 인스턴스 종료
wsl # 재시작 시 .wslconfig 자동 반영1.4 확인
WSL 안에서:
free -h # 메모리 한도 = 8GB 확인
nproc # CPU 개수
swapon --show # 스왑 활성 여부RAM이 16GB인 머신은
memory=10GB정도가 적정. 32GB 머신은memory=16GB권장.
2. systemd 활성화 — /etc/wsl.conf
WSL2 기본 init은 systemd가 아니라 자체 init. Ubuntu 22.04+ 등 systemd 의존 패키지(docker, snap, postgresql 서비스 등)가 정상 동작하지 않는다.
2.1 활성화
# WSL 안에서 (sudo 필요)
sudo nano /etc/wsl.conf내용:
[boot]
systemd=true
[user]
default=me # 기본 사용자 (선택)저장 후:
# Windows PowerShell
wsl --shutdown
wsl2.2 확인
ps -p 1 # PID 1이 systemd면 성공
systemctl status # systemd 상태 표시되면 OK이제 sudo systemctl start docker 같은 명령이 정상 동작.
활성화 후 부팅 시간이 1~3초 늘어남. 대신 서비스 매니저·로그 통합·tab completion 등 ergonomics 큰 폭 개선.
3. DNS 안정화
WSL2의 기본 DNS는 Windows의 NAT 인터페이스를 거치는데, VPN 연결/해제, 재부팅 후 종종 끊긴다. 증상: curl github.com 은 되지만 apt update 가 안 되거나 그 반대.
3.1 옵션 A — 자동 DNS 비활성화 + 고정 DNS
sudo nano /etc/wsl.conf추가:
[network]
generateResolvConf=false저장 → wsl --shutdown 후 재시작.
이제 WSL이 /etc/resolv.conf를 건드리지 않음. 수동 작성:
sudo nano /etc/resolv.confnameserver 1.1.1.1
nameserver 8.8.8.8
회사망/VPN 사용 시: 사내 DNS 추가 (회사 IT에서 안내받은 IP).
3.2 옵션 B — 미러 네트워킹 (Win11 22H2+, 권장)
3.1 대신 7장 미러 네트워킹으로 가면 DNS도 Windows 호스트와 동일 → 자동 해결. 회사 VPN 환경에서 가장 안정.
4. I/O 성능 — 어디서 작업할 것인가
가장 자주 놓치는 부분. WSL2의 파일시스템 성능 차이:
| 작업 위치 | 경로 예시 | 빌드 속도 (npm install 기준) |
|---|---|---|
| WSL 네이티브 | /home/me/project | ✅ 빠름 (Linux ext4) |
| Windows mount | /mnt/c/Users/me/project | ❌ 5~10배 느림 (9p 프로토콜) |
원칙: WSL 안의 작업은 WSL 디스크 안에서. Windows 본체에서 같은 파일을 자주 봐야 한다면 VS Code Remote-WSL(6장) 또는 Syncthing(Mac↔Win 파일 동기화 참고)으로 양쪽 사본 유지.
4.1 좋은 패턴
# WSL 안
mkdir -p ~/work
cd ~/work
git clone git@github.com:org/repo.git
cd repo
npm install # 빠름4.2 피할 패턴
# 윈도우에서 클론하고 WSL에서 빌드
cd /mnt/c/Users/me/Documents/project # cross-mount
npm install # 느림 (수십 분)4.3 cross-mount가 필요한 경우
- Windows 도구로도 같은 폴더를 직접 열어야 하는 경우 (Photoshop 등 — 드물다)
- Windows 본체에서 IDE 사용 — 이건 VS Code Remote-WSL로 해결 가능
5. 디스크 사이즈 관리 — vhdx 압축
WSL의 가상 디스크 .vhdx는 한 번 커지면 자동으로 줄지 않는다. 30GB 빌드 캐시를 만들고 지워도 파일은 30GB로 남는다.
5.1 현재 사이즈 확인
# PowerShell
Get-ChildItem -Path "$env:LOCALAPPDATA\Packages" -Recurse -Filter "ext4.vhdx" | ForEach-Object {
"{0,-60} {1:N2} GB" -f $_.Directory.Name, ($_.Length / 1GB)
}5.2 옵션 A — Sparse VHD (Win11 22H2+)
.wslconfig에 (이미 1.2 템플릿에 주석으로 포함):
[experimental]
sparseVhd=truewsl --shutdown 후 자동 활성. 사용 안 하는 공간이 점진적으로 회수됨.
5.3 옵션 B — 수동 압축 (diskpart)
WSL을 종료한 상태에서:
wsl --shutdown
diskpart
# diskpart>
select vdisk file="C:\Users\me\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_*\LocalState\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit수십 GB 단위로 회수 가능. 시간이 오래 걸리니 야간 작업 권장.
5.4 옵션 C — Export/Import (가장 깨끗)
WSL 인스턴스를 통째로 백업 후 재생성. 새 vhdx는 사이즈가 최적화됨.
wsl --shutdown
wsl --export Ubuntu C:\backup\ubuntu.tar
wsl --unregister Ubuntu
wsl --import Ubuntu C:\WSL\Ubuntu C:\backup\ubuntu.tar옵션 C는 가장 효과적이지만 인스턴스 ID·인스톨 메타가 새로 생성된다. systemd 옵션·기본 사용자 등 재설정 필요. 이주 시점에 함께 진행 권장.
6. VS Code Remote-WSL
WSL의 파일을 Windows VS Code에서 네이티브 속도로 편집. cross-mount 문제 해결의 표준 답.
6.1 설치
Windows VS Code 확장 마켓에서:
- Remote - WSL (
ms-vscode-remote.remote-wsl)
또는 명령줄:
code --install-extension ms-vscode-remote.remote-wsl6.2 사용
WSL 안에서:
cd ~/work/repo
code .→ Windows VS Code가 열리고 좌측 하단에 WSL: Ubuntu 표시. 파일 시스템·터미널·확장 모두 WSL 안에서 동작.
또는 Windows VS Code의 Command Palette → WSL: Connect to WSL → 폴더 선택.
6.3 권장 확장 (WSL 안 자동 설치)
WSL Remote에 첫 연결 시 일부 확장은 "WSL 쪽에 설치하시겠습니까?" 묻는다. 다음은 WSL 쪽 설치 권장:
- ESLint / Prettier
- Python / Pylance
- Go / Rust-Analyzer
- Docker
7. 미러 네트워킹 (Win11 22H2+)
3장의 DNS 안정화를 더 우아하게 해결. WSL이 Windows 네트워크 인터페이스를 그대로 미러링 → VPN·회사망·DNS·localhost 모두 호스트와 동일.
7.1 활성화
.wslconfig에:
[wsl2]
networkingMode=mirrored
[experimental]
dnsTunneling=true
autoProxy=truewsl --shutdown 후 재시작.
7.2 효과
- VPN 연결 시 WSL도 자동으로 VPN 경유 (별도 설정 불요)
- 회사 프록시 Windows의 IE/Edge 프록시 자동 반영
- localhost Windows ↔ WSL 양방향 자동 연결 (
localhostForwarding불필요) - DNS Windows의 DNS 그대로 → 가장 안정
7.3 주의
- Docker Desktop과 충돌하는 경우가 있음 (특정 빌드) — 문제 시 비활성화 후 확인
- 일부 컨테이너 네트워크 시나리오에서 동작 차이 — 깊은 컨테이너 networking 작업 시 검증 필요
검증 방법
다음 5종 통과:
- WSL 안
free -h→ 메모리 한도가.wslconfig값(예: 8.0Gi) ps -p 1→systemd(실행 파일 이름)curl -sS https://www.google.com -o /dev/null && echo OK→ OK (DNS·네트워크)cd ~ && touch test.txt && lsvscd /mnt/c/Users/$USER && touch test.txt && ls— 두 경로 모두 정상 동작 (속도 차이만)- VS Code →
code .→ 좌측 하단WSL: Ubuntu표시 확인
트러블슈팅
.wslconfig 변경이 반영 안 됨
wsl --shutdown빠뜨림. 모든 WSL 인스턴스가 완전히 종료된 후 재시작해야 함.- 파일 위치 확인:
%USERPROFILE%\.wslconfig(사용자 홈)이지%LOCALAPPDATA%나 다른 곳 아님. - 파일 확장자가
.wslconfig(점 시작, 다른 확장자 없음).
systemd 활성화 후 부팅 실패
/etc/wsl.conf문법 오류 흔함.[boot]섹션 헤더 빠뜨림 등.- 복구: PowerShell에서
wsl -u root -d Ubuntu로 root 진입 후/etc/wsl.conf수정.
apt update 가 DNS 에러
- 3.1 옵션 A로
/etc/resolv.conf수동 작성. 또는 7장 미러 네트워킹으로 전환. - VPN 사용 중이라면 회사 DNS 추가 필요.
npm install이 끔찍하게 느림
- 4장 —
/mnt/c/...cross-mount에서 작업 중.~/work로 이동해서 작업.
VS Code Remote-WSL이 연결 실패
code명령이 PATH에 없는 경우. Windows에서 VS Code를 한 번 열고 Command Palette →Shell Command: Install 'code' command in PATH.- WSL 안에서
code -v동작 확인.
Mirrored networking 후 Docker Desktop 깨짐
- Docker Desktop이
networkingMode=NAT기반으로 동작하던 경우. Docker Desktop의 WSL 통합 설정을 확인하거나, 본 옵션을 비활성화 후 Docker 사용.
vhdx 사이즈가 안 줄어듦 (5장)
- diskpart의
compact vdisk는 디스크 fragmentation에 따라 효과가 제한적. 옵션 C(export/import)가 가장 깨끗.
참고
- Windows 초기 셋업 — WSL2 설치가 먼저
- Microsoft WSL 공식 문서 — Configuration
- WSL Mirrored networking 발표 — 22H2 출시 노트
- Sparse VHD 발표
변경 이력
- 2026-05-12: 첫 작성. 7개 튜닝 +
.wslconfig템플릿 자산 + 검증 5종 + 트러블슈팅 7종.