概要
- CodexのSQLiteログが大量データを書き込み、SSDの寿命を大きく消費
- TRACEレベルのグローバルログが主な要因で、約96%の無駄なログが発生
- 書き込みアンプリフィケーションにより、実際の書き込み量はDBサイズ以上
- ログフィルタリングや閾値調整などの改善策を提案
- 関連する既知の問題や議論も多数存在
CodexによるSQLiteログの大量書き込み問題
- Codexは ~/.codex/logs_2.sqlite などのSQLiteログファイルへ 大量のデータ書き込み を継続的に実施
- 21日間の稼働で 37TB の書き込み、年間換算で 約640TB、SSDの寿命を1年未満で消費する恐れ
- 主な書き込み源は TRACEレベルのグローバルログ や OpenTelemetryのミラーログ
- 1TB SSDの場合、 年間640回の全ドライブ書き込み に相当し、消耗が著しい
ログ内容と主な発生源
- 保持されているログの 約70.7%がTRACEレベル、 25.3%がOpenTelemetry系INFOログ
- 主なTRACEソースは inotifyイベント、 tokio-tungstenite の内部ロジック、 WebSocket/SSEのペイロードログ
- INFOログは OpenTelemetryイベントの繰り返し が大半
- 例: inotify event: ... mask: OPEN, name: Some("ld.so.cache") など高頻度の冗長なイベント
書き込みアンプリフィケーションの実態
- 15秒間で 36,211行 が挿入されるが、保持行数は変わらず
- 挿入→インデックス→WAL書き込み→プルーニング の繰り返しで、実際の書き込み量はDBサイズを大幅に上回る
- SSDの実効寿命低下の主因
原因の分析
- SQLiteフィードバックログシンクがグローバルTRACEデフォルト でインストールされている
- 依存ライブラリや内部ログ、プロトコルペイロードまで全て保持対象となり、無駄なデータが大量蓄積
- フィルタ設定が不十分で、 低価値ノイズログ も全て記録
改善提案
- グローバルTRACEレベルの使用中止 (デフォルト閾値引き上げ)
- 依存ライブラリやノイズの多いターゲット(log, hyper_util, tokio-tungstenite, inotify, OpenTelemetry SDK)をフィルタリング
- WebSocket/SSEの生ペイロードは記録せず、要約情報のみ保存
- イベント種別、継続時間、成否、トークン使用量、バイト長など
- codex_otel.log_only / codex_otel.trace_safeのミラーイベントも原則保持しない
- ログDBのグローバルなサイズ/書き込み上限を設定
- スレッド単位ではなく、全体で制御
- sqlite_logs_enabled = false などの無効化オプションも有用だが、本質的な解決はフィルタリング強化
関連する既知の問題・議論
- TRACEログがRUST_LOGを無視してWALに大量書き込み (#17320)
- Codex Desktopでlogs_2.sqlite/WALが急拡大 (#24275, #26374, #22444)
- Codexのアイドル時でも高いI/O負荷 (#20563, #27020)
- goals_1.sqliteでの書き込みアンプリフィケーション (#27911)
- 長時間スレッドでのメモリ・TRACEログ負荷によるアプリの不安定化 (#21134, #12969)
まとめ
- Codexの現状デフォルト設定では SSD寿命を著しく損なうリスク
- TRACEレベルのグローバル記録をやめ、ノイズログをフィルタリング することが最優先
- ログDBサイズ制限やペイロード要約化 など、運用面・技術面双方の対策が必要