Codexが静かにSSDを削っていた
(1行のデフォルト設定が招いた書き込み増
幅)

OpenAI Codexのあるバグが、ユーザーのSSDを静かに削り続けていました。
ファイルサイズは数百MBに見えても、裏側では年間640TB相当の書き込みが走っていました。
原因は派手な機能のバグではなく、Level::TRACEという1行のデフォルト設定です。

関連記事

1. ファイルサイズは小さくても、SSDへの書き込みは止まっていない

Codexは診断ログを~/.codex/logs_2.sqliteというローカルファイルに保存します。
ある報告者がこのファイルの内部を調べたとき、奇妙な数値に気づきました。

保持している行数は約50万。
それに対して、これまでに割り当てられた行のIDは55億を超えていました。
1万倍の乖離1です。

何が起きていたかというと、ログ行が挿入されては即座に削除されるサイクルが絶え間なく続いていました。
SQLiteはWAL(Write-Ahead Logging:書き込み前ログ)という仕組みを使い、変更をまずWALファイルに書き出してから本体に反映します2
行が増えも減りもしなくても、このinsert-and-pruneのサイクルごとに物理ディスクへの書き込みが発生します。
ファイルサイズが横ばいに見えるのは行の増減が相殺されているからで、SSDへの書き込み自体は休んでいません。

21日間のアップタイムで、ある報告者のSSDへの書き込みは約37TBに達しました3
年換算すると約640TBになります。
コンシューマー向け1TB SSDの保証書き込み耐久値であるTBW(Terabytes Written)はおよそ600TBWで、これを1年未満で使い切るペースです4

2. 根本にあったのはTRACEを全対象にしたデフォルト1行

Codexのソースコードを辿ると、この書き込みの起点はひとつの記述に行き着きます。

Targets::new().with_default(Level::TRACE)Code language: Rust (rust)

SQLiteへのログシンクが、すべての対象に対してTRACEレベルで動作するよう設定されていました。
TRACEはログレベルの中で最も詳細な粒度で、通常は開発中にだけ一時的に使うものです5
WebSocketの通信イベント1件ずつ、内部テレメトリの重複ミラー、低レベルのHTTPライブラリの状態——これらが全部、毎秒数十から数百回のペースでSQLiteに書き込まれていました。

保持ログのうちTRACE単体が占める割合は70.7%。
最大の発生源はcodex_api::endpoint::responses_websocketで、このターゲット1つだけで527MBを占めていました。
本来なら開発者がデバッグ時にだけ見るはずの通信ペイロードが、すべてのユーザーの手元のSQLiteに永続書き込みされていたことになります。

3. RUST_LOG=warnでは止められない設計になっていた

Rustアプリケーションでは、RUST_LOG=warnという環境変数を設定すれば低レベルのログ出力を抑制できます。
多くのユーザーがこれを試みましたが、Codexでは効果がありませんでした。

Codexのログパイプラインは、SQLite書き込みシンクに対してRUST_LOGを参照しない実装でした6
CLI、デスクトップアプリ、VSCode拡張のどれも外から設定を渡す口がなく、ユーザーには問題を認識することも自衛することも難しい状況でした。

これはログバグというより設計の穴です。
環境変数による制御が想定されていない箇所に、最も冗長なログレベルが設定されていました。
ユーザーが問題に気づいたとき、できることが何もない構造になっていたのです。

4. 修正は2つのPRで完結し、削減率は85%

2026年6月22日、2本のPRがメインブランチにマージされました。

  • PR #29432:WebSocketイベントを毎回ログに書くのをやめる7
  • PR #29457:冗長なテレメトリの重複ミラーをフィルタリングする8

変更の骨格はシンプルです。
全対象をTRACEで記録するデフォルトをやめ、Codex本体のターゲットにはINFO以上、高ノイズな依存ライブラリにはWARN以上を適用します。
この2本だけで、報告者の環境では約85%のログ削減が確認されました。
同日、rust-v0.142.0としてリリースされています9
すでにCodexを使っている場合は、アップデートで対処できます。

5. デフォルト値は、設計者の意思表示だ

このバグは、派手なクラッシュも警告メッセージも伴いませんでした。
SSDの摩耗という、通常の使用では気づきにくい形でだけ影響が積み上がっていたのです。

デフォルト値はコードの中に書かれていますが、何をデフォルトにするかは設計判断です。
Level::TRACEはおそらく開発中の利便性のために選ばれ、出荷前にそのまま残りました。
ソフトウェアが生成するデータの行き先——ログ、キャッシュ、一時ファイル——をユーザーが制御できるかどうかは、「便利な機能」ではなく設計の前提として決まっています。
その前提は、ユーザーが設定画面を開かなくても、すでに動き始めています。

  1. GitHub issue #28224で報告されたデータ。著者の環境では15秒サンプルでmax_row_idが約36,211増加したにもかかわらず保持行数は横ばいで、insert-and-pruneサイクルによる書き込み増幅の証拠として示された。 – Codex SQLite feedback logs can write ~640 TB/year and rapidly consume SSD endurance
  2. WALはSQLite 3.7.0(2010年)から採用されたジャーナルモード。変更をDBファイルに直接書き込まず-walファイルに記録し、デフォルトでは-walファイルが1,000ページに達した時点で自動チェックポイントを実行して本体に反映する。このアーキテクチャにより読み取りと書き込みを並行して行える反面、insert-and-pruneのような高頻度書き込みパターンでは物理書き込み量が増幅しやすい。 – Write-Ahead Logging – SQLite公式ドキュメント
  3. issue #28224でプロセス・ファイルレベルのI/O計測により確認された実測値。CodexのSQLiteログが主要な書き込み源であることが示された。macOSのsmartctlコマンドでNVMe SMART指標のData Units Writtenを参照して推計している。 – Codex SQLite feedback logs can write ~640 TB/year and rapidly consume SSD endurance
  4. TBWはメーカーが保証する書き込み総量の上限値で、超えても即座に故障するわけではなくあくまで保証の範囲を示す指標。Appleは自社SSDのTBW値を非公開にしているが、コンシューマー向け1TB SSDは製品によって300〜600TBW前後の保証値を持つことが多い。実際には保証値の数倍を書き込んでも動作し続けるケースが報告されている。 – How worried should you be about your M1 Mac’s SSD lifespan? – Macworld
  5. RustのtracingクレートはERROR/WARN/INFO/DEBUG/TRACEの5段階を定義する。TRACEは最も詳細で最も冗長なレベルで、公式ドキュメントには「very low priority, often extremely verbose, information」と定義されている。本番環境のデフォルトには通常INFO以上が使用される。 – Level in tracing – Rust
  6. RUST_LOGはenv_loggerやtracing-subscriberがデフォルトで参照する環境変数だが、アプリケーションがコード内でフィルタをハードコードした場合には無視される。CodexはSQLiteシンクに対してTargetsによるフィルタ設定をソースコード内で行っており、RUST_LOGとは独立して動作する設計になっていた。 – tracing_subscriber – Rust
  7. タイトルは “Stop logging every Responses WebSocket event”。codex_api::endpoint::responses_websocketからのTRACEログのほとんどを削除し、接続・切断・エラーなど意味のあるイベントのみに絞った変更。 – Stop logging every Responses WebSocket event #29432
  8. タイトルは “Filter noisy targets from persistent logs”。SQLiteログシンクのデフォルトフィルタを見直し、codex_otel.log_onlyやhyper_utilなど高ノイズなターゲットをWARN以上に引き上げた変更。 – Filter noisy targets from persistent logs #29457
  9. 2026年6月22日リリース。ログ削減のほか、/usageでの使用量リセットクレジット機能、ロールアウトトークンバジェット管理、マルチエージェントモード設定など複数の新機能も含まれる。 – Releases rust-v0.142.0 – openai/codex