wsl –shutdownが効かないときはLinux用Windowsサブシステムを終了すると再起動しなくて済む

TL;DR

  • wsl –shutdownでWSLを終了できないときは、タスクマネージャーのプロセスタブで「Linux用Windowsサブシステム」を終了する
  • 終了後、WSLを普通に起動できる(「Linux用Windowsサブシステム」も勝手に上がってくる)

きっかけ

wslがよくCPU100%になりフリーズします。

以前のPCではコマンドプロンプトでwsl –shutdownを実行して復旧していましたが、新しいPCでwsl –shutdownを実行しても反応がなく、PC再起動するしかない状態になりました(新旧どちらもWindows10の同じようなbuildで、ハードウェアも同じメーカーのほぼ同じ機種(機種が少し新しくなって、機種名につく数字がちょっと上がったくらい))。

wslのフリーズはよく起こるもので、その度毎回PC再起動はつらすぎるので、対策を調べたところ、タスクマネージャーで「Linux用Windowsサブシステム」を終了すればWSLが終了され、PC再起動しなくて済むことを確認しました。

状態

WindowsTerminalでWSL操作中に、突然ターミナルがフリーズしてコマンドを受け付けなくなり、新規ターミナルでの接続も受付なくなり、コマンドプロンプト管理者起動のwsl –shutdownも20分とか待っても全然効かない。CPU使用率はvmmemプロセスがCPU100%で張り付き

対応

タスクマネージャのプロセスタブで、バックグラウンドサービスの中にある、「Linux用Windowsサブシステム」を右クリックしてタスクの終了を実行する

実行後すぐ、CPU使用率はおさまり、WSLを実行していたWindows Terminalは、wsl –shutdownしたときと同じ強制終了のメッセージが出力されています。

WSLを再起動すれば普通に使えるようになります。

参考

High CPU usage for vmmem - Microsoft Q&A

効かなかった方法

英語圏のサイトでたまに紹介されてる以下は、wsl –shutdown同様、反応がありませんでした

Restart-Service LxssManager

その他

WSLがフリーズしないようにするためにあれこれお試し中ですが今のところ以下は効果がありません

.wslconfigでのメモリの調整

[wsl2]
memory=6GB
swap=0

guiApplications=falseは英語圏の各所で紹介されていましたが、設定していてもフリーズは起きました。また、設定しているとaws sso loginができない(X(*GUI)を飛ばせない)ため記述を消しました。

メモリの調整はあまり効果がなさそうです。ただ、フリーズするときにvmmemのメモリ使用量を見ると、2GBになっていることを2回見かけました。memoryを1GBとかにしてみようかな(著者WSLはサーバ用途で使ってないので可能です)。

他にもWSLの設定回りや.wslconfigで何か効きそうなのないかなとたまに調べ中です。

Google検索すると、Windows11でWindowsUpdateしたら直ったという情報があったので、Windows11にしてみたい感はあります。

何か良い方法とかフリーズ対策があればアップデートしようと思います。

追記) 次回起きたら、以下を試します(-tはterminate)。ただしwslコマンド自体がフリーズしてるような感じ(wsl -l -vとか返ってこない)ので期待薄です。

wsl -t Ubuntu-22.04

再発時の対応メモ

原因特定試みたけど無理だった

  • なんでもない作業中に突然PCのCPU100%(WSLで何かしたわけではなく、PCでも何かソフトを起動したり重い作業をしたりしたわけではない)
    • ただし、自分は休止状態を多用してて、休止状態明けから発生してるような気がしてる(といっても休止状態なしでしばらく稼働中であっても発生するかもしれないので明確には分からない。発生頻度数日に1回とかだし)
  • 以前の状態との違いは、WSLへのメモリ割り当てを1GBにしたこと
    • 以前は6GB当てていたが、CPU高騰時にメモリ使用量が2GBなのが気になっていた
    • 切り分けでメモリ割り当て1GBにして使ってた
    • しばらく安定していた気がするがやはり再発した
  • vmmemがCPUはりついてる
  • wsl –shutdown wsl -t Ubuntu-22.04受け付けず
  • WSLはSSH可能、OSの負荷は低い
    • top/vmstatでCPU使用率低い
      • usr: 1%未満, sys:10%弱
        • sysはちょっと気になるが
    • topでロードアベレージ1~2
  • Process ExplorerでもvmmemプロセスCPU使用率高い
    • PerformanceタブのCPUの稼働状況(context switchなど)はすべてN/Aで値が取れていない
    • Threadsタブ何も表示されない(vmmemプロセスのどのスレッドか特定できるはずだができない)
    • MinuDump/FullDumpの生成どちらも受け付けない(アクセス拒否)
  • タスクマネージャのダンプの生成を実行しても反応がない
  • そうこう10分くらい原因特定試みてたら、WSLのターミナルがフリーズして操作を受け付けなくなっていた(いつもの状態)
  • コマンドプロンプト管理者実行での taskkill /im vmmem /f は効かない: エラー: プロセス “vmmem” (PID 12204) を強制終了できませんでした。理由: アクセスが拒否されました
  • タスクマネージャでvmmemのタスクの終了は、上記同様のアクセス拒否エラーで効かない
  • 結局タスクマネージャでLinux用Windowsサブシステムを終了するしかない
  • 終了後はCPU使用率が100%から5%に低下

分かったこと

  • たぶんWSLで稼働してるOS上のプロセスがなにかではなく、ガワ(WSL側)で問題が起きてる
  • CPU使用率高騰後も10分間とかWSL操作できる
  • Process Explorerで高負荷スレッド特定不可とか、ダンプ吐けないとか、調査できない?

再発時の対応めも2

意味なかったこと

  • 「Linux用Windowsサブシステム」を構成するプロセス群を手動で終了(wsl[host|service].exe, msrdc.exe, dllhost.exe/conhost.exe(wsl用のもののみを対象))
  • タスクマネージャを管理者起動してvmmemプロセスを削除
  • 上記実施して意味なかったので「Linux用Windowsサブシステム」を終了しようとしたところ、「Linux用Windowsサブシステム」がタスクマネージャのプロセスタブ一覧から表示がなくなり、どうしようもできず、PC再起動するしかない状態に

わかったこと

  • 「Linux用Windowsサブシステム」を構成するファイル群
    • C:\Program Files\WindowsApps\MicrosoftCorporationII.WindowsSubsystemForLinux_1.2.5.0_x64__8wekyb3d8bbwe
      • wsl.exe, wslhost.exe, wslservice.exe, msrdc.exeなど
    • System32
      • dllhost.exe, conhost.exe
  • 上記exe群を手動で終了してもvmmemのCPU張り付きは改善しない。むしろ「Linux用Windowsサブシステム」終了での対処が効かなくなり、PC再起動するしかなくなる
  • 「Linux用Windowsサブシステム」の終了、以外の対処はむしろしない方がマシ(PC再起動するしかなくなるので)