ファイルシステム・スケジューリング・応用編 — IPC・シグナル・cgroup・観測性
ファイルシステム・スケジューリング・応用編 — IPC・シグナル・cgroup・観測性
🎯 このレッスンを読み終えたら
このレッスンを読み終えると、以下の 3 つを自信を持って説明できるようになります。
- ▸✅ コンテキストスイッチのコスト(スレッド < プロセス)
- ▸✅ epoll · kqueue · IOCP によるイベント駆動 I/O
- ▸✅ Copy-on-Write + fork() の動作
学習目標をチェックリストとして持ち、すべて答えられるようになったらレッスンを閉じましょう。
ファイルシステム — inode とディレクトリ
一言で言うと: ファイル = inode + データブロック、ディレクトリ = 名前 → inode マッピング。
ファイルのオープンから読み取りまで 6 ステップ:
1. open("/etc/hosts") — パスの解析
2. dentry キャッシュ参照 — ディレクトリエントリキャッシュ(RAM)
3. inode のロード — パーミッション・サイズ・ブロック位置・タイムスタンプのメタデータ
4. パーミッションチェック — ユーザー/グループ・rwx
5. fd の割り当て — ファイルディスクリプタ番号を返す(0,1,2 = stdin/stdout/stderr、3 以上 = ユーザー)
6. read(fd, buf, n) — ブロックをページキャッシュ → ユーザーバッファへ
ファイルシステムの種類:
よくある落とし穴:
- ▸❌ 「too many open files」— fd 不足(
ulimit -nを増やす) - ▸❌ ファイルへの同時書き込み → データ破損(fcntl ロック・O_APPEND)
- ▸❌ シンボリックリンクをたどって無限ループ(
-Lオプションに注意) - ▸✅
fsync()を呼び出してディスク同期を保証(DB・write-ahead log)
CPU スケジューリング — 誰が先に実行されるか
Linux CFS(Completely Fair Scheduler) — デフォルトスケジューラ(2.6.23 以降)。
原理: 各プロセスの 仮想ランタイム を追跡。最も実行時間が少ないプロセスを優先 → 公平性の確保。
スケジューリングポリシー:
ラウンドロビン(RR)の動作:
1. 各プロセスに タイムスライス(例: 10 ms)を割り当て
2. スライスが切れるとキューの末尾へ
3. 次のプロセスを実行
→ 公平 だがコンテキストスイッチのコストが発生
スケジューリングの落とし穴:
- ▸❌ nice 値の誤解(値が低いほど優先度が高い)— 直感と逆
- ▸❌ リアルタイム SCHED_FIFO の無限ループ → システム全体が停止
- ▸❌ CPU アフィニティ未設定 → キャッシュ無効化が頻発
最新トレンド:
- ▸EEVDF(Earliest Eligible Virtual Deadline First)— Linux 6.6+ における CFS の後継
- ▸Pluggable — sched_ext で BPF スケジューラをカスタマイズ可能(2024 年〜)
IPC・シグナル・ゾンビ — プロセス間通信
IPC(Inter-Process Communication) の種類:
シグナル の活用:
グレースフルシャットダウン パターン:
ゾンビプロセス:
- ▸子プロセスが終了したが、親が
wait()を呼んでいない → PCB だけが残った状態 - ▸
psでZ状態として表示される - ▸防止策: 親が SIGCHLD ハンドラを登録して
waitpid()を呼び出す - ▸孤児プロセス: 親が先に死んだ場合、init(PID 1)が引き取り → init が wait → クリーンアップ
cgroup + 観測性 — コンテナの基盤
cgroup(Control Group) — Linux がプロセスグループのリソースを制限する仕組み。Docker・Kubernetes のコア技術。
利用例:
Docker の例: docker run --memory=1g --cpus=0.5 nginx は内部的に cgroup を設定しています。
cgroup v2(モダン Linux): 統合された階層構造(v1 の分離されたコントローラを統合)。
観測性(Observability)の 3 本柱:
eBPF(Extended Berkeley Packet Filter):
- ▸カーネル内で安全にコードを実行(カーネルパッチ不要)
- ▸システムコール・ネットワーク・ディスクのあらゆるイベントを観測可能
- ▸ツール:
bcc·bpftrace·pixie·falco(セキュリティ) - ▸Cilium(K8s ネットワーク)、Datadog APM もいずれも eBPF ベース
観測性の落とし穴:
- ▸❌ メトリクスのみ(原因が分からない)→ トレースも追加
- ▸❌ ログ爆発(10 TB/日)→ サンプリング・フィルタリング
- ▸❌ /var/log がいっぱいになる → ログローテーションが必須(logrotate)
🤖 AI にこう依頼してみましょう
このレッスンの概念を知っていれば、AI に具体的に指示を出せます。曖昧な「直して」ではなく、語彙を持ったリクエスト — それがトークン削減の出発点です。
- ▸「この処理がコンテキストスイッチのコストが高いか診断して」
- ▸「この処理を epoll(Linux)ベースの非同期に変えるとどんなメリットがあるか教えて」
なぜこれがトークンを減らすのか
概念を知らないと、AI の回答を受け取っても 「それって何ですか?」 と再度聞かなければなりません。その「再質問」がトークンを消費します。概念を一度身につければ、会話が一度で完結します。