LoginSignup
5
4

More than 1 year has passed since last update.

WSL2/Dockerのトラブル治療室

Last updated at Posted at 2021-04-02

初めに

システム治療家もやっている @CinTAKE です。

WSL2は新しいツールであるため、未知の問題が発覚したり、既知であるが対処法が固まっておらず未修正のままの問題がある。その中から重大なものを取り上げ、原因や治療法を解説する。

事例と治療法

マシンのメモリーを使い果たしてしまって、WSL2以外のアプリが動かなくなる

前提

  • 発生時期:2021年卯月
  • バージョンおよび確認方法:下記に記載
  • マシンスペック:下記に記載
[WSL]
10.0.19041.867
[Windows]
WindowsProductName WindowsVersion OsHardwareAbstractionLayer
------------------ -------------- --------------------------
Windows 10 Pro     2009           10.0.19041.844
[CPU]
CsNumberOfLogicalProcessors CsNumberOfProcessors CsProcessors
--------------------------- -------------------- ------------
                          8                    1 {Intel(R) Core(TM) i5-8250U CPU @ 1.60GHz}
[Nemory]
CsTotalPhysicalMemory
---------------------
          21327122432
# 情報取得:PowerShellにて、以下のコマンドを実行
(Get-Command wsl).FileVersionInfo.ProductVersion
Get-ComputerInfo | select WindowsProductName, WindowsVersion, OsHardwareAbstractionLayer
Get-ComputerInfo -Property "*processor*"
Get-ComputerInfo -Property CsTotalPhysicalMemory

現象

  • マシンのメモリがほぼ(98%)使い果たされてしまう。1
  • 「Vmmem」というプロセスが80%近いメモリーを使用している。2

原因

以下の記事に書いてあった。 @yoichiwo7 さん、ありがとう。
結論から言うと、WSL初期設定とLinuxのメモリー利用方針の相互作用で発生していた。

  • デフォルト設定のWSLは、メモリーを自動拡張して使用し、上限は80%
  • Linux側はメモリーの空きをファイルキャッシュなどに割当てる
  • 完全なフリーエリアが極小となり、マシンメモリを使い果たす

治療

対症療法ではあるが、治療法も記事にあり、メモリー自動拡張をやめ、さらにSWAPも無効にするとよいとのこと。以下のように、「.wslconfig」というWSL設定ファイルを作成・修正する。

sakura $ENV:Userprofile/.wslconfig

以下がファイルの内容。物理メモリー(20G)の60%程度を指定し、swapは0とした。

[wsl2]
memory=6GB
swap=0

結果と予防

メモリー使用量は劇的に減り、初期状態での「Vmmem」は約2.2Gのみとなった。VSCodeでDocker開発した場合でも、9G程度であり、食い尽くすことはなくなった。
このままだと、複数コンテナを起動するときに、メモリー不足になることも想定できる。定期的にモニターしておいて、リソースプランニングすればいいのだが、適当なツールが思いつかず、当面はタスクマネージャを手動で起動て監視し、割当量をを調整することとする。

bashでスクリプトが異常動作する

前提

  • 発生時期:2021年卯月
  • バージョンおよび確認方法:下記に記載
GNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2019 Free Software Foundation, Inc.
. . . . .

Linux LAPTOP-4SVL7A92 5.4.72-microsoft-standard-WSL2 #1 SMP Wed Oct 28 23:40:43 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

NAME="Ubuntu"
VERSION="20.04.2 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.2 LTS"
. . . . .
# 情報取得:bashにて、以下のコマンドを実行
bash --version
uname -a
cat /etc/os-release

現象

bashスクリプトを実行すると、以下のようなエラーとなる。

: No such file or directory

原因

「set -xe」で実行するも原因特定できず、別のスクリプトを試していると、以下のようなエラーが出た。

bash: /usr/bin/systemctl: /usr/bin/bash^M: bad interpreter: No such file or directory

改行コードが問題であった。

初心者向けの詳細説明文字列の改行を制御する「改行コード」は、扱っている言語やOSなどで違いがあり、表示は同じに見えても内部コードとしては異なっている事がある。今回のbashスクリプトも、改行コードの違いで動作しなかった。よく遭遇する代表例としては、Windows(MS-Dos)系とLinux(*nix/BSD...)系の違いであり、それぞれAscii/UTF-8の文字セットではWindows系がCR+LF(16進数で0D0A)、Linux系がLF(0A)となる。

治療

Visual Studio Codeの設定を変更し、改行コードをLinuxと同じLFにする。34
Gitの設定も変える。(デフォルトではテキスト系の書類はpullするときに改行コードがOS標準に変換される)5

結果と予防

無事動作するようになった。改行コードや行末の余分はスペースを表示する拡張機能を入れることで可視化し、再発防止に役立てる。

WSL2 Docker が Windowsの C: ドライブを食い尽くして戻らない

前提

  • 発生時期:2021年春
  • バージョンおよび確認方法:下記
  • マシンスペック: CドライブHDD:250G SSD
PS C:\home> winver
# バージョン 20H2 (OSビルド 19042.1237)
PS C:\home> docker --version
Docker version 20.10.8, build 3967b7d

現象

C:ドライブの空き領域サイズが残り少なくなり、Docker領域が大きかったので、system prune などをして不要なイメージ等を削除。しかし、Docker領域が解放されず、ディスクの空き領域サイズに変化がない。???

原因

色々調べると6、WSL2が仮想ディスクとして領域を抱え込んでしまい、自動的には解放してくれないとのこと、しかもその領域がC:ドライブで、サイズが250Gであることが判明。

治療

以下のリンクを参考に対処する、Windowsの環境やバージョンによって使える・使えないものがあるので、注意。なお、領域を変更するときに壊れる可能性もあるため、重要なデータはバックアップすること。

その他参考リンク集

結果と予防

無事に領域が戻ってきてC:ドライブの空領域サイズも増えたのだが、250GというWSL2領域サイズの指定自体を変える方法が見つからないので、時々メンテしてあげる必要が残っている。

終りに

困ったときほど、成長するチャンス。

親記事:WSL2とVSCで作るWindowsでのDocker内開発環境(2021年睦月)

テンプレート

## 事象のタイトル
### 前提
- 発生時期:
- バージョンおよび確認方法:
- (マシンスペック:)
### 現象
### 原因
### 治療
### 結果と予防
5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4