これは単純な問題ですが、実際に修正する必要があったのは初めてです。どの特定のファイル/iノードが最も多くのI/Oのターゲットであるかを見つけることです。一般的なシステムの概要を知りたいのですが、PIDまたはTIDを提供する必要がある場合は、それで問題ありません。
strace
を実行せずに行きたい iotop
にポップアップするプログラム 。できれば、iotop
と同じ静脈のツールを使用してください しかし、ファイルごとに項目化されたもの。 lsof
を使用できます mailmanが開いているファイルを確認できますが、I/Oを受信しているファイルやその量は示されません。
auditd
の使用が提案された他の場所を見たことがあります ただし、他の目的で使用する監査ファイルに情報が格納されるため、これは行わない方がよいと思います。これは、この方法で調査できるはずの問題のようです。
私が今抱えている特定の問題は、LVMスナップショットが急速にいっぱいになることです。それ以来、問題は解決しましたが、ls
を実行するだけでなく、この方法で問題を修正できるようにしたいと考えています。 /proc/<pid>/fd
内のすべての開いているファイル記述子 どれが最も速く成長しているかを確認します。
承認された回答:
この質問には他のツールで部分的に対処されたいくつかの側面がありますが、探しているすべての機能を提供する単一のツールはないようです。
iotop
このツールは、どのプロセスが最も多くのI/Oを消費しているかを示します。ただし、特定のファイル名を表示するオプションはありません。
$ sudo iotop
Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % init
2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd]
3 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/0]
5 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kworker/u:0]
6 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/0]
7 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [watchdog/0]
デフォルトでは、通常のtop
を実行します ディスクI/Oを除いて、CPUの時間を争うプロセスに対して行います。 -a
を使用すると、同軸ケーブルを使用して30,000フィートのビューを表示できます。 時間の経過とともにプロセスごとの累積が表示されるように切り替えます。
$ sudo iotop -a
Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
258 be/3 root 0.00 B 896.00 K 0.00 % 0.46 % [jbd2/dm-0-8]
22698 be/4 emma 0.00 B 72.00 K 0.00 % 0.00 % chrome
22712 be/4 emma 0.00 B 172.00 K 0.00 % 0.00 % chrome
1177 be/4 root 0.00 B 36.00 K 0.00 % 0.00 % cupsd -F
22711 be/4 emma 0.00 B 120.00 K 0.00 % 0.00 % chrome
22703 be/4 emma 0.00 B 32.00 K 0.00 % 0.00 % chrome
22722 be/4 emma 0.00 B 12.00 K 0.00 % 0.00 % chrome
i *ツール(inotify、iwatchなど)
これらのツールはファイルアクセスイベントへのアクセスを提供しますが、特定のディレクトリまたはファイルを特に対象にする必要があります。そのため、パフォーマンスの問題をデバッグするときに、未知のプロセスによる不正なファイルアクセスを追跡しようとする場合、これらはそれほど役に立ちません。
また、inotify
フレームワークは、アクセスされているファイルに関する詳細を提供しません。アクセスの種類のみであるため、これらのツールを使用して前後に移動されるデータの量に関する情報は利用できません。
iostat
特定のデバイス(ハードドライブ)またはパーティションへのアクセスに基づいて、全体的なパフォーマンス(読み取りと書き込み)を表示します。ただし、どのファイルがこれらのアクセスを生成しているかについての洞察は提供されません。
$ iostat -htx 1 1
Linux 3.5.0-19-generic (manny) 08/18/2013 _x86_64_ (3 CPU)
08/18/2013 10:15:38 PM
avg-cpu: %user %nice %system %iowait %steal %idle
18.41 0.00 1.98 0.11 0.00 79.49
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda
0.01 0.67 0.09 0.87 1.45 16.27 37.06 0.01 10.92 11.86 10.82 5.02 0.48
dm-0
0.00 0.00 0.09 1.42 1.42 16.21 23.41 0.01 9.95 12.22 9.81 3.19 0.48
dm-1
0.00 0.00 0.00 0.02 0.01 0.06 8.00 0.00 175.77 24.68 204.11 1.43 0.00
blktrace
このオプションは低レベルです。どのファイルやiノードにアクセスしているかについての可視性はなく、生のブロック番号だけです。
$ sudo blktrace -d /dev/sda -o - | blkparse -i -
8,5 0 1 0.000000000 258 A WBS 0 + 0 <- (252,0) 0
8,0 0 2 0.000001644 258 Q WBS [(null)]
8,0 0 3 0.000007636 258 G WBS [(null)]
8,0 0 4 0.000011344 258 I WBS [(null)]
8,5 2 1 1266874889.709032673 258 A WS 852117920 + 8 <- (252,0) 852115872
8,0 2 2 1266874889.709033751 258 A WS 852619680 + 8 <- (8,5) 852117920
8,0 2 3 1266874889.709034966 258 Q WS 852619680 + 8 [jbd2/dm-0-8]
8,0 2 4 1266874889.709043188 258 G WS 852619680 + 8 [jbd2/dm-0-8]
8,0 2 5 1266874889.709045444 258 P N [jbd2/dm-0-8]
8,0 2 6 1266874889.709051409 258 I WS 852619680 + 8 [jbd2/dm-0-8]
8,0 2 7 1266874889.709053080 258 U N [jbd2/dm-0-8] 1
8,0 2 8 1266874889.709056385 258 D WS 852619680 + 8 [jbd2/dm-0-8]
8,5 2 9 1266874889.709111456 258 A WS 482763752 + 8 <- (252,0) 482761704
...
^C
...
Total (8,0):
Reads Queued: 0, 0KiB Writes Queued: 7, 24KiB
Read Dispatches: 0, 0KiB Write Dispatches: 3, 24KiB
Reads Requeued: 0 Writes Requeued: 0
Reads Completed: 0, 0KiB Writes Completed: 5, 24KiB
Read Merges: 0, 0KiB Write Merges: 3, 12KiB
IO unplugs: 2 Timer unplugs: 0
Throughput (R/W): 0KiB/s / 510KiB/s
Events (8,0): 43 entries
Skips: 0 forward (0 - 0.0%)
fatrace
これはLinuxカーネルに新しく追加されたものであり、歓迎されているため、Ubuntu12.10などの新しいディストリビューションでのみ使用できます。私のFedora14システムにはそれが欠けていました8-)。
inotify
を介して取得できるのと同じアクセスを提供します 特定のディレクトリやファイルをターゲットにする必要はありません。
$ sudo fatrace
pickup(4910): O /var/spool/postfix/maildrop
pickup(4910): C /var/spool/postfix/maildrop
sshd(4927): CO /etc/group
sshd(4927): CO /etc/passwd
sshd(4927): RCO /var/log/lastlog
sshd(4927): CWO /var/log/wtmp
sshd(4927): CWO /var/log/lastlog
sshd(6808): RO /bin/dash
sshd(6808): RO /lib/x86_64-linux-gnu/ld-2.15.so
sh(6808): R /lib/x86_64-linux-gnu/ld-2.15.so
sh(6808): O /etc/ld.so.cache
sh(6808): O /lib/x86_64-linux-gnu/libc-2.15.so
上記は、ファイルアクセスを実行しているプロセスIDと、アクセスしているファイルを示していますが、全体的な帯域幅の使用量は示されていないため、各アクセスは他のアクセスと区別できません。
ではどうすればよいですか?
fatrace
オプションは、最終的にの最も有望なものを示しています アクセスを行うプロセスではなく、アクセスされているファイルに基づいてディスクI/Oの総使用量を表示できるツールを提供します。
参考資料
- fatrace:システム全体のファイルアクセスイベントを報告する
- fatrace –システム全体のファイルアクセスイベントを報告する
- ファノティファイ用のもう1つの新しいABI
- blktraceユーザーガイド