WSL2 est génial… jusqu’au moment où votre portable Windows commence à swapper comme s’il passait un casting pour un netbook de 2012. Vous ouvrez le Gestionnaire des tâches, voyez vmmem occuper la moitié de votre RAM, et soudain ce « build docker rapide » devient une séance de thérapie de groupe pour tout le système.
Voici le guide pratique pour faire tenir WSL2 en laisse : limites strictes pour la mémoire et le CPU, réglage du swap, ce que signifie réellement « récupérer de la mémoire », et comment diagnostiquer le vrai goulot d’étranglement quand tout paraît lent.
Comment WSL2 utilise réellement la mémoire et le CPU
WSL2 n’est pas « Linux qui tourne dans une couche de compatibilité ». C’était plutôt WSL1. WSL2 exécute un vrai noyau Linux à l’intérieur d’une machine virtuelle légère gérée par Hyper-V. C’est pourquoi WSL2 offre une meilleure compatibilité des appels système et pourquoi il peut aussi vous manger de la RAM.
Le modèle mental qui ne vous trahira pas
- Windows possède le matériel. WSL2 est une VM invitée. L’invité peut demander de la mémoire et du CPU ; l’hôte l’alloue et planifie.
- La mémoire WSL2 est « élastique » jusqu’à ce qu’elle ne le soit plus. La VM peut gonfler quand Linux met en cache des données de fichiers, alloue de la mémoire pour des builds, ou exécute des conteneurs.
- Linux utilise la RAM libre pour le cache. C’est normal. Le mode défaillant survient quand ce cache ne revient pas assez vite à Windows, ou quand la VM atteint une limite et commence à swapper.
vmmemest la facture. Le Gestionnaire des tâches n’affiche pas la « mémoire du processus WSL2 » comme vous l’espérez ; il montre le processus conteneur de la VM. Cela inclut le noyau Linux, le cache de pages et tout ce que vous avez lancé dans WSL2.
Le CPU est plus simple : sans limites, WSL2 peut utiliser autant de cœurs que Windows voudra en planifier. Si vous avez déjà vu un build Rust ou un make -j parallèle anéantir l’interactivité, vous avez vu la politique par défaut : « Félicitations, vous avez acheté des cœurs ; nous allons tous les utiliser. »
Une pensée pour vous garder honnête, idée paraphrasée de Gene Kim (auteur fiabilité/ops) : idée paraphrasée : un flux rapide et des systèmes stables viennent de la réduction du travail en cours et de la limitation du rayon d’explosion
. Les limites de ressources sont littéralement du contrôle du rayon d’explosion.
Petite blague n°1 : WSL2 ne « fuit » pas la mémoire. Il l’adopte définitivement et la nomme d’après votre répertoire de build.
Faits intéressants et contexte historique (les parties qu’on n’entend pas en standup)
- WSL1 vs WSL2 fut un pivot philosophique. WSL1 traduisait les appels système Linux vers Windows. WSL2 embarque un vrai noyau Linux, ce qui a corrigé la compatibilité mais réintroduit le comportement de type VM en matière de ressources.
- Le processus
vmmemest un conteneur Hyper-V. C’est la représentation côté hôte de la VM WSL2. C’est pourquoi il paraît « mystérieux » dans le Gestionnaire des tâches et pourquoi tuer des processus Linux au hasard ne le réduira pas forcément rapidement. - Le cache de pages Linux n’est pas de la RAM « gaspillée ». C’est une optimisation de performance. Quand ça devient un problème, le problème porte sur la récupération à travers la frontière VM/hôte, pas sur la « gourmandise » de Linux.
- Le ballooning mémoire est une technique VM connue. Les hyperviseurs peuvent récupérer la mémoire invitée avec des pilotes balloon. Le comportement de WSL2 s’est amélioré avec le temps, mais ce n’est pas magique ni instantané.
- WSL2 a eu une histoire de « mémoire qui ne revient pas ». Les premières versions en étaient notoirement victimes. Les versions récentes de Windows 11 et les mises à jour WSL ont amélioré la récupération, notamment avec des fonctionnalités comme le page reporting.
- Le backend WSL2 de Docker a changé la donne. Plutôt qu’une lourde VM LinuxKit, Docker Desktop peut tourner dans WSL2, ce qui fait de la politique de ressources WSL2 le problème de tout le monde, pas seulement des développeurs Linux.
- Le swap dans WSL2 n’est pas le pagefile Windows. WSL2 peut avoir son propre fichier de swap. Vous pouvez le régler, et vous devriez, car le « swap surprise » est la raison pour laquelle les portables se mettent à ressembler à des tas de gravier en traitement.
- Le support systemd dans WSL2 a été un grand changement. Plus de services d’arrière-plan peuvent tourner, ce qui est excellent pour le réalisme et aussi excellent pour consommer silencieusement RAM et CPU si vous traitez WSL comme un shell jetable.
- Les limites CPU sont rustres mais efficaces. La VM n’est pas un sandbox cgroup par défaut. Si vous voulez que « les charges de travail Linux ne volent pas l’interactivité Windows », les plafonds CPU au niveau VM sont un marteau étonnamment propre.
Plan de diagnostic rapide
Quand la machine semble lente, ne commencez pas par éditer des fichiers de config. D’abord, déterminez quel type de lenteur vous affrontez. Il y a trois goulots courants : pression mémoire hôte, pression mémoire invitée et contention CPU. Le disque est le quatrième, plus sournois.
Première étape : est-ce que Windows suffoque à cause de la RAM ou du CPU ?
- Vérifiez le Gestionnaire des tâches : graphe mémoire, graphe CPU, et quels processus sont en tête (
vmmemvs les autres). - Décision : Si Windows swappe beaucoup ou que la mémoire est >90% utilisée, traitez cela comme une urgence mémoire hôte. Si le CPU est saturé, traitez-le comme un problème d’ordonnancement/contention.
Deuxième étape : WSL2 est-il le coupable ou juste à proximité ?
- Vérifiez les distributions WSL : voyez ce qui tourne et si une pile de conteneurs est impliquée (Docker Desktop, Kubernetes, jobs de build).
- Décision : Si
vmmemest énorme et croît, confirmez ce qui, à l’intérieur de Linux, consomme la mémoire (RSS) vs le cache. Si le CPU est élevé, confirmez s’il s’agit de compilations, de conteneurs ou de services d’arrière-plan.
Troisième étape : la mémoire est-elle « coincée » ou réellement utilisée ?
- Dans WSL : regardez
free -h,pset/proc/meminfopour séparer la mémoire anonyme (apps) du page cache. - Décision : Si c’est principalement du cache et que Windows souffre, vous avez besoin de limites ou d’une stratégie de récupération/arrêt forcé. Si c’est de la vraie mémoire de processus, corrigez la charge ou acceptez-la et plafonnez-la.
Quatrième étape : vérifiez le thrashing disque (parce que swap et I/O mentent)
- Dans WSL : si le swap est actif et que l’I/O wait est élevé, votre « problème mémoire » est devenu un problème disque.
- Décision : Réduisez l’usage mémoire, augmentez l’allocation de RAM (contre-intuitif mais parfois juste), ou réglez le swap pour éviter un thrash catastrophique.
Imposer des limites strictes avec .wslconfig (et ce que chaque réglage fait vraiment)
Si vous utilisez WSL2 comme un service de production — et vous devriez, parce qu’il se comporte comme tel — alors vous définissez des budgets. Les budgets protègent l’hôte. Ils vous forcent aussi à remarquer quand les charges dépassent ce qu’un portable est censé faire.
Où vit la config et comment elle s’applique
.wslconfig est lu par WSL côté Windows. Il est situé dans le répertoire de votre profil utilisateur Windows (typiquement C:\Users\<you>\.wslconfig). Il s’applique globalement aux VMs WSL2, pas par distribution.
Après l’édition, il faut généralement arrêter WSL pour que les nouveaux paramètres prennent effet. « Redémarrer le terminal » n’est pas un redémarrage. WSL est plus sournois que ça.
Paramètres de base opinionés
Sur un portable dev typique de 16 Go, j’aime donner à WSL2 assez de marge pour être rapide sans lui permettre de devenir le système d’exploitation. Un point de départ raisonnable :
cr0x@server:~$ cat /mnt/c/Users/$USER/.wslconfig
[wsl2]
memory=8GB
processors=4
swap=4GB
swapFile=C:\\Users\\%USERNAME%\\AppData\\Local\\Temp\\wsl-swap.vhdx
localhostForwarding=true
Ce que chaque ligne signifie en pratique :
memory=8GB: plafond strict sur la mémoire de la VM. Si l’invité veut plus, il libérera le cache, puis swappera, puis souffrira. Cela protège Windows.processors=4: nombre maximum de vCPU. Cela ne « pinde » pas les CPUs ; ça limite le parallélisme. Cela protège la réactivité lors des builds et des tempêtes de conteneurs.swap=4GB: taille du swap WSL2. Ce n’est pas une fonctionnalité de performance ; c’est un tampon d’échec. Trop petit et vous OOM. Trop grand et vous pouvez thrash silencieusement.swapFile=...: emplacement du swap. Mettez-le sur un stockage rapide. Ne le placez pas sur des profils réseau, des dossiers chiffrés aux politiques bizarres, ou partout où la DLP d’entreprise va vous causer des ennuis.localhostForwarding=true: garde le réseau sain. Ce n’est pas un réglage de ressources, mais les gens le cassent et diagnostiquent ensuite à tort une « lenteur » qui est en fait DNS ou redirection de ports.
Choisir des limites qui ne vous saboteront pas
Il n’y a pas de chiffre universellement « meilleur ». Il existe, toutefois, un mode d’échec universel : fixer des limites si basses que l’invité swappe constamment, puis accuser WSL2 d’être lent. C’est comme mettre un limiteur sur une voiture à 30 km/h et se plaindre que l’autoroute est stressante.
Utilisez ces règles empiriques :
- Mémoire : Si l’hôte a 16 Go, réglez WSL2 entre 6 et 10 Go selon ce que vous exécutez sur Windows. Si vous avez des IDE lourds sur Windows, baissez.
- CPU : Limitez à la moitié de vos cœurs pour les machines développeur. Si vous avez 12–16 cœurs, donnez 6–8 à WSL2. Si vous avez 4 cœurs, donnez-lui 2 et acceptez la réalité.
- Swap : 2–8 Go est courant. Si vous compilez de gros projets ou exécutez Kubernetes, visez le haut. Si vous tenez à la latence interactive, visez le bas et corrigez l’usage mémoire.
Petite blague n°2 : Le swap c’est comme la caféine : un peu vous maintient en vie, trop vous rend nerveux et désagréable.
Récupération de mémoire : pourquoi « ça devrait libérer la RAM » n’est pas un plan
La plainte la plus courante : « J’ai tout fermé dans Linux, mais Windows affiche toujours vmmem utilisant 10 Go. » Parfois c’est un bug. Souvent c’est juste de la physique : l’invité a utilisé de la mémoire pour le cache, et l’hôte ne la récupère pas immédiatement.
Ce qui se passe généralement
- Linux a mis en cache des données de fichiers. Les builds, installations de paquets et pulls d’images de conteneurs remplissent le page cache.
- L’invité est inactif mais garde des pages. Ces pages sont « récupérables » côté Linux, mais l’hôte ne force pas forcément la récupération tant qu’il n’y a pas de pression.
- Windows voit l’allocation VM, pas le « libre » Linux. Vous voyez donc un grand nombre et supposez que c’est de l’utilisation active.
Ce que vous pouvez faire
Il y a trois niveaux de réponse, du moins au plus perturbateur :
- Ne rien faire tant que l’hôte n’en a pas besoin. Si Windows a suffisamment de mémoire libre et que vous ne swappez pas, n’optimisez pas à la volée.
- Appliquer des plafonds raisonnables. C’est la solution long terme : WSL2 ne peut pas gonfler au-delà d’un budget.
- Redémarrer WSL quand vous avez fini un travail lourd. C’est le bouton pragmatique « tout libérer maintenant ». Ce n’est pas élégant. C’est efficace.
Autre chose : si vous atteignez constamment le plafond, ce n’est pas que WSL2 se comporte mal. C’est que votre charge demande plus de RAM que votre machine ne peut en fournir confortablement. Soit augmentez les limites, réduisez le parallélisme, soit arrêtez de faire croire qu’un portable est une ferme de build.
Swap, stockage et la lente mort de votre SSD
Le swap n’est pas gratuit. C’est de la douleur différée. Sur les machines développeur, le swap apparaît pendant les « pics de chaos » : compilations parallèles, quelques conteneurs, onglets de navigateur qui se reproduisent en arrière-plan, et quelqu’un qui ouvre innocemment Teams.
Pourquoi le swap est particulièrement sournois dans WSL2
- Vous pouvez avoir un swap à l’intérieur de l’invité (le fichier de swap de WSL2) pendant que Windows a son propre pagefile. Sous pression, vous pouvez vous retrouver à paginer deux fois : Windows pagine le store backing de la VM pendant que Linux swappe à l’intérieur. C’est aussi amusant que ça en a l’air.
- Le I/O wait devient votre vrai goulot. Les graphes CPU peuvent sembler « corrects », mais tout se fige parce que vous attendez le disque.
- La taille du swap interagit avec les limites. Un plafond mémoire serré plus un swap grand peuvent maintenir une charge traînante au lieu d’échouer rapidement. C’est soit « productif », soit « souffrance prolongée », selon vos deadlines.
L’emplacement du stockage compte
WSL2 utilise un disque virtuel (VHDX) pour chaque distribution. Ce disque se trouve typiquement sous votre profil Windows. Si votre disque système est lent, tout dans WSL2 hérite de cette lenteur — en particulier les couches de conteneurs, caches de paquets et artefacts de build.
Si vous voulez des performances WSL2, gardez les charges à fort churn dans le système de fichiers Linux (ext4 dans le VHDX) plutôt que de travailler depuis /mnt/c. L’interopérabilité du système de fichiers Windows est bonne, mais elle n’est pas « native Linux » bonne.
Docker Desktop et Kubernetes sur WSL2 : qui commande vraiment ?
Quand Docker intervient, beaucoup d’équipes perdent la trace de l’endroit où se situe le contrôle des ressources. Ils règlent les limites Docker, puis se demandent pourquoi vmmem continue de croître. Ou ils règlent WSL2 et se demandent pourquoi Kubernetes plante.
Comprendre la hiérarchie
- La limite VM WSL2 plafonne l’ensemble du Linux VM. Docker à l’intérieur est en aval de ce plafond.
- Les réglages de ressources Docker (si vous utilisez l’UI Docker Desktop) peuvent ou non s’appliquer comme vous le pensez selon le backend et la version. Quand le backend est WSL2, les limites WSL2 sont le plafond dur.
- Kubernetes ajoute du churn d’arrière-plan. Même des clusters « inactifs » font tourner des composants de control plane, des controllers et des watchers. C’est des réveils CPU réguliers et une empreinte mémoire.
Mon conseil opérationnel : décidez si votre portable est autorisé à héberger un cluster local et appliquez cette décision avec des limites. Si vous l’autorisez, budgétez-le. Ne le laissez pas être un passager accidentel.
Tâches pratiques : commandes, sorties et décisions
Voici les vérifications pratiques que j’utilise réellement. Chaque tâche inclut une commande, une sortie représentative et ce que vous en déduisez. Exécutez les commandes côté Windows dans PowerShell ; exécutez les commandes côté Linux dans WSL.
Tâche 1 : Confirmer la version WSL et ce qui tourne
cr0x@server:~$ wsl.exe --list --verbose
NAME STATE VERSION
* Ubuntu-22.04 Running 2
Debian Stopped 2
Sens : Ubuntu tourne sur WSL2. Debian est arrêtée. Si vous pensiez que « rien ne tourne », vous aviez tort.
Décision : Si vmmem est élevé, concentrez-vous sur la/les distribution(s) en cours. Arrêtez ce que vous n’avez pas besoin.
Tâche 2 : Réinitialisation complète de WSL pour récupérer la mémoire hôte
cr0x@server:~$ wsl.exe --shutdown
Sens : Toutes les distributions WSL et la VM WSL2 sont terminées. La mémoire devrait chuter peu après.
Décision : Utilisez ceci quand Windows est sous pression maintenant. Ne l’utilisez pas comme rituel quotidien pour éviter de définir des limites.
Tâche 3 : Voir l’empreinte mémoire WSL côté hôte (rapide et sale)
cr0x@server:~$ powershell.exe -NoProfile -Command "Get-Process vmmem | Select-Object Name,Id,@{n='WS(MB)';e={[math]::Round($_.WorkingSet64/1MB,0)}},CPU"
Name Id WS(MB) CPU
vmmem 9480 10324 812.55
Sens : La VM tient environ 10 Go de working set. Le temps CPU indique qu’elle a été active.
Décision : Si Windows swappe et que c’est grand, appliquez un plafond mémoire et/ou arrêtez WSL.
Tâche 4 : Vérifier la mémoire à l’intérieur de WSL (séparer le cache de la pression)
cr0x@server:~$ free -h
total used free shared buff/cache available
Mem: 7.6Gi 2.1Gi 1.2Gi 128Mi 4.3Gi 5.1Gi
Swap: 4.0Gi 0.0Gi 4.0Gi
Sens : La plupart de la mémoire est en buff/cache, mais available est sain. Ce n’est pas une urgence à l’intérieur de Linux.
Décision : Si Windows va bien, ignorez. Si Windows ne va pas bien, les plafonds/la récupération comptent plus que de chasser le « used ».
Tâche 5 : Identifier les plus gros consommateurs mémoire (RSS réel, pas les impressions)
cr0x@server:~$ ps aux --sort=-rss | head -n 8
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1321 3.2 6.1 912648 475832 ? Ssl 09:12 2:44 dockerd
cr0x 4882 1.1 4.8 2879300 376544 ? Sl 10:01 0:51 node
cr0x 5021 18.9 4.2 1845500 332100 ? Rl 10:05 1:32 rustc
postgres 2110 0.7 2.0 891200 158300 ? Ssl 09:20 0:33 postgres
root 823 0.2 1.1 368012 88224 ? Ss 09:10 0:08 containerd
Sens : Il s’agit de vraie mémoire de processus (RSS). Ici, Docker et les builds sont des consommateurs majeurs.
Décision : Si vous atteignez des plafonds, réduisez le parallélisme, arrêtez des services, ou déplacez les charges lourdes hors du portable.
Tâche 6 : Vérifier si vous swappez à l’intérieur de WSL
cr0x@server:~$ swapon --show
NAME TYPE SIZE USED PRIO
/swapfile file 4G 512M -2
Sens : Le swap est utilisé. Pas automatiquement mauvais, mais étiquette d’alerte performance.
Décision : Si la performance interactive est mauvaise, traitez l’usage du swap comme un déclencheur pour réduire la charge ou augmenter le plafond mémoire.
Tâche 7 : Trouver l’I/O wait (le disque est-il le vrai goulot ?)
cr0x@server:~$ vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 524288 842000 68000 3380000 20 45 1200 800 560 940 18 7 62 13 0
1 1 524288 812000 68000 3310000 10 25 2400 1900 620 1020 12 6 58 24 0
0 1 524288 798000 68000 3290000 0 12 3100 2200 640 1090 10 5 52 33 0
Sens : wa (I/O wait) augmente. Swap in/out se produit. Vous payez maintenant des intérêts sur la dette mémoire.
Décision : Réduisez d’abord la pression mémoire. Si ça persiste, envisagez un emplacement de stockage plus rapide, moins de swap, ou moins de jobs concurrents.
Tâche 8 : Vérifier la contention CPU et la charge à l’intérieur de WSL
cr0x@server:~$ uptime
10:14:22 up 1:08, 0 users, load average: 9.12, 7.44, 5.81
Sens : La charge moyenne est élevée par rapport aux CPU alloués. Si vous avez plafonné à 4 CPU et que la charge est à 9, vous avez une file d’attente.
Décision : Soit augmentez processors, soit réduisez le parallélisme (make -j, outils de build, réplicas de conteneurs).
Tâche 9 : Confirmer combien de CPUs WSL voit
cr0x@server:~$ nproc
4
Sens : Votre VM WSL2 voit 4 CPUs. Cela correspond à un plafond processors=4.
Décision : Si les builds sont très lents mais que Windows est inactif, augmentez le plafond CPU. Si Windows souffre, gardez-le plafonné.
Tâche 10 : Localiser les véritables coupables d’usage disque dans WSL
cr0x@server:~$ sudo du -xh /var/lib | sort -h | tail -n 8
1.1G /var/lib/apt
2.4G /var/lib/snapd
6.2G /var/lib/docker
6.2G /var/lib/docker/overlay2
7.9G /var/lib
Sens : Le stockage Docker domine. Cela corrèle aussi avec la pression mémoire (page cache, churn de métadonnées).
Décision : Prunez images/volumes, déplacez les builds, ou acceptez que l’accumulation locale de conteneurs ait un coût.
Tâche 11 : Voir les limites mémoire actuelles appliquées depuis Windows (sanity check)
cr0x@server:~$ cat /proc/meminfo | head -n 5
MemTotal: 7961888 kB
MemFree: 1214320 kB
MemAvailable: 5389120 kB
Buffers: 68040 kB
Cached: 3129480 kB
Sens : MemTotal est d’environ 7.6–7.9 Go, ce qui implique que votre plafond mémoire WSL2 est en place.
Décision : Si vous attendiez 16 Go et obtenez 8 Go, votre plafond est trop bas pour cette charge (ou c’est le bon plafond et la charge doit changer).
Tâche 12 : Vérifier les services systemd qui mangent des ressources en silence
cr0x@server:~$ systemctl --no-pager --type=service --state=running | head -n 12
UNIT LOAD ACTIVE SUB DESCRIPTION
cron.service loaded active running Regular background program processing daemon
dbus.service loaded active running D-Bus System Message Bus
docker.service loaded active running Docker Application Container Engine
rsyslog.service loaded active running System Logging Service
ssh.service loaded active running OpenBSD Secure Shell server
systemd-journald.service loaded active running Journal Service
Sens : Docker et SSH tournent, plus des services de base. C’est une empreinte d’arrière-plan réelle.
Décision : Arrêtez ce dont vous n’avez pas besoin. Si vous n’utilisez Docker qu’occasionnellement, ne le laissez pas idler indéfiniment.
Tâche 13 : Arrêter un service lourd et confirmer le delta
cr0x@server:~$ sudo systemctl stop docker
cr0x@server:~$ ps aux --sort=-rss | head -n 5
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
cr0x 4882 0.8 4.6 2879300 362112 ? Sl 10:01 0:54 node
postgres 2110 0.7 2.0 891200 158100 ? Ssl 09:20 0:33 postgres
root 823 0.1 0.9 342200 72140 ? Ss 09:10 0:08 containerd
Sens : Les processus liés à Docker ont diminué. La mémoire devrait réduire avec le temps ; les réveils CPU diminueront immédiatement.
Décision : Si cela améliore sensiblement la réactivité de Windows, vous avez trouvé un contributeur majeur. Définissez une politique : ne laissez pas Docker tourner 24/7 si ce n’est pas voulu.
Tâche 14 : Confirmer que Windows voit les limites après redémarrage
cr0x@server:~$ wsl.exe --shutdown
cr0x@server:~$ wsl.exe -d Ubuntu-22.04 -- cat /proc/meminfo | head -n 1
MemTotal: 7961888 kB
Sens : La VM a redémarré et est toujours plafonnée à ~8 Go.
Décision : Si rien n’a changé, vous avez édité le mauvais fichier, utilisé une syntaxe invalide, ou oublié de redémarrer la VM.
Trois micro-histoires du monde corporate (parce que la production a toujours un avis)
Micro-histoire 1 : L’incident causé par une mauvaise hypothèse
Une équipe a déployé WSL2 comme environnement de développement par défaut. C’était une décision raisonnable : outils cohérents, moins de « marche sur ma machine », et onboarding plus simple. Ils ont dit à tout le monde « C’est léger ». Cette phrase a fait des dégâts.
En une semaine, les plaintes sur les portables ont afflué : VPN qui tombe, Teams qui se fige en pleine réunion, toute l’UI Windows saccadée. Le support a d’abord pointé la protection endpoint. Les développeurs ont blâmé les mises à jour Windows. La réalité était plus simple : les gens faisaient tourner des stacks conteneurs toute la journée, et la VM WSL2 s’est joyeusement étendue pour remplir la mémoire. L’hôte a commencé à paginer, et tout ce qui dépendait d’une latence prévisible a commencé à vaciller.
L’erreur n’était pas « WSL2 est mauvais ». C’était « WSL2 est petit par défaut ». Dans un monde VM, « par défaut » signifie souvent « sans plafond ». Ils ont résolu le problème en publiant un baseline .wslconfig standard (plafonds mémoire et CPU), plus une règle interne : si vous avez besoin de plus, vous en faites la demande et la justifiez.
La surprise : les temps de build ont à peine changé. La stabilité interactive s’est améliorée immédiatement. C’est ce qui arrive quand on arrête de se battre pour les 2 Go de RAM restants comme s’ils étaient un minéral rare.
Micro-histoire 2 : L’optimisation qui a mal tourné
Une autre organisation avait une croisade performance bien intentionnée : « Rendre les builds plus rapides en donnant plus de cœurs à WSL2. » Ils ont poussé une config qui mettait processors égal au nombre total de cœurs de la machine. Les compilations ont filé. Tout le monde publiait des captures d’écran. La dynamique était lancée.
Puis le retour de bâton : les développeurs utilisent aussi des IDE Windows, des navigateurs et des agents de sécurité. Donner tous les CPU à WSL2 n’a pas « volé » les cœurs définitivement, mais cela a créé une contention persistante. Les builds parallèles, les health checks de conteneurs et l’indexation en arrière-plan dans WSL2 produisaient des threads constamment runnable. Windows restait « réactif » dans le sens trivial (la souris bougeait) mais le travail sensible à la latence se dégradait : appels vidéo, partage d’écran, même la frappe avait du lag sous charge.
Ils ont essayé un second « fix » : baisser la mémoire WSL2 tout en gardant le CPU illimité. Cela a transformé le système en usine à swap. Les builds sont devenus plus lents qu’avant. Pire, ils sont devenus imprévisibles — rapides un jour, épouvantables un autre, selon ce qui tournait.
La vraie solution était ennuyeuse : plafonner le CPU à une fraction sensée, plafonner la mémoire pour protéger l’hôte, et régler le parallélisme de build par projet. Le débit de pointe a légèrement baissé. L’expérience médiane des développeurs s’est beaucoup améliorée. En entreprise, la médiane est ce que vous livrez.
Micro-histoire 3 : La pratique ennuyeuse mais correcte qui a sauvé la mise
Une équipe plateforme maintenait un « profil de poste de travail dev connu bon ». Ce n’était pas glamour. C’était un petit ensemble de defaults : un fichier .wslconfig, une configuration Docker standard, et une checklist pour les gros repos. Les gens râlaient sur le contrôle centralisé, comme toujours, jusqu’à ce que quelque chose casse.
Puis une grosse mise à jour de dépendances est arrivée. Les builds ont grossi en usage mémoire, les images de conteneurs ont pris de l’ampleur, et les clusters de test locaux sont devenus plus lourds. L’organisation sans standards a commencé à lutter : « Pourquoi les machines de tout le monde fondent ? » L’organisation avec le profil a vu quelques ralentissements, certes, mais pas d’instabilité en masse.
Parce que leur profil incluait une pratique simple : avant de lancer de gros builds ou du travail cluster, les développeurs faisaient un contrôle rapide (mémoire disponible, usage swap, services en cours). Et après, ils arrêtaient WSL s’ils avaient fini. Ce n’était pas une automatisation fancy ; c’était de l’hygiène opérationnelle.
Quand la montée de dépendances a augmenté les besoins mémoire, l’équipe plateforme a ajusté les limites de base prudemment et a communiqué les compromis. Personne n’a adoré, mais personne n’a perdu une journée à cause d’un lag mystérieux. L’ennui a encore sauvé la mise. C’est en gros le SRE en une phrase.
Erreurs courantes : symptôme → cause racine → correction
1) Symptôme : Windows est lent, le Gestionnaire affiche vmmem utilisant « trop » de RAM
Cause racine : La VM WSL2 a gonflé à cause du page cache ou de la mémoire de la charge, et l’hôte est maintenant sous pression mémoire.
Correction : Définissez memory= dans .wslconfig, puis wsl.exe --shutdown. Si vous avez besoin de récupérer la mémoire immédiatement, arrêtez d’abord, puis ajustez.
2) Symptôme : WSL2 est lent même si vous « lui avez donné des limites »
Cause racine : Les limites sont trop strictes et Linux swappe ou récupère constamment le cache.
Correction : Vérifiez swapon --show et vmstat. Augmentez memory ou réduisez le parallélisme de la charge. Ne sous-alimentez pas l’invité en espérant la vitesse.
3) Symptôme : CPU saturé, l’UI Windows stutter pendant les builds
Cause racine : WSL2 a trop de vCPUs ou les outils de build oversubscribent les threads.
Correction : Mettez processors= à une valeur sensée. Réglez aussi la concurrence des builds (par exemple, baissez -j ou le nombre de workers des outils).
4) Symptôme : vmmem reste gros après avoir arrêté des processus Linux
Cause racine : Le page cache reste alloué ; la récupération côté hôte n’est pas immédiate.
Correction : Acceptez-le si l’hôte a de la marge. Si non, utilisez wsl.exe --shutdown et implémentez des plafonds pour qu’il ne dépasse pas le budget.
5) Symptôme : Disque occupé, ventilateurs qui tournent, tout se bloque périodiquement
Cause racine : Swap et activité lourde du système de fichiers (souvent les overlays Docker) provoquant des pics d’I/O wait.
Correction : Réduisez la pression mémoire, nettoyez le stockage Docker, évitez les builds lourds sur /mnt/c, et gardez le swap modéré. Si vous avez besoin de beaucoup de mémoire, augmentez la RAM plutôt que de « tuner » à outrance.
6) Symptôme : Le réseau semble lent ; on blâme le CPU ou la mémoire
Cause racine : Souvent une mauvaise configuration DNS, une interaction VPN, ou des problèmes de localhost forwarding — masqués en « lenteur système ».
Correction : Vérifiez réellement si WSL est CPU/mémoire lié avant de tuner. Gardez localhostForwarding=true sauf raison particulière.
7) Symptôme : Après avoir édité .wslconfig, rien ne change
Cause racine : Le fichier est au mauvais endroit, la syntaxe est invalide, ou WSL n’a pas été redémarré.
Correction : Assurez-vous qu’il est dans le chemin du profil utilisateur Windows, validez les clés, puis wsl.exe --shutdown et relancez la distribution. Confirmez avec /proc/meminfo et nproc.
Listes de contrôle / plan pas à pas
Plan A : Empêcher WSL2 de manger votre RAM (sans casser votre flux)
- Mesurez d’abord. Vérifiez le working set de
vmmemet la pression mémoire Windows. - Inventoriez ce qui tourne.
wsl.exe --list --verbose, puis à l’intérieur de WSL vérifiez les processus en tête. - Décidez votre budget. Choisissez plafonds mémoire et CPU selon la RAM/les cœurs de l’hôte et ce qui doit rester réactif sur Windows.
- Appliquez
.wslconfig. Définissezmemory,processorsetswapintentionnellement. - Redémarrez WSL.
wsl.exe --shutdownet relancez votre distribution. - Validez les limites. Utilisez
/proc/meminfoetnproc. - Surveillez le swap. Si le swap grossit pendant le travail normal, les limites sont trop basses ou la charge est trop lourde.
- Corrigez la charge. Arrêtez les services d’arrière-plan inutiles, nettoyez le stockage de conteneurs, réduisez le parallélisme des builds.
Plan B : Votre portable est déjà en feu (mode triage)
- Relief immédiat :
wsl.exe --shutdown. - Confirmez que Windows se remet : la mémoire baisse, le disque arrête de thrash, l’UI redevient réactive.
- Appliquez des plafonds avant de relancer des charges lourdes : créez ou ajustez
.wslconfig. - Redémarrez seulement ce dont vous avez besoin : lancez une seule distribution ; évitez d’auto-démarrer Docker/Kubernetes tant que vous n’êtes pas stable.
- Rejouez le plan de diagnostic rapide : vérifiez si le prochain goulot est CPU, mémoire ou disque.
Plan C : Rendre cela durable pour les équipes
- Standardisez une baseline. Publiez un
.wslconfigrecommandé pour les paliers de portables (16 Go, 32 Go). - Définissez des chemins d’escalade. Si quelqu’un a besoin de 20 Go dans WSL2, c’est une demande matérielle ou une stratégie de build à distance, pas un tweak local secret.
- Enseignez « le cache n’est pas mal ». Apprenez aux gens à lire la mémoire
available, l’usage du swap et l’I/O wait. - Construisez avec des budgets. Le CI devrait représenter la réalité ; ne laissez pas les environnements locaux s’étendre en mini-datacenters sans garde-fous.
FAQ
1) Pourquoi WSL2 utilise-t-il tant de RAM même quand je « ne fais rien » ?
Parce que Linux cache agressivement et WSL2 est une VM. « Rien » inclut souvent des daemons Docker, des watchers, des language servers et des données de cache de système de fichiers. Vérifiez free -h et regardez available vs buff/cache.
2) Est-il sûr de plafonner la mémoire WSL2 ?
Oui. C’est souvent la bonne action. Le risque est de la régler trop bas et forcer le swap ou des OOM kills dans Linux. Plafonnez assez haut pour votre charge réelle, pas votre charge optimiste.
3) Pourquoi fermer mes apps Linux ne réduit-il pas immédiatement vmmem dans le Gestionnaire ?
Parce que la VM peut encore garder de la mémoire pour le cache et l’hôte ne la récupère pas instantanément. Si Windows a besoin de cette mémoire maintenant, arrêtez WSL. Si Windows va bien, ne paniquez pas pour un chiffre.
4) wsl.exe --shutdown supprime-t-il quelque chose ?
Non. Cela termine les instances WSL. Vos fichiers et l’état de la distribution persistent sur le disque. Vous perdrez les sessions en mémoire et tout état volatile, comme après un reboot.
5) Dois-je régler le swap à 0 ?
Parfois. Si vous préférez échouer rapidement (OOM) plutôt que d’avoir un thrash lent, désactiver le swap peut être défendable. Pour la plupart des développeurs, un swap modéré est une sécurité. Si vous le désactivez, préparez-vous à des kills de processus abrupts sous pression.
6) Quelle valeur processors est sensée ?
La moitié de vos cœurs est un bon défaut. Si vous avez 8 cœurs, donnez 4 à WSL2. Si vous avez 16, donnez 6–8. Si vous faites des compilations parallèles lourdes et que Windows est par ailleurs inactif, augmentez. Si vous tenez à la réactivité UI, plafonnez.
7) Travailler dans /mnt/c est-il plus lent que dans le système de fichiers Linux ?
Typiquement oui — surtout pour les workloads avec beaucoup de petites opérations fichier (node_modules, dossiers target Rust, couches de conteneurs). Gardez les arbres de build lourds dans le système de fichiers de la distribution pour la performance et moins de cas limites bizarres.
8) J’utilise Docker Desktop avec WSL2. Dois-je tuner Docker ou WSL ?
Commencez par WSL2 car c’est le plafond dur pour la VM. Ensuite, ajustez les charges Docker (prune des images, ajuster les réplicas compose, définir des limites mémoire de conteneurs) pour rester sous ce plafond.
9) Puis-je définir des limites différentes par distribution ?
.wslconfig est global pour le comportement VM WSL2. Si vous avez besoin d’isolation par distro, vous entrez dans le territoire « utiliser des VMs séparées ou d’autres outils », pas seulement les réglages WSL2.
10) Comment savoir si mon problème est mémoire ou disque ?
Cherchez l’activité swap et l’I/O wait. Dans WSL, swapon --show vous dit si le swap est utilisé ; vmstat montre wa et les swaps in/out. Si wa est élevé et que le swap est actif, le disque est devenu le goulot.
Prochaines étapes qui tiennent dans le temps
Si WSL2 vous mange la RAM, ne le traitez pas comme un bug Windows effrayant. Traitez-le comme ce qu’il est : une VM exécutant un vrai OS avec un vrai comportement de cache. Ensuite faites ce que font les adultes dans les systèmes de production : fixez des budgets, mesurez et répondez à la pression tôt.
- Choisissez un budget aujourd’hui : réglez
memoryetprocessorsdans.wslconfiget redémarrez WSL. - Validez avec des preuves : confirmez que
/proc/meminfoetnproccorrespondent à votre intention. - Surveillez le swap et l’I/O wait : si vous les voyez pendant le travail normal, augmentez le plafond ou réduisez la charge.
- N’arrondissez pas les services lourds : Docker/Kubernetes doivent être un choix délibéré, pas un style de vie en arrière-plan.
- Utilisez shutdown comme outil, pas béquille : c’est un bon levier d’urgence, mais les limites sont la solution long terme.
Une fois cela fait, WSL2 redevient ce qu’il doit être : un environnement Linux solide sur Windows. Pas un colocataire non invité avec des opinions bien arrêtées sur votre budget mémoire.