15
votes

docker sur wsl2 très lent

Après avoir lu les améliorations de performances lors de l'exécution de Docker sur wsl2, j'attendais la sortie officielle de Windows 10 qui prend en charge wsl2. J'ai mis à jour Windows et Docker et activé l'indicateur Docker pour utiliser wsl2 et espérais une amélioration des performances de ma base de données Oracle s'exécutant dans un conteneur Docker, mais malheureusement, le changement a considérablement ralenti le conteneur et mon ordinateur portable. Les performances du conteneur sont environ 10 fois plus lentes et mon ordinateur portable est pratiquement bloqué lors du démarrage du conteneur. Il semble que la consommation de mémoire épuiserait complètement mes 8 Go et un échange de mémoire important commence à avoir lieu. Puis-je faire quelque chose pour améliorer les performances de Docker sur wsl2 ou du moins pour mieux comprendre ce qui ne va pas dans ma configuration?

Mon environnement:

  • Processeur Intel (R) Core (TM) i7-2620M CPU @ 2.70GHz, 2 Core (s)
  • Mémoire physique installée (RAM) 8,00 Go
  • Microsoft Windows 10 Pro version 10.0.19041 Build 19041
  • Docker version 19.03.8, build afacb8b

4 commentaires

Je pense que des informations sur vos spécifications matérielles et les versions de tous les logiciels concernés seraient nécessaires.


J'ai également ce problème, j'ai 16 Go de mémoire et le processus vmmem en consomme la majorité.


BTW Il y a un problème à ce sujet: github.com/microsoft/WSL/issues/4166 Comme nous tous les utilisateurs de wsl2 finissons par chercher quoi faire avec des fenêtres bloquées ...


Problème similaire, mais avec beaucoup de mémoire, et lors de la construction stackoverflow.com/questions/65231110/...


5 Réponses :


13
votes

Cela vient du "vmmem" qui consomme autant de ressources que possible. Pour résoudre le problème, accédez simplement à votre fichier utilisateur pour moi dans

C: \ Users \ userName

Dans ce répertoire, créez un fichier nommé " .wslconfig " dans lequel vous allez configurer le nombre de ressources pouvant consommer WSL2:

[wsl2] 
memory=900MB    #Limits VM memory in WSL 2 to 900MB 
processors=1    #Makes the WSL 2 VM use one virtual processors

Fermez maintenant votre docker et attendez que "vmmem" se ferme dans le gestionnaire de tâches.

Ensuite, vous pouvez redémarrer le docker et normalement "vmmem" ne dépassera pas la limite que vous avez définie (ici 900 Mo) Si ne fonctionne pas, redémarrez votre ordinateur.

J'espère que cela vous a aidé.


3 commentaires

Merci beaucoup pour votre réponse. Docker devrait proposer de définir ceci ou quelque chose. Voici la documentation de Microsoft sur .wslconfig pour référence.


L' .wslconfig fichiers .wslconfig réduit la consommation de ressources, mais rend le conteneur lui-même encore plus lent qu'auparavant. Je suppose que je n'ai tout simplement pas assez de mémoire et que je devrai continuer à utiliser Docker sans tirer parti de wsl2.


J'ai trouvé que limiter la mémoire via .wslconfig comme celui-ci faisait une énorme différence dans les performances de Docker. Sans cela, Docker semble utiliser autant de ressources que possible. Limiter Docker à la memory=6GB sur ma machine de 16 Go a amélioré le travail avec Docker. Le réglage optimal dépendra probablement de la RAM disponible et de ce que vous faites avec Docker, mais je suppose que le régler à (un peu!) Plus de 500 Mo serait probablement judicieux dans de nombreux cas!



7
votes

Vous avez probablement votre code sur la machine Windoes comme dans

/home/YouName/projects/blahfu

Mais vous utilisez docker sur WSL 2 qui est alors sur un autre système de fichiers. Donc, si vous faites une construction de docker, vous avez tout le code / contexte copié du système de fichiers Windows vers le système de fichiers Linux, puis de là vers le conteneur du docker. Cela prend la plupart du temps et est incroyablement lent.

Essayez de mettre votre projet en

C:\\Users\YourName\projects\blahfu

Cela devrait donner un bon coup de pouce aux performances.


6 commentaires

Je ne suis pas sûr de comprendre mais dans mon cas, j'ai un conteneur Linux avec une base de données Oracle et toutes les données se trouvent dans le conteneur lui-même.


@doberkofler Pendant le développement, vous devez monter votre code source dans le conteneur docker (si vous ne voulez pas détruire / créer votre conteneur à chaque changement de code) ... mais vous parlez de la base de données, non !? si le répertoire de données de votre base de données n'est pas stocké localement (dans un point de montage local), c'est quand même lent;)


Tous les fichiers sont stockés dans le conteneur Linux et j'accède uniquement au conteneur via sql * net.


@Andy: Techniquement, votre approche a du sens, mais l'idée de WSL est d'avoir la flexibilité nécessaire pour travailler sur Windows en tirant parti de la puissance de Linux, et il devrait prendre soin des performances. Si nous déplaçons tout le contenu dans la structure de dossiers WSL, je doute.


@srk Ouais. Tu as raison. Je préférerais totalement travailler sur Ubuntu, mais mon employeur insiste pour travailler avec Windows ... parce que je suis conforme à la norme PCI. Donc pour moi c'est une solution de contournement ^^ J'ai même exécuté mon IDE sur WSL avec un gestionnaire de fenêtres X ...


@srk avec leurs mises à jour récentes, Docker a déclaré que l'utilisation de WSL2 au lieu d'HyperV offrait de meilleures performances. Ils n'ont rien dit sur son utilisation, alors j'ai compris que c'était juste plus efficace pour Docker lui-même, pas spécialement pour travailler avec des fichiers WSL ou pour exécuter Docker dans WSL. Si je me trompe, la communication n'était pas claire et je serais curieux de savoir s'il vaut la peine de basculer Docker vers WSL2 lorsque vous n'utilisez pas Docker dans WSL de toute façon.



1
votes

Si les données du conteneur Docker réel sont stockées sur un système de fichiers Windows (c'est-à-dire NTFS) au lieu d'être stockées sur un système de fichiers linux natif (quel que soit le contenu du conteneur Docker, qui est probablement déjà basé sur Linux), alors je pense que vous êtes va voir des performances lentes parce que vous exécutez WSL et que vous utilisez le conteneur docker à partir d'un système de fichiers WINDOWS monté (c'est-à-dire / c / mnt / ...).

Si vous copiez votre conteneur docker dans quelque chose comme / usr / local ou / home // docker sur WSL, vous pouvez voir une augmentation des performances 10x. Essayez cela et voyez si cela fonctionne?


1 commentaires

La base de données complète comprenant tous les fichiers de données est stockée dans le conteneur lui-même et il n'y a pas de système de fichiers Windows monté.



-2
votes

Vous pouvez modifier le paramètre de retour du menu fixe Hyper-V. Cliquez sur docker -> Paramètres -> Décochez "Utiliser le moteur basé sur WSL 2".

entrez la description de l'image ici


1 commentaires

Bien sûr, je peux désactiver complètement WSL2 mais ce n'est pas le sujet de cette discussion



2
votes

wsl conteneur ont leur propre système de fichiers isolé du système de fichiers Windows. L'idée de base est de copier votre code source du système de fichiers Windows vers le système de fichiers wsl.

depuis la fenêtre, vous pouvez accéder au conteneur wsl et copier votre projet dans un wslcontainer:

naviguer avec l'explorateur vers \\wsl$

reconstruisez le conteneur à partir de cet emplacement, cela fera l'affaire!


7 commentaires

Je ne comprends pas. Pourriez-vous développer votre commentaire?


Comme je l'ai déjà mentionné ici, la base de données complète comprenant tous les fichiers de données est stockée dans le conteneur lui-même et il n'y a pas du tout de système de fichiers Windows monté.


ok, donc, votre ordinateur exécute Windows 10 parce que vous posez des questions sur wsl2, non? alors quand vous dites "les fichiers de données sont stockés dans le conteneur lui-même et il n'y a pas du tout de système de fichiers Windows monté", la question est de savoir où est stocké votre fichier docker-compose.yml et tous les autres fichiers qui définissent votre conteneur docker? ce fils ne peut pas être dans le conteneur docker car il n'y a pas de conteneur sans eux. donc je suppose que ce fichier à partir de qui vous avez créé votre docker se trouve sur votre windows fs, non? oui? -> les migrer vers wsl Non? -> je suppose qu'ils sont déjà dans wsl, donc autre chose qui ralentit docker


Oui, j'utilise Windows 10 et je pose des questions sur wsl2 mais je ne suis pas sûr de comprendre les autres commentaires. Dans mon cas spécifique, le conteneur lui-même est un docker run partir d'une image construite sur un ordinateur différent et contient tous les fichiers nécessaires à l'exécution.


ok, donc elle nous le sommes, le doc dit: "docker run image-name: image-name pourrait être une image docker sur votre machine locale [...]" lorsque vous exécutez votre image build sur un autre ordinateur, vous exécutez toujours un image située sur votre machine. donc la question est où est stockée cette image sur votre ordinateur?


Dans mon système de fichiers Windows local. Vous faites donc référence à l'emplacement de l'image elle-même et suggéreriez-vous de la démarrer à partir d'un sous-système wls2? Correct?


oui! exactement ! copiez-le dans le wsl et exécutez-le à partir de là! :)