ファイルディスクリプタ
OS がオープンしたファイルやソケットを識別するための整数値
ファイルディスクリプタとは
ファイルディスクリプタ (File Descriptor, fd) は、OS がオープンしたファイル、ソケット、パイプを識別するための非負整数値である。Unix の「全てはファイル」の思想に基づき、ネットワーク接続もファイルディスクリプタで管理される。
標準のファイルディスクリプタ
標準のファイルディスクリプタを以下にまとめる。
| fd | 名前 | 用途 |
|---|---|---|
| 0 | stdin | 標準入力 |
| 1 | stdout | 標準出力 |
| 2 | stderr | 標準エラー出力 |
| 3+ | - | ファイル、ソケット等 |
# リダイレクト
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 を解放
ファイルディスクリプタの枯渇
プロセスが使えるファイルディスクリプタには上限がある (デフォルト 1024)。
# 上限の確認
ulimit -n
# 1024
# 上限の変更
ulimit -n 65536
| 原因 | 症状 | 対策 |
|---|---|---|
| ソケットのクローズ忘れ | EMFILE: too many open files |
接続を確実にクローズ |
| DB コネクションリーク | 新しい接続が作れない | コネクションプーリング |
| ファイルのクローズ忘れ | ファイルが開けない | try-finally で確実にクローズ |
Lambda でのファイルディスクリプタ
Lambda の実行環境にもファイルディスクリプタの上限がある (1024)。大量の同時接続 (HTTP リクエスト、DB コネクション) を開くと枯渇する。
lsof でファイルディスクリプタを確認
lsof でファイルディスクリプタを確認の例を示す。
# プロセスが開いているファイルディスクリプタを表示
lsof -p <PID>
# ソケットのみ表示
lsof -i -p <PID>
epoll / kqueue
Node.js の libuv は、大量のファイルディスクリプタを効率的に監視するために epoll (Linux) / kqueue (macOS) を使用する。イベントループの基盤技術。
ファイルディスクリプタの理解を深めるには関連書籍が参考になる。
この記事は役に立ちましたか?
関連用語
システムコール
ユーザー空間のプログラムが OS カーネルの機能を呼び出すインターフェース
プロセスとスレッド
OS のプロセスとスレッドの違い、およびプログラムの並行実行モデル
TCP/IP
インターネット通信の基盤となるプロトコル群で、データの分割・送信・再組立を信頼性高く行う
CSP
Content Security Policy の略で、Web ページで実行可能なリソースの出所を制限するセキュリティ機構
列指向ストア
データを列 (カラム) 単位で保存し、分析クエリの集計を高速化するストレージ形式
Terraform State
Terraform がインフラの現在の状態を管理するファイルとリモートバックエンド
関連する記事
技術書の「積ん読」を資産に変える - 未読本を活かすリファレンス読書術
積ん読を「解消すべき問題」ではなく「活用すべき資産」として捉え直す発想の転換と、未読の技術書をリファレンスライブラリとして運用する具体的な方法を紹介します。
あの有名 OSS のコードは、この本の影響を受けている
広く使われているオープンソースソフトウェアの設計には、特定の技術書の影響が色濃く反映されています。OSS のコードと技術書の関係を知ると、両方の理解が深まります。
技術書の読書ログを GitHub で管理する - エンジニアらしい記録法
技術書の読書記録を GitHub リポジトリで管理する方法を紹介します。Markdown で読書ノートを書き、コミット履歴で読書の軌跡を残す、エンジニアならではの読書ログ術です。