ファイルディスクリプタ枯渇時の症状と対処

  • URLをコピーしました!

Linuxサーバーで突然アプリケーションが不安定になったり、 「ファイルが開けない」「接続できない」といったエラーが多発する場合、 ファイルディスクリプタ(FD)枯渇が原因であることが少なくありません。

本記事では、ファイルディスクリプタ枯渇時に現れる典型的な症状即座に行うべき確認手順、 そして恒久対策まで含めた実務的な対処方法を解説します。

目次

ファイルディスクリプタとは

ファイルディスクリプタとは、 Linuxにおいてプロセスがファイルやソケットを扱うための識別子です。

以下はすべてファイルディスクリプタを消費します。

  • 通常のファイル
  • ログファイル
  • TCP / UDP ソケット
  • パイプ

つまりネットワークアプリケーションほどFDを大量消費します。

ファイルディスクリプタ枯渇時の典型的な症状

① アプリケーションエラーが多発する

Too many open files
EMFILE (Too many open files)

Java、nginx、Apache、DBなど多くのミドルウェアで見られる代表的なエラーです。

② 新規接続ができない

  • Webアクセスが急に通らなくなる
  • DB接続が張れない
  • SSH接続が失敗する

既存接続は生きているが、新規接続だけ失敗する場合は要注意です。

③ ログが出力されなくなる

ログファイルを開けなくなり、 障害が起きているのにログが増えないという状態になります。

④ systemd サービスが起動しない

Failed to open file descriptor
Resource temporarily unavailable

FD不足によりサービス起動自体が失敗するケースもあります。

現在のファイルディスクリプタ使用状況を確認する

システム全体の上限

cat /proc/sys/fs/file-max

システム全体で使用可能なFDの最大数です。

現在の使用数

cat /proc/sys/fs/file-nr

出力例:

12345    0    200000
  • 使用中FD数
  • 未使用(通常0)
  • 最大値

プロセスごとのFD使用数

ls /proc/<PID>/fd | wc -l

FDを異常に消費しているプロセスを特定できます。

ulimit による制限を確認する

現在の制限値

ulimit -n

これは1プロセスあたりのFD上限です。

よくある問題例

  • システム全体は余裕がある
  • プロセスの ulimit が低すぎる

この場合、特定アプリだけがFD枯渇を起こします。

一時的な対処(緊急対応)

① 不要なプロセス・接続を減らす

  • アプリケーション再起動
  • 異常な接続元の遮断

※ 根本解決ではありませんが、サービス復旧を最優先します。

② ulimit を一時的に引き上げる

ulimit -n 65535

※ セッション単位なので再ログインで戻ります。

恒久対策①:ulimit の設定変更

/etc/security/limits.conf

* soft nofile 65535
* hard nofile 65535

systemd管理サービスの場合は次も重要です。

systemd の制限確認

systemctl show <service> | grep LimitNOFILE

設定例:

[Service]
LimitNOFILE=65535

恒久対策②:アプリケーション側の問題を疑う

FDリークの典型パターン

  • ソケットをcloseしていない
  • ファイルを開きっぱなし
  • 例外処理でclose漏れ

時間経過とともにFDが増え続ける場合はほぼFDリークです。

lsofで調査

lsof -p <PID>

どのファイル・ソケットが大量に開かれているか確認します。

よくある勘違い

  • メモリが足りない → ×
  • ディスクがいっぱい → ×

FD枯渇はリソース不足でもディスク不足でもありません。 独立した制限です。

設計・運用時のベストプラクティス

  • 高負荷サーバーは初期から nofile を引き上げる
  • systemd の LimitNOFILE を必ず明示
  • FD使用数を監視項目に入れる
  • 接続数が多いアプリは定期的に lsof で確認

まとめ

ファイルディスクリプタ枯渇は、 事前に知っていれば確実に防げる障害です。

「突然つながらない」「ログが出ない」といった症状が出たら、 まずFDを疑うことが重要です。

正しい制限設定と監視で、 FD枯渇は“事故”ではなく“管理可能な事象”になります。

目次