高I ​​/ Oの原因となる特定のファイルの決定


37

これは簡単な問題ですが、実際に修正する必要があったのは初めてです。どの特定のファイル/ノードが最も多くのI / Oのターゲットであるかを見つけることです。一般的なシステムの概要を取得できるようにしたいのですが、PIDまたはTIDを指定する必要がある場合は、それで問題ありません。

straceでポップアップするプログラムを実行する必要はありませんiotopiotopファイルごとにアイテム化するものと同じ静脈内のツールを使用することをお勧めします。lsofmailmanが開いているファイルを確認するために使用できますが、どのファイルがI / Oを受信して​​いるか、またはどれだけを表示しているかはわかりません。

使用することが提案されている他の場所を見てきましたauditdが、情報を監査ファイルに入れて、他の目的に使用するため、それをしないことを好むでしょう、これは私が研究できるはずの問題のようですこの方法では。

私が今抱えている特定の問題は、LVMスナップショットが急速にいっぱいになることです。それ以来、私は問題を解決しましたが、どのlsファイル記述子/proc/<pid>/fdが最も速く成長しているのかを確認するために、すべての開いているファイル記述子を単に修正するのではなく、この方法で修正したいと思います。



ええ、私は前にそれを見たことはありませんでしたが、この質問に対する答えのほとんどは基本的に次のようなものでした:「もしあなたがこの信じられないほど特別な方法で物事をし、おかしいアイデアを得ることができる奇妙なことをしたら管理者が派手になりすぎることなく、問題を解決できます。他の人を批判するつもりはありません。この問題の難しさはおそらくそのような解決策が提供された方法であると思いますがfatrace、古いようなツールがなくても、私が書いたスクリプトのようなものはより広く使用できるため提供されています。
ブラッチリー

明確にするために:私は助けを提供した他の人を批判していません。ヘルプは、ヘルプなしよりも常に優れています。問題に直接的な対応が必要であると感じ、自分が理解できるか、他の人が示唆している回避策または非常に手動のプロセス(郵便配達員の問題で私がやったことなど)のいずれかを示唆しているのを見ることができるのはイライラするだけです。
ブラッチリー

うん、サイトに埋もれている新しいQに対する答えを見つけたとき、私はいつもびっくりします。そこに壊れたもののように思えます8-)。したがって、同じQを複数の方法で確認し、ルーティングされている古い方法にリンクするのが良いのはなぜですか。あなたのスクリプトがより良いアプローチであることに同意しましたが、あなたが求めていることを行う汎用ツールがないことに私はまだ驚いています。Unixの大きなギャップのようです。
slm

ほとんどのヘルプは、非常に的を絞ったもので、少し面倒なことがあります。なぜなら、答えると、同じことを何度も何度も何度も言っているからです。しかし、それがSEサイトの性質です。ジルがそれをどのように行うのかわかりません。これらはQ&Aの方が長い方が良いと思います。
slm

回答:


60

この質問には他のツールで部分的に対処されたいくつかの側面がありますが、探しているすべての機能を提供する単一のツールではないようです。

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%)

ファトレース

これは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オプションのショーのための最も約束FINALLYあなたではなくアクセスを行うプロセスよりアクセスされているファイルに基づいて、ディスクI / Oの総使用量を表示できるツールを提供します。

参照資料


6
可愛い赤ちゃんイエス、slm。私に関する限り、あなたはUnix SEのロックスターのようです。あなたの答えは常に信じられないほど教育的であり、多くの研究をすべて一箇所に示しています。ほとんどの人は(知っていれば)最後の部分を投稿しただけで、fatraceそれをあまり開発していません。人々が全体像を理解し、私がただ賛成して賞金を与える以上のことができることを確実にするためにあなたがどのように余分な距離を行くか本当に感謝します。
ブラッチリー

@JoelDavis-とても親切な言葉をありがとう。標準的な答えを出すというアイデアが気に入ったので、ここから始めようとしました。私もこの問題に何度も遭遇しており、このようなリソースがあればいいのにと思い、ここで作成することを考えました8-)。
slm

混乱していることの1つ:yum何らかの理由でpython3のライブラリにインストールをプルしたとき。私はfileそれをやったが、それはELF実行可能ファイルのように見える。lddリンクが表示されないpythonし、どちらがなかったですstrings。python3で悩まされた理由は何ですか?
ブラッチリー

1
ところで、どうやら賞金への回答を受け入れてからしばらく待たなければならないようです。Unix SEの総評価ポイントの約半分を持っている人にとっては問題ではなく、参考までに重要です。
ブラッチリー

1
私にとっては問題ではありません。私は、適切な経てそのことについて必要な情報を取得することができますiotopし、iostat電話を。また、私はpythonのことを理解しました。(少なくともFedora 18では) "power-usage-report" pythonスクリプトがあるように見えるので、RPMの依存関係yumにあるという事実にただ応答していpythonました。そのため、特定の謎が解決されます。
ブラッチリー

4

私はまだ答えを得ていませんが、このスクリプトを(最後に)書いたので、私がやりたいようにしています。他のシステムではテストしておらず、Linux固有です。

基本的にはstrace、30秒間ラップアラウンドし、ファイル関連のシステムコールをフィルタリングし、ファイル名を取り除く努力をします。ファイル内のそのファイルの出現回数をカウントしstrace、ページ分割された要約をユーザーに提示します。完全ではありませんが、特定のファイルへのシステムコールの数は、実行しているI / Oの量と弱い相関関係がある場合があります。

私はそれを完全にテストしていませんが、それが箱から出して機能しない場合、それは人々に出発点を与えるべきです。それがさらに肉付けされた場合、これをpythonのような高レベル言語に書き直すことをお勧めします。

あまり自作されていない方法で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

2

iWatch を使用できます。

iWatchは非常に使いやすいです。/etcファイルシステムの変更を監視したい場合、コンソールで実行するだけです

$ iwatch /etc

iwatchは、このディレクトリで何か変更があった場合に通知します。また、メールごとに通知する場合:

$ iwatch -m admin@smsgw.local /etc

この場合、管理者は電子メール通知を受け取ります(SMSゲートウェイアカウントを使用できるので、いつでもどこでもすぐに警告されます)。また、多くの異なるディレクトリを監視する場合は、構成ファイルを使用できます。この構成ファイルは、わかりやすい構造を持つxmlファイルです。


1
私はこれが使用しているinotifyと思いますそれは正しいですか?inotifyあなたはそれにパスを与えなければならないので、これに基づいたものを使用することをwasしました(これは本質的に私が探しているものです)、私は下にすべてを行った場合、どのくらいのオーバーヘッドがあるのか​​心配しましたか/?どのプログラムがそれを行っているかを抽出するのに十分簡単であれば、一時的な遅延を許容できるかもしれません。Webサイトには、コマンド出力の例もありません。
ブラッチリー

1
@JoelDavis本当にわかりません。私の知る限り、大量のRAMを消費するため、「/」の下で実行するのは危険です。
vfbsilva
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.