この記事では、docker imageのビルド中にWSL2がメモリを食いすぎて落ちるので、WSL2を起動させる前に.wslconfigで使用できるメモリを制限しようという内容です。
docker-compose buildでdockerのimageをビルドできない
普段は開発に使っている環境はwindows10 proなのでHyper-vでDocker Desktopを動かしています。ramも16Gあるので特段pcのスペック不足で困ったことはありませんでした。
ただ、いつもと違う環境でdockerを動かすということがあって、そこでちょっとつまずきました。
windows10のhome(ramは8g)なので、とりあえず、巷です進められているとおりWSL2上でDocker Desktopを動かして、
で、いつも通り`docker-compose build`でイメージをビルドしたわけなんですが、イメージのダウンロード中に必ずWSL2が落ちる。
エラーメッセージはこんな感じ
Step 1/8 : FROM pytorch/pytorch ---> b423j43234432 Traceback (most recent call last): File "compose\cli\main.py", line 67, in main File "compose\cli\main.py", line 126, in perform_command File "compose\cli\main.py", line 302, in build File "compose\project.py", line 468, in build File "compose\project.py", line 450, in build_service File "compose\service.py", line 1147, in build compose.service.BuildError: (<Service: ... >, {' ... ': ' ... '}) During handling of the above exception, another exception occurred:
いろいろ出ていますが、このメッセージはDocker Desktopが起動できていないときに出るやつです。
ちなみに、vmmenというプロセスが大量にメモリを食っているみたい・・・。
調べていみるとvmmenというプロセスがメモリを占有してて、これのせいでフリーズしたりクラッシュしてしまうという現象に悩まされている人は他にもいるみたいです。
ずっと監視していたら、3.5Gくらい使ってました。全体で8GBしかないのに一つのプロセスがそんなに使ったら落ちるに決まってますよね。
解決方法:.wslconfigを書いてWSL2が使えるメモリを2GBに制限
次の方法を試したところ解決しました。
windowsのユーザーフォルダ(C:\Users\<ユーザー名>)でwslの設定ファイル.wslconfigを作ります(もともとある方はどっちを使います)。
.wslconfigに
[wsl2] memory=2GB swap=5GB swapFile=C:\\<適当にどこか指定>
と書きます。
その後WSL2を再起動させればいいのですが、pc事体を再起動させてもいいと思います。
memoryはWSL2が単体で使っていいramの容量。swapはssdもしくはhddでデータを退避させていい容量です。
memoryはHyper-v版のvmのデフォルトの容量が2GBで、これまで別に2GBで困ったことがないので2GBに設定しました。
Dockerで動かすものによりますけど、自分が動かそうとしているものはもっとメモリを制限してもよかったかもしれません。実際この後同じ構成で1Gに制限しましたが問題なく動きました。
swapは退避領域のことですが、PCのストレージの空き容量に困ってないのなら余裕を持って設定していいと思います(どこかのブログでmemoryの2倍を指定しておけばいいって書いてあるのを見ました)。
↑全部適当なので、ちゃんとした値を使いたい人は調整してください。
要は、ホストのwindowsがクラッシュするほどDockerを動かすために使っているWSL2がメモリを食うのを防げばいいだけです(WSL側で何とかしてほしい感はある)。
結論、WSL2は便利
この後もWSL2でDockerを動かしていますが、快適に使えています。
WSL2の仕組みをいまいち理解していないので微妙ですが、LinuxのVMを0から立ち上げているわけではないので、WSL2を利用している方が軽いのではないでしょうか・・・。
ハイパーバイザーが使えないwindows pro以外のPCはバーチャルボックスでVMを立ち上げる必要がありますが、それよりは軽い気がしてます。
それでは。