接続トラブルシューティング · Clash 技術ブログ

Mihomo macOS TUN:ENOTSOCK と CPU 高負荷

macOS Mixed TUN でログが大量に出続け、CPU 使用率が高く、ENOTSOCK が出ますか。実際のコアと v1.19.32 の修正を確認し、バックアップ後に更新して権限を付与し直します。エラーループと通信を検証し、失敗したら設定を戻します。

  • macOS
  • Mixed TUN
  • ENOTSOCK
  • Mihomo
  • v1.19.32
目次

MacでTUNプロキシを有効にした後、MihomoのCPU負荷が下がらず、ログにエラーが出続ける場合、何から調べればよいのでしょうか。Mixed TUNのエラーの特徴と実際のコアバージョンから確認できます。対処が有効だったかは、ログ、CPU使用率、実際の接続結果を併せて判断します。

Mixed TUNのパケット読み取りエラーループに当てはまる症状は?

macOSのMixed TUNログでsocket operation on non-socketが繰り返し続けているかを確認し、MihomoがCPUを継続して使用しているかも確認してください。一度だけの起動エラー、通常の通信負荷、画面側のメモリ増加だけでは、このパケット読み取りエラーのループとは判断できません。

Issue #3310 は、Apple Silicon 上の Clash Party 2.0.3、Mihomo v1.19.31、mixed スタックで発生した障害の報告です。確実な再現手順はなく、スリープからの復帰、ネットワークの切り替え、設定の再読み込みとの関係も確認されていません。この報告から、すべての Mac や TUN の高 CPU 負荷を同じ問題と判断することはできません。

照合用のエラー内容。実行するコマンドではありません
batch read packet: socket operation on non-socket

v1.19.32 はパケット読み取りのエラーループをどう終了する?

今回確認するのは Mihomo コアであり、クライアントのバージョンだけではありません。Clash Party のコアカードに表示される実際のバージョンとチャンネル、TUN の有効・無効、stack の値を記録し、サブスクリプション、ローカル設定、上書き、アプリ設定を別の場所にバックアップしてください。クライアントを更新しても、古いコアが動いていれば、この修正は適用されていません。

v1.19.32 では macOS のパケット読み取りエラーの扱いが変わり、ENOTSOCK と EBADF を終了状態として扱います。これにより Mixed TUN の読み取りが終了し、同じエラーの連続出力を防ぎます。修正の対象はエラーループです。最初に接続が使えなくなった原因と、通信が復旧したかどうかは、別々に確認する必要があります。

版とエラーに応じた対応

現在の状態最初に行うこと
v1.19.31 が動作し、Mixed TUN で同じパケット読み取りエラーが続く証拠と独立したバックアップを保存し、修正を含む v1.19.32 に更新してから、権限を付与し直して検証します。
v1.19.32 が動作しているのに、エラーが続くか再発するまず TUN を無効にし、新しいバージョンの短いログと現在の設定を保存します。既存の修正が、同じメッセージのエラーをすべて解決したとは判断しないでください。
該当する読み取りエラーはなく、画面のメモリ、ダウンロード、通常の通信だけに異常がある実際に起きているメモリ、ダウンロード、接続の問題を調べてください。CPU使用率が高いというだけでプロトコルスタックを変更したり設定をリセットしたりしないでください。
依存関係のバージョンとソース上の根拠
Mihomo v1.19.31 は sing-tun v0.4.24 を使い、v1.19.32 の go.mod は v0.4.27 を使っています。対象の修正コミットでは ENOTSOCK と EBADF を os.ErrClosed に分類しています。依存関係のバージョンとエラー処理の実装を確認するための情報です。
公式記録と実機での検証
#3310 の返信で v1.19.32 が示され、その後、報告者は issue を閉じました。ただし、その時点では更新して確認する予定と述べただけで、更新後の端末での結果は公開していません。根拠は公式資料と版を固定したソースコードであり、実機での再現や更新による復旧はまだ検証していません。

Clash Party でコアを更新した後は、TUN の権限も付与し直す

時刻付きのエラーを少量、実際のコア版、CPU の観察結果を保存し、TUN を無効にして繰り返しエラーが止まるか確認します。一時的な通信には、元の設定が対応している場合だけシステムプロキシを使ってください。それに従うアプリだけが対象で、端末全体の通信を扱うわけではありません。完全なログを集めるためにエラーを出し続けないでください。

以下の操作箇所は、Clash Party v2.0.3 に固定したソースコードと中国語のラベルを照合しています。ほかのクライアントでは、それぞれの公式なコア更新方法を使い、同じメニューを探してそのまま操作しないでください。バックアップを読み込めることと、現在の設定が使えることを先に確認し、一時的に通信が止まってもよい時間を選びます。

この節は通常の Mihomo 設定を対象にしています。現在 Smart や別のコア分岐を使い、その固有機能に依存している場合は、元のメンテナーの互換性に関する説明を先に確認し、通常版の特定バージョンへ直接切り替えないでください。コアの種類が異なる場合、バージョン番号が新しいという理由だけで置き換えることはできません。

実際に動作しているコアを更新する

  1. コア設定を開き、変更前の値を記録する

    コアカードからコア設定を開き、現在のチャンネルと具体的なバージョンを記録します。安定版、プレビュー版、Smart、特定バージョンは別の選択肢です。アプリ設定の Clash Party バージョンは、コアのバージョンではありません。

  2. 公式の特定バージョン v1.19.32 を選ぶ

    コア設定で「特定バージョンを選択」を使い、v1.19.32 を選んでインストールを完了します。この操作は、プロジェクトの固定バージョンの配布元を使います。配布元と結果を確認し、今回の修正のためにプレビュー版や Smart へ切り替えたり、出所不明のコアファイルを読み込んだりしないでください。

  3. 仮想ネットワークインターフェースのコアに手動で権限を付与し直す

    macOS では、コアを置き換えると元の権限が失われる場合があります。「仮想ネットワークインターフェース」のページで「コアに手動で権限を付与」を使い、実際のシステム表示に従って確認を完了してください。権限が失われた通知を閉じるだけでは対処になりません。システムのセキュリティ設定を削除して、権限付与を回避することも避けてください。

  4. 再起動後に、実際のコアのバージョンを確認する

    コアの再起動を行い、コアカードに v1.19.32 と表示されるか確認します。ログの繰り返しが止まったら、後の節にあるチェックリストに従って TUN を戻してテストしてください。成功表示やダウンロード済みのファイルだけでは、実行中のバージョンは確認できません。

通常の更新ボタンと「特定バージョンを選択」は別の操作です。ここでは、照合する対象を固定するために特定バージョンを使います。それ以降のバージョンはリリースノートを別途確認し、将来のバージョンまで検証済みと扱わないでください。ダウンロード、検証、権限付与、起動のどこかで失敗した場合は、その段階で止め、コア、サブスクリプション、DNS の変更を次々に重ねないでください。

スタックの比較も必要な場合は、元の設定を残して stack だけを変える

まず、確認済みのコア修正を適用してください。一時的な比較が本当に必要な場合は、自分で管理するローカルのオーバーライドで tun.stack だけを mixed から gvisor に変更し、元の値とバックアップを保存します。元の設定が mixed ではない場合や、クライアントに対応済みのオーバーライド操作がない場合は、この手順をそのまま使わないでください。

以下は変更するフィールドだけを示しており、完全な設定ではありません。元の DNS、ルート、デバイス名、サブスクリプション、その他の TUN 項目を維持してください。適用後、実際の実行設定が gvisor になっていることを確認し、通常の手順でコアを再起動します。リモートのサブスクリプションは変更せず、strict-route も同時に変えて比較結果を分からなくしないでください。

一時的な比較では、既存の tun 内の stack だけを変更する
tun:
  stack: gvisor

#3310 の一度の復旧には、再起動と設定変更の両方が含まれています。gVisor だけのおかげとは判断できず、長期的に再発しないことも証明していません。公式文書は system、gvisor、mixed の実装を区別しており、「新しいほどよい」という順序ではありません。同じ用途の通信で変化を記録し、改善しなければ元の stack に戻してください。新しい設定をそのまま恒久的な解決策と扱わないでください。

ログの連続出力が止まった後、CPU と実際の通信が回復したか確認する

同じ設定と近い負荷で、コアとクライアントの二つのプロセスを観察し、失敗していたサイトやアプリの通信をもう一度試します。ほかの人の CPU 数値を合格基準にせず、自分の変更前後の継続的な使用率とログの増え方を比較してください。一時的な数値の低下を、長期的な結果と判断しないようにします。

ログの繰り返しが止まっても、TUN で通信できるようになったとは限りません。まだアクセスできない場合は TUN を無効のままにし、コアの起動、権限の付与、現在の設定の反映を順に確認してから、通常の手順で再起動して元のリクエストを試してください。ログレベルを上げ続けたり、同時に DNS を変えて対処を探ったりしないでください。

修正後に一つずつ確認する

  • 動作中のコアが v1.19.32 であると確認し、クライアントのバージョンは別に記録する
  • TUN に必要な権限が付与され、元のサブスクリプションとローカル設定を読み込める
  • 同じパケット読み取りエラーが高速で繰り返されず、ログの増え方が通常に戻っている
  • 近い負荷で、コアとクライアントの CPU 使用率が異常に高い状態が続かない
  • 元の用途での通信、直接接続、プロキシ経由の接続、実際に必要な UDP 機能をそれぞれ検証する
  • 通常の手順でコアを再起動して再テストし、元のチャンネル、stack、独立したバックアップを保存する

更新や比較に失敗したら、どう戻して報告する?

stack を一時的に変えた場合は、記録した元の値に戻してコアを再起動し、基本的な通信が回復するまで TUN は無効のままにします。必要なら、以前使えていた対応済みのシステムプロキシ方式を使ってください。すべてのアプリを対象にできるとは考えず、クライアントのデータディレクトリ全体を削除しないでください。

新しいコアが起動できない場合は、バックアップに従って元のチャンネル、具体的なコア、設定を戻し、クライアントの案内に従って権限を付与し直してください。古いコアには今回のエラーループが残っている可能性があり、問題が発生すると分かっている条件で長期的な対策として使うべきではありません。戻した後にログの連続出力が再び始まったら、TUN を無効にし、使える通信方式を維持して再試行を止めます。プログラムのダウングレードと設定の復元は、同じ操作ではありません。

再発する場合は、macOS とアーキテクチャ、クライアントと実際のコアのバージョン、stack、権限付与の状態、保存できた最も早い時点の短いエラー記録、再起動前後と変更前後の違いを伝えてください。設定の再読み込み、スリープからの復帰、ネットワークの切り替えについては実際に観察したことだけを記録し、時刻が近いという理由で原因と判断しないでください。共有前に、サブスクリプションのトークン、パスワード、プライベートドメイン、端末の識別情報を削除します。

参考資料