正当なファイルディスクリプタのピークは、アクティブな接続や開いている作業に伴って上昇し、その作業が終了すると減少します。ディスクリプタリークは、アプリケーションがもはや必要としないリソースを開いたままにし、カウントが上昇するベースラインを形成し、最終的にプロセス、サービス、コンテナ、またはシステムの制限に達します。
この区別は重要です。なぜなら両方の状態が同じ最終エラーを引き起こす可能性があるからです。ディスクリプタ制限を引き上げることは、忙しいリバースプロキシの正しい容量計画かもしれませんが、ソケット、ファイル、パイプ、ウォッチャーが決して解放されない場合は失敗を遅らせるだけです。
正当なディスクリプタピークを定義するパターンは?
正常なピークは作業の同時実行に従います。正当なピークはアクティブな作業量を追跡し、リクエストの完了、ソケットのクローズ、ワーカーの終了、一時ファイルの解放に伴い減少します。
イベントの前後のベースラインは似たままです。バックアップウィンドウ、メディアストリームのバースト、多数の同時ウェブクライアントは、リソース処理の破損を示さずに高いカウントを生み出すことがあります。
ピークは完了した作業と相関しているはずです。クライアント数が2倍になれば、ほぼ2倍のアクティブソケットが作成され、カウントがその後戻る場合、システムは永続的な損失ではなく有限の容量需要を示しています。
どのようなパターンがディスクリプタリークを示すのか?
リークは最大値だけでなくベースラインも変化させます。リークは作業終了後もディスクリプタを開いたままにします。そのため、すべてのリクエストサイクル、再接続、リロード、失敗した操作がいくらかのリソースを残します。
カウントは短時間のテストでは隠れるほどゆっくり増加することがあります。サービスは数時間または数日間は正常に見えても、残りのディスクリプタの余裕が次の接続やファイルオープンに対して小さくなりすぎるまで問題が表面化しません。
プロセスを再起動するとカウントはリセットされます。これはカーネルがディスクリプタを閉じるためですが、その回復は根本的な問題が解決したことを証明しません。サービスが再び処理を開始すると、同じ傾きが戻ってきます。
なぜソケット、ファイル、ウォッチャーは異なる曲線を示すのか?
Linuxは複数のI/Oリソースタイプにディスクリプターを使用しており、異なるリソースタイプは異なる成長パターンを作り出します。したがって、各タイプには異なるワークロードの説明が必要です。
クライアントソケットは同時セッションに従うべきです。ログやメディアファイルはアクティブなハンドルに従うべきです。パイプは子プロセスに従い、ウォッチャー関連のディスクリプターは監視対象パスの数が別のカーネル制限で増加しても安定したままであることがあります。
ディスクリプターをターゲット別に分類することは、合計値を読むよりも有用です。トラフィックの急増時に予想される数百のソケットは、着実に増加する削除されたログファイルや、利用できない依存先への繰り返し接続とは異なります。
なぜ上限を上げるとリークの遅延になるのか、修正にはならないのか?
「Too many open files」エラーは、成長が上限に達したときにのみ発生します。上限を上げることはリークの枯渇を遅らせるだけです。
上限を上げると、再起動から失敗までの時間が延びます。これにより、短期間の観察ウィンドウではサービスが修復されたように見えますが、リークはより多くのカーネルメモリやネットワーク・ストレージの状態を消費し続けます。
したがって、容量の変化はディスクリプターが正常に解放されている証拠に従うべきです。そうでなければ、新しい上限は安定性の改善ではなく、より大きな失敗の範囲を示します。
どの測定値が容量とライフサイクルの失敗を区別するのか?
合計カウントは最初の信号に過ぎません。ディスクリプターの経過時間とタイプが根本原因を明らかにします。同じタイムライン上でカウント、ターゲットタイプ、オープン時間、作成率、クローズ率、トラフィック、完了リクエストを追跡してください。
ピークの場合、ディスクリプターのカウントは同時実行数とともに変動し、最終的には戻るべきです。リークの場合は、オープン時間とベースラインが上昇する一方で、有効な作業量は比例して増加しません。
1回のスナップショットではなく、複数のサイクルを比較してください。単一の高いカウントだけでは、プロセスが通常の波の頂点に近いのか、それとも持続的な上昇傾向の途中にあるのかを示すことはできません。
より高いディスクリプタ制限はいつ本当に正当化されますか?
接続の再利用は正当なディスクリプタ需要を減らします。制限を増やす前に、回避可能な接続の変動を除去し、プールを制限し、作業完了時にリソースが閉じられることを確認してください。
テストされた正当な同時実行が現在の有効なサービス制限に近づき、ディスクリプタ数がベースラインに戻り、メモリ、ソケットバッファ、バックエンドプール、回復動作が高い需要を支えられる場合、より大きな制限が正当化されます。
ハードな障害ポイントの下にアラートを設定し、管理用の余裕を確保してください。目標は制限を到達不能にすることではなく、正常なピークを測定された運用範囲内に保ち、異常な増加を早期に検出することです。
| 観察されたパターン | 考えられる意味 | 次のチェック |
|---|---|---|
| トラフィックに応じてカウントが増減する | 正当な同時実行ピーク | サービス制限の容量テスト |
| サイクルごとにベースラインが上昇する | ディスクリプタリーク | 未クローズのリソースを種類と経過時間で分類する |
| 再起動でカウントがリセットされ、その後傾きが戻る | ライフサイクルの欠陥が残る | オープンとクローズの経路を追跡する |
| シェルの制限がサービスの障害ポイントと異なる | systemdまたはコンテナの制限不一致 | 実行中のプロセス制限を調査する |
よくある質問
CPU使用率が低くてもファイルディスクリプタリークは発生しますか?
はい。プロセスは待機中にソケットやファイルを保持し、新しい割り当てが失敗するまでほとんどCPUを消費しないことがあります。
TIME_WAITはディスクリプタリークの証明になりますか?
いいえ。TIME_WAITはソケットが閉じられた後のTCPカーネル状態です。ディスクリプタリークはアプリケーションがまだ開いたディスクリプタを保持していることを意味します。
なぜサービスの再起動で問題が解決したように見えるのですか?
プロセスの終了はディスクリプタを閉じて余裕を回復します。アプリケーションのライフサイクルが壊れたままの場合、カウントは再び増加し始めます。
アラートは固定のディスクリプタ数を使用すべきですか?
有効な制限の割合と成長の挙動の両方を使用してください。安定した高いカウントは正常な場合がありますが、低くても着実に増加するカウントは危険な可能性があります。
最終的な結論
正当なディスクリプタのピークはアクティブな作業に続き、安定したベースラインに戻ります。リークは作業終了後もリソースを保持し、最終的に有限の限界を超える上昇する床を作り出します。制限を引き上げる前に、曲線、リソースの種類、ディスクリプタの経過時間を診断してください。余分な余裕はライフサイクルが正しい場合にのみ実際の容量をサポートします。
テック&AIハブ
もっと読む

Home Assistantにおけるランタイム状態と永続状態:再起動後も維持すべきものは?
Home Assistantはすべてのライブ値を永続化するわけではありません。設定、レジストリ、選択された復元状態、履歴、デプロイデータは、再起動時にそれぞれ異なる役割を果たします。

Home Assistantはローカルセッションとリモートセッションをどのように認証しますか?
ローカルおよびリモートのHome Assistantセッションでは、同じサーバー側のIDモデルを使用します。リモートアクセスによって変わるのは経路とTLSの境界であり、トークンフローの中核ではありません。

Recorderデータが増えると、なぜHome Assistantの履歴クエリは遅くなるのですか?
レコーダーの成長に伴い、要求された範囲に含まれる行数が増えたり、キャッシュミスが増加したり、ストレージやインデックス処理が遅くなったりすると、履歴クエリのコストが上昇する可能性があります。

