ファイルディスクリプタ
OS がオープンしたファイルやソケットを識別するための整数値
ファイルディスクリプタとは
ファイルディスクリプタ (File Descriptor, fd) は、OS がオープンしたファイル、ソケット、パイプを識別するための非負整数値である。Unix の「全てはファイル」の思想に基づき、ネットワーク接続もファイルディスクリプタで管理される。
標準のファイルディスクリプタ
標準のファイルディスクリプタを以下にまとめる。
| fd | 名前 | 用途 |
|---|---|---|
| 0 | stdin | 標準入力 |
| 1 | stdout | 標準出力 |
| 2 | stderr | 標準エラー出力 |
| 3+ | 決まった名前は無く、open などが空いている番号を返す | ファイル、ソケット等 |
# リダイレクト
echo "hello" > output.txt # fd 1 (stdout) をファイルに
command 2> error.log # fd 2 (stderr) をファイルに
command > out.log 2>&1 # stdout と stderr を同じファイルに
Node.js との関係
Node.js との 関係のコード例を示す。
// Node.js の fs モジュールは内部的にファイルディスクリプタを使用
import { open } from 'fs/promises';
const file = await open('/tmp/data.txt', 'r');
console.log(file.fd); // 3 (ファイルディスクリプタ番号)
await file.close(); // fd を解放
ファイルディスクリプタの枯渇
プロセスが使えるファイルディスクリプタの上限は、soft limit と hard limit の 2 段になっている。実際に効くのは soft limit で、hard limit を超えて引き上げられるのは特権プロセスだけである。既定値は環境差が大きく、Linux ディストリビューションでは soft 1024 が長く定番だったが、systemd の設定や macOS では桁が変わる。上限を語るときは推測せず必ず実測する。
# 上限の確認 (soft と hard は別に見る)
ulimit -Sn
ulimit -Hn
# soft limit の変更 — hard limit までなら一般ユーザーでも上げられる
ulimit -n 65536
シェルで上げた上限は、そのシェルとそこから起動した子プロセスにしか効かない。上限はプロセス生成時に親から受け継がれるため、systemd などが起動する常駐サービスには手元のシェルでの変更が届かない。サービス定義側で指定する。
| 原因 | 症状 | 対策 |
|---|---|---|
| ソケットのクローズ忘れ | EMFILE: too many open files | 接続を確実にクローズ |
| DB コネクションリーク | 新しい接続が作れない | コネクションプーリング |
| ファイルのクローズ忘れ | ファイルが開けない | try-finally で確実にクローズ |
Lambda でのファイルディスクリプタ
Lambda の実行環境にもファイルディスクリプタの上限がある。2026 年 8 月時点の公開クォータでは 1,024 で、Lambda Managed Instances のみ 4,096 と別枠になっている。大量の同時接続 (HTTP リクエスト、DB コネクション) を開くと枯渇する。
Lambda では実行環境が再利用される点も効いてくる。ハンドラの外で開いた接続は次の呼び出しにも残るので、呼び出しごとに開いて閉じ忘れると、1 回のリクエストでは無事でも同じ環境の数百回目で EMFILE に落ちる。再現しないエラーの典型がこれである。
lsof でファイルディスクリプタを確認
lsof でファイルディスクリプタを確認の例を示す。
# プロセスが開いているファイルディスクリプタを表示
lsof -p <PID>
# そのプロセスのソケットだけに絞る — -a が必須
lsof -a -i -p <PID>
lsof の選択オプションは既定で OR で結合される。-a を付けずに lsof -i -p <PID> と書くと、「全プロセスのソケット」と「そのプロセスが開いている全ファイル」の和集合が出てしまい、絞り込みになっていない。
epoll / kqueue
Node.js の libuv は、大量のファイルディスクリプタを効率的に監視するために epoll (Linux) / kqueue (macOS) を使用する。イベントループの基盤技術である。
ただし、この仕組みが担うのはネットワーク I/O である。libuv はネットワーク I/O をイベントループのスレッドだけで処理する一方、通常ファイルの非同期 I/O はスレッドプールに逃がしている。ファイルディスクリプタという同じ言葉で括られていても、詰まったときに疑う場所は別で、ファイル操作が遅いときはイベントループよりスレッドプールの数 (UV_THREADPOOL_SIZE) を先に見る。
ファイルディスクリプタの理解を深めるには関連書籍が参考になる。
この記事は役に立ちましたか?
関連用語
システムコール
ユーザー空間のプログラムが OS カーネルの機能を呼び出すインターフェース
プロセスとスレッドの違いとは - メモリ空間 / 生成コスト / 通信方法を比較
プロセスとスレッドの違いをメモリ空間 / 生成コスト / 通信方法の 3 軸で比較。Node.js での使い分け、Lambda の実行環境、データ競合とコンテナの PID 1 の落とし穴まで解説
TCP/IP
インターネット通信の基盤となるプロトコル群で、データの分割・送信・再組立を信頼性高く行う
ShellScript
シェルのコマンドをまとめて自動実行するスクリプト。作業の自動化に使われる
CSP
Content Security Policy の略で、Web ページで実行可能なリソースの出所を制限するセキュリティ機構
XSS
Web サイトに悪意のあるスクリプトを注入し、ユーザーの情報を盗む攻撃
関連する記事
月曜朝イチのコードが金曜夕方より美しい理由
週の始まりに書くコードと終わりに書くコードでは、品質に差が出やすいものです。その背景と、コード品質を週を通じて維持するための読書習慣を考えます。
ゼロから作る Deep Learning シリーズの読む順番 - 全 6 巻の内容と選び方を整理
ゼロから作る Deep Learning シリーズ全 6 巻 (基礎 / 自然言語処理 / フレームワーク / 強化学習 / 生成モデル / LLM) の読む順番を解説。各巻の内容 / 発売年 / 前提知識を一覧表で整理し、目的別にどの巻から読むべきかを案内します。
ディープラーニング本の選び方 - 原理 / 理論 / 実装 / 数学の 4 系統で整理 (2026 年 8 月時点)
ディープラーニング本の選び方を 4 系統 (原理を手で理解する本 / 理論を体系的に学ぶ本 / フレームワーク実装本 / 数学を補う本) に整理。2026 年 8 月時点の定番書を目的別 / レベル別に紹介し、賞味期限の見極め方も解説します。