📁
概念 #システムパフォーマンス #Brendan Gregg #Linux #SRE #読書ノート #ファイルシステム #VFS 📚 詳解 システム・パフォーマンス

詳解 システム・パフォーマンス - 第8章:ファイルシステム分析

VFS・ページキャッシュ・ファイルシステムレイテンシの分析。vfsstat・opensnoop・cachestat の使い方とファイルシステムチューニング。

ファイルシステムの層構造

アプリケーション
  ↓ open() / read() / write() syscall
VFS(Virtual File System)    ← すべてのファイルシステムの共通インターフェース

ページキャッシュ(RAM)         ← ここで HIT すればディスクアクセスなし!
  ↓ キャッシュミスの場合のみ
個別ファイルシステム(ext4 / XFS / tmpfs 等)

ブロックレイヤ

デバイスドライバ

物理ディスク(SSD / HDD)

ポイント:ページキャッシュに HIT すればメモリ速度でファイルアクセスできる。


基本確認コマンド

# ファイルシステムの使用量
df -h
# Use% が 90% 超えたら要注意

# inode の使用量(ファイル数が多すぎる場合に枯渇)
df -i
# IUse% が 100% になると、容量があっても新規ファイルを作れない

# マウント情報の確認
mount | column -t
cat /proc/mounts

# オープン中のファイル一覧(FD リーク確認)
lsof -p <PID>
# TYPE列:
# REG: 通常ファイル
# DIR: ディレクトリ
# IPv4/IPv6: ソケット
# PIPE: パイプ

# プロセスが開いているFD数
ls /proc/<PID>/fd | wc -l
# システム全体のFD使用数
cat /proc/sys/fs/file-nr
# 使用数 / 未使用(解放可能) / 最大値

ページキャッシュの効率確認

# cachestat(BCC tool):ページキャッシュのヒット率
sudo cachestat 1
# HITS   MISSES   DIRTIES   HITRATIO
# 10000      50      1000    99.50%    ← 理想的な状態
# 100      5000       100     1.96%    ← ミスが多い(cold cache or メモリ不足)

# cachetop(BCC tool):プロセス別のキャッシュ状況
sudo cachetop 1

# free -h でキャッシュ量を確認
free -h
# buff/cache が大きい → ページキャッシュが効いている

VFS レベルのトレース

# vfsstat(BCC tool):VFS操作の統計
sudo vfsstat 1
# TIME      READ/s  WRITE/s  FSYNC/s  OPEN/s  CREATE/s
# 12:00:01  10000     500       10     100       5

# vfscount(BCC tool):VFS関数の呼び出し回数
sudo vfscount

# ファイルオープンをリアルタイム追跡
sudo opensnoop
# PID  COMM   FD  ERR  PATH
# 1234 java   10    0  /var/log/app.log
# 1234 java   11    0  /etc/config.properties

# 特定プロセスのファイルオープン
sudo opensnoop -p <PID>

# エラーのあるオープンのみ表示(ENOENT等)
sudo opensnoop -e

# bpftrace で ファイルオープンを追跡
sudo bpftrace -e '
  tracepoint:syscalls:sys_enter_openat {
    printf("%-6d %-16s %s\n", pid, comm, str(args.filename));
  }
'

ファイルシステムレイテンシの分析

# ext4 の操作レイテンシを測定(BCC tool)
sudo ext4slower 10
# 10ms 以上かかった ext4 操作を表示
# COMM  PID  T  BYTES   OFFSET   LAT(ms)  FILENAME
# java  1234 R  65536   0        25.3     data.bin  ← 遅い読み込み

# XFS の場合
sudo xfsslower 10

# NFS の場合
sudo nfsslower 10

# ファイルI/Oのレイテンシ分布(ヒストグラム)
sudo bpftrace -e '
  tracepoint:syscalls:sys_enter_read { @start[tid] = nsecs; }
  tracepoint:syscalls:sys_exit_read /@start[tid]/ {
    @read_latency = hist(nsecs - @start[tid]);
    delete(@start[tid]);
  }
'

fsync の問題

fsync() はページキャッシュをディスクに書き出す(耐久性保証)。
頻繁な fsync → ディスク I/O が詰まる原因になる。

# fsync を多く呼び出しているプロセスを特定
sudo bpftrace -e '
  tracepoint:syscalls:sys_enter_fsync,tracepoint:syscalls:sys_enter_fdatasync {
    @fsync_count[pid, comm] = count();
  }
'

# strace で確認
strace -e trace=fsync,fdatasync -p <PID> 2>&1

# vfsstat で FSYNC/s を確認
sudo vfsstat 1

ファイルシステムチューニング

マウントオプション

# /etc/fstab の設定例(ext4)
# /dev/sda1 /data ext4 defaults,noatime,nodiratime 0 2

# noatime: ファイル読み取り時のアクセス時刻更新を無効化(書き込み減)
# nodiratime: ディレクトリのアクセス時刻更新を無効化
# relatime: 修正時刻より新しい場合のみ更新(デフォルト、noatimeより安全)

# 確認
mount | grep /data | grep noatime

I/O スケジューラ

# 現在のI/Oスケジューラ確認
cat /sys/block/sda/queue/scheduler
# [mq-deadline] kyber bfq none

# SSD には none(no-op)または mq-deadline が適切
echo mq-deadline > /sys/block/sda/queue/scheduler
echo none > /sys/block/nvme0n1/queue/scheduler  # NVMe は通常 none

# SSD かどうか確認
cat /sys/block/sda/queue/rotational
# 0 = SSD, 1 = HDD

ページキャッシュの制御

# ダーティページ(書き込み待ち)の設定
sysctl vm.dirty_ratio         # デフォルト20(メモリの20%まで)
sysctl vm.dirty_background_ratio  # デフォルト10(バックグラウンド書き込み開始)

# 書き込みが多いサーバーでは下げる
sysctl -w vm.dirty_ratio=5
sysctl -w vm.dirty_background_ratio=2

# 現在のダーティページ量
cat /proc/meminfo | grep -i dirty

ファイルシステム問題のチェックリスト

□ df -h で容量・df -i でinode 使用率を確認(90%超えで要注意)
□ lsof でファイルディスクリプタリークを確認
□ cachestat でページキャッシュヒット率を確認(低い場合はメモリ不足)
□ vfsstat で fsync/s を確認(多いと書き込みボトルネック)
□ ext4slower / xfsslower で遅いI/Oを特定
□ /sys/block/*/queue/rotational で SSD/HDD を確認し、スケジューラが適切か確認
□ マウントオプションに noatime または relatime が設定されているか確認

出典: 詳解 システム・パフォーマンス 第2版 Brendan Gregg著