これは簡単な問題ですが、初めてこの問題を解決しました。最も多くのI / Oの対象となる特定のファイル/ iノードを見つけます。一般的なシステム概要を取得できれば幸いですが、PIDまたはTIDを提供する必要がある場合は問題ありません。
strace
私はポップアップしているプログラムで何もしたくありませんiotop
。iotop
ファイルごとにアイテム別に分類された同じツールを使用するのが最善です。私はそれを使用してlsof
mailmanがどのファイルを開いたかを見ることができますが、どのファイルがI / Oを受け取っているか、どのくらいのファイルを受け取るかを示しません。
他の場所でこの機能を使用することをお勧めしますが、auditd
そうしたくありません。なぜなら、他の目的に使用する監査ファイルに情報が保存されているからです。
今私が経験している具体的な問題は、LVMスナップショットがあまりにも早く埋められることです。私はすでに問題を解決していますが、ls
開いているすべてのファイル記述子に対して作業を実行して、どれ/proc/<pid>/fd
が最も急速に増加するかを確認するよりも、この方法で問題を解決できるようにしたいと思います。
答え1
この問題のいくつかの側面は他のツールによって部分的に解決されていますが、必要なすべての機能を提供するツールはないようです。
オートフ
このツールは、どのプロセスが最も多くの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
CPU時間を置いて競合する通常のプロセスペアのタスクを実行します(ディスクI / Oを除く)。スイッチを使用して、高さ30,000フィートのビューを提供するように指示することで、-a
時間の経過とともにプロセスの累積を表示できます。
$ 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
ブロック追跡
このオプションはレベルが低すぎます。どのファイルおよび/またはinodeがアクセスされているかについての可視性が不足しており、生のブロック番号のみを表示できます。
$ 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%)
パトラス
これはLinuxカーネルの新機能であり、人気が高く、Ubuntu 12.10などの最新のディストリビューションにのみ表示されます。私のFedora 14システムにはこの機能がありません。 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使用量を表示するためのツールを提供します。
引用する
答え2
まだ答えはありませんが(最後に)このスクリプトを書いていますが、好きなように動作するようです。他のシステムではテストされておらず、Linux専用です。
デフォルトでは、30秒間繰り返しstrace
、ファイル関連のシステムコールをフィルタリングし、ファイル名を削除しようとします。ファイルが表示される回数を数えstrace
、ユーザーにページを付けた要約を提供します。完璧ではありませんが、特定のファイルに対するシステムコールの数は、実行するI / Oの量と弱い相関関係を持つ可能性があります。
まだ完全にテストしていないがすぐに機能しない場合は、人々に開始点を提供する必要があります。より具体化したら、より高いレベルの言語で書き換えることをお勧めします。シルクヘビのように。
あまり自分で作らない方法で1週間以内に答えが得られなければ(特定プロセスに対するI/Oだけを計算するもう一つのツールでも)これを子孫のための答えとして受け入れるでしょう。
スクリプト:
#!/bin/bash
####
# Creates files underneath /tmp
# Requires commands: timeout strace stty
####
#
# All commands are GNU unless otherwise stated
#
##########################################################
####
## Initialization
####
outputFile=/tmp/out.$RANDOM.$$
uniqueLinesFile=/tmp/unique.$RANDOM.$$
finalResults=/tmp/finalOutput.txt.$$
if [ $# -ne 1 ]; then
echo "USAGE: traceIO [PID]" >&2
exit 2
fi
if ! [[ "$1" =~ ^[0-9]+$ ]]; then
echo "USAGE: traceIO [PID]" >&2
echo -e "\nGiven Process ID is not a number." >&2
exit 2
fi
if [ ! -e /proc/$1 ]; then
echo "USAGE: traceIO [PID]" >&2
echo -e "\nThere is no process with $1 as the PID." >&2
exit 2
fi
if [[ "x$PAGER" == "x" ]]; then
for currentNeedle in less more cat; do
which $currentNeedle >/dev/null 2>&1
if [ $? -eq 0 ]; then
PAGER=$currentNeedle
break;
fi
done
if [[ "x$PAGER" == "x" ]]; then
echo "Please set \$PAGER appropriately and re-run" >&2
exit 1
fi
fi
####
## Tracing
####
echo "Tracing command for 30 seconds..."
timeout 30 strace -e trace=file -fvv -p $1 2>&1 | egrep -v -e "detached$" -e "interrupt to quit$" | cut -f2 -d \" > $outputFile
if [ $? -ne 0 ]; then
echo -e "\nError performing Trace. Exiting"
rm -f $outputFile 2>/dev/null
exit 1
fi
echo "Trace complete. Preparing Results..."
####
## Processing
####
sort $outputFile | uniq > $uniqueLinesFile
echo -e "\n-------- RESULTS --------\n\n #\t Path " > $finalResults
echo -e " ---\t-------" >> $finalResults
while IFS= read -r currentLine; do
echo -n $(grep -c "$currentLine" "$outputFile")
echo -e "\t$currentLine"
done < "$uniqueLinesFile" | sort -rn >> $finalResults
####
## Presentation
####
resultSize=$(wc -l $finalResults | awk '{print $1}')
currentWindowSize=$(stty size | awk '{print $1}')
# We put five literal lines in the file so if we don't have more than that, there were no results
if [ $resultSize -eq 5 ]; then
echo -e "\n\n No Results found!"
elif [ $resultSize -ge $currentWindowSize ] ; then
$PAGER $finalResults
else
cat $finalResults
fi
# Cleanup
rm -f $uniqueLinesFile $outputFile $finalResults
答え3
あなたはそれを使用することができますsysdig
topfiles_bytes
まさにその仕事をするチラというチラがあります。
例:
sysdig -c topfiles_bytes
sysdig -c topfiles_time
利用可能なすべてのドラッグを一覧表示します。
sysdig -cl
答え4
使用 オートフ最も多くのio負荷を引き起こすプロセスのpidを取得します。次回使用ラソフpidで開いたファイルのリストを取得します。