📁
詳解 システム・パフォーマンス - 第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 が設定されているか確認 - 1. 📊詳解 システム・パフォーマンス - 概要・読み方ガイド
- 2. 🔍詳解 システム・パフォーマンス - 第16章:ケーススタディ
- 3. 🧭詳解 システム・パフォーマンス - 第2章:メソドロジ
- 4. 🐧詳解 システム・パフォーマンス - 第3章:オペレーティングシステム
- 5. 🔭詳解 システム・パフォーマンス - 第4章:可観測性ツール
- 6. ⚙️詳解 システム・パフォーマンス - 第5章:アプリケーション
- 7. 💻詳解 システム・パフォーマンス - 第6章:CPU分析
- 8. 🧠詳解 システム・パフォーマンス - 第7章:メモリ分析
- 9. 📁詳解 システム・パフォーマンス - 第8章:ファイルシステム分析
- 10. 💾詳解 システム・パフォーマンス - 第9章:ディスク分析
- 11. 🌐詳解 システム・パフォーマンス - 第10章:ネットワーク分析
- 12. ☁️詳解 システム・パフォーマンス - 第11章:クラウドコンピューティング
- 13. 📏詳解 システム・パフォーマンス - 第12章:ベンチマーキング
- 14. 🔥詳解 システム・パフォーマンス - 第13章:perf
- 15. 🔬詳解 システム・パフォーマンス - 第14章:Ftrace
- 16. ⚡詳解 システム・パフォーマンス - 第15章:BPF/eBPF
出典: 詳解 システム・パフォーマンス 第2版 Brendan Gregg著