一時ファイルによるディスク使用量
一部のユーザー環境では、opencodex のホーム(デフォルトは ~/.opencodex)に responses-state.json.ocx.<pid>.<seq>.tmp のような名前のファイルが何 GB も存在し、再起動のたびに増えていました。
これらのファイルとは
Section titled “これらのファイルとは”opencodex は、プロキシの再起動後も previous_response_id の連鎖を継続できるよう、継続用キャッシュを保持します。スナップショットはアトミックに書き込まれます。まず一時ファイルに内容を書き、次に実ファイルを一度に置き換えます。これにより、書き込み途中のクラッシュで不完全なスナップショットが残ることを防ぎます。
通常、一時ファイルは置き換えが完了すると直ちに削除されます。両方の処理の間にプロセスが終了すると、一時ファイルが残ります。
スナップショットは追記ではなく全体を書き直すため、各ファイルは最大 24 MB になります。放置されたファイルが数百件あれば、すぐに大きな容量になります。
これらは永続データではなくキャッシュです。 削除しても、処理中の会話の連鎖でコンテキストを一度再送する可能性がある以外に影響はありません。設定、認証情報、履歴は含まれません。
蓄積していた理由
Section titled “蓄積していた理由”以前から掃除処理はありましたが、プロキシが継続用キャッシュを最初に読み込む時点で一度だけ実行されていました。これは、そのプロセスが何かを書き込む前です。その結果、2 つの問題が生じました。
クラッシュ後に再起動したプロキシは、前のプロセスが残した一時ファイルを見つけるには早すぎる時点で掃除していました。書き込み中のファイルに触れないため 15 分の猶予期間があるからです。その後は稼働中に再確認しないため、再起動のたびにファイルが増えました。
さらに、所有元のプロセス ID がまだ生きているファイルは掃除対象から外していました。OS は再起動後に同じプロセス ID を再利用するため、古いファイルを実行中のプロセスのものと誤認し続けることがありました。再起動に合わせて増加したのはこのためです。
現在の opencodex の動作
Section titled “現在の opencodex の動作”掃除は起動時の一度だけではなく、通常のバックグラウンドタイマーで繰り返されます。そのため、稼働中のプロキシが放置ファイルを自動回収します。また、現在の起動より古いファイルではプロセス ID の確認を無視します。現在動いているプロセスがそのファイルを所有できないためです。
安全規則は変わりません。作成後 15 分未満のファイルは削除せず、プロキシが自分で書き込んでいるファイルも削除しません。
スナップショットの書き込み頻度
Section titled “スナップショットの書き込み頻度”書き込みにはデバウンスがかかり、待機時間は実際に最後に書き込んだスナップショットのサイズから決まります。そのファイルが小さい間は変更の約 2 秒後に次の書き込みを予定し、24 MB の上限に近づくと最大 30 秒まで延びます。急に大きくなったキャッシュでは短い待機が一度残り、その次の書き込みから長い間隔が適用されます。書き込みの省略は、このプロセスが同じバイト列を同じファイルにすでに書き、そのファイルがディスク上でも一致し、Windows 以外では所有者だけがアクセスできるモードのままである場合に限ります。新しいプロセスは同一スナップショットも一度書き直し、プロキシの背後で内容や権限が変わったファイルは放置せず、保護された書き込み経路で更新します。
通常のバックグラウンド周期では、全体をアトミックに書き直すのは最大一度です。書き込み中に継続用キャッシュが変わった場合は、直後に全体を書き直す代わりに、通常の遅延周期で後続の書き込みを一件予定します。正常終了時は、処理中のリクエストが排出された後、プロセス終了前に最後のスナップショットが追いつけるよう、回数を制限した再試行を維持します。
これにより、キャッシュが大きくなっても、2 秒ごとに全体を再シリアル化して置き換えるのではなく、書き込み頻度をおおむね一定に保ちます。
正常終了時はタイマーを待たずに直ちにフラッシュします。そのため待機時間の延長が主に広げるのは、強制終了で直近の継続エントリを失い得る時間です。上記のとおり、これらはキャッシュです。ただしフラッシュ自体もディスク書き込みなので失敗する可能性があり、ディスクが満杯または読み取り専用の状態で終了すると同じエントリを失うことがあります。
すでに蓄積したファイルの回収
Section titled “すでに蓄積したファイルの回収”プロキシが動いていれば、1~2 分以内に自動で処理されます。
プロキシが起動しない場合は、コマンドラインから確認して回収します。
ocx doctor“Response-state temp files” セクションに、回収可能なファイルの件数と容量が表示されます。このコマンドは報告のみで、変更は行いません。
実際に削除するには、次を実行します。
ocx doctor --reclaim-response-tempsどちらのコマンドもプロキシ停止中に使えます。別のプロセスがロックしているファイルは強制せず報告されます。次回の回収時に再試行されます。プロキシが動いていれば自動的に、そうでなければ次にこのコマンドを実行したときに再試行されます。
残存ファイルが非常に多く、一度に処理しきれない場合、コマンドは残件数を表示します。必要なら再度実行してください。
ここで扱うのはレスポンス状態スナップショットの一時ファイルだけです。他のコンポーネントも似た名前の一時ファイルを作りますが、対象にはなりません。

