49.7日後にTCPが停止?macOS Tahoeで導入された新たなバグか

[PR]記事内のアフィリエイトリンクから収入を得る場合があります
  • URLをコピーしました!

Photonが公開した「macOSのTCPネットワークが49.7日後に壊れる」という記事が大きな話題になりました。システムの連続稼働時間が49日17時間2分47秒を超えると、TCP通信が徐々に機能不全へ陥るという内容です。

Photonの元記事にはバグが発生するmacOSのバージョンに関する情報はありませんが、その後のHacker Newsの議論や開発者によるコード解析から、この問題はすべてのmacOSで起きるわけではなく、macOS 26(Tahoe)で導入された新しいバグである可能性が高いことが見えてきています。

この記事では、元記事の内容に加え、Hacker Newsで明らかになった追加情報も含めて、状況を整理します。

目次

49.7日後に何が起きるのか

問題の核心は、macOSのXNUカーネルが持つTCPタイムスタンプ用の32bitカウンタ(tcp_now)にあります。このカウンタはミリ秒単位で増加し続けますが、32bitの上限に達すると0に戻る「オーバーフロー」が発生します。

通常であればラップアラウンドを考慮した処理が必要ですが、XNUの実装では「値が前より大きいときだけ更新する」というガードが存在し、オーバーフロー後はtcp_nowが永遠に更新されなくなるという致命的な挙動を引き起こします。

その結果、TCPの内部タイマーがすべて停止し、特にTIME_WAITの期限切れ処理が完全に止まることが問題を深刻化させます。

Photon の検証では、49.7日を境に以下のような差が出ています。

● オーバーフロー前

  • TIME_WAIT は 30 秒で正常に消える
  • 数百の接続を作っても安定

● オーバーフロー後

  • TIME_WAIT が一切消えない
  • 数分で数百、数時間で数千へ増加

ping(ICMP)は動くため、ネットワークが完全に死んだようには見えない点も厄介です。

macOS Tahoe限定の可能性が高い?

この記事を元にしたHacker Newsの議論では、次のような追加情報が明らかになりました。

まず、複数の開発者がAppleのXNUソースコードを比較し、問題のガード条件、tcp_nowの扱い、TIME_WAITのGCの挙動が、Tahoeで追加・変更されたコードパスに依存していることを指摘しています。

また、macOS Sequoia(macOS 15)では、50日以上稼働しても問題なし、Ventura/Montereyでも再現しない、逆にTahoeで再現したという実体験もよせられています。さらにスリープを使用すると発生しづらいという報告もあります。

バグは実在するが、影響範囲はTahoeにほぼ限定か

今回の議論を総合すると、次のように整理できます。

  • 49.7日問題は実在する
  • ただし macOS 26(Tahoe)で導入された新しいバグである可能性が高い
  • 旧バージョンでは再現しないという報告が多数
  • Photon の元記事は影響範囲を広く書きすぎている
  • 24/7 稼働の Tahoe マシンは要注意

技術的には興味深いバグですが、「すべての macOS に潜む時限爆弾」というほどの広範な問題ではない、というのが現時点での最も妥当な理解かもしれません。

なお実際に手元のMac mini 2018(macOS Sequoia)は53日連続稼働中ですが、TCPは死んでいないように見えます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次