GNU/Linux >> Linux の 問題 >  >> Linux

Linux –高I / Oの原因となる特定のファイルを決定しますか?

これは単純な問題ですが、実際に修正する必要があったのは初めてです。どの特定のファイル/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 フレームワークは、アクセスされているファイルに関する詳細を提供しません。アクセスの種類のみであるため、これらのツールを使用して前後に移動されるデータの量に関する情報は利用できません。

関連:Linux –キーボードのハードリマップキー?

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ユーザーガイド

Linux
  1. 初心者向けのLinuxwcコマンドの説明(6例)

  2. Linux –プロセスの特定のパスを偽造することは可能ですか?

  3. Popsicle –Linux用の複数のUSBファイルフラッシャー

  1. Linux用の10個の便利なBashエイリアス

  2. Linux で特定のファイル タイプを再帰的に grep する

  3. Linux OOM ディスク I/O。また、スワップ、それは何に役立ちますか?

  1. Python で Linux デバイス ファイルに対して低レベルの I/O を実行するにはどうすればよいですか?

  2. Linux での I/O エラー:root としてディレクトリを削除できません

  3. Linux:I/O の top に似たものはありますか?