確定負責高 I/O 的特定文件
這是一個簡單的問題,但我第一次不得不真正解決它:找出哪些特定文件/inode 是最多 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
爭奪 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 的總體使用情況。參考