Linux

確定負責高 I/O 的特定文件

  • January 24, 2022

這是一個簡單的問題,但我第一次不得不真正解決它:找出哪些特定文件/inode 是最多 I/O 的目標。我希望能夠獲得一般系統概述,但如果我必須提供 PID 或 TID,我可以接受。

我想去,而不必對strace彈出的程序做一個iotopiotop最好使用與按文件逐項列出的工具相同的工具。我可以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爭奪 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 的總體使用情況。

參考

引用自:https://unix.stackexchange.com/questions/86875