Questo è un problema semplice ma è la prima volta che ho dovuto risolverlo effettivamente:trovare quali file/inode specifici sono gli obiettivi della maggior parte degli I/O. Mi piacerebbe avere una panoramica generale del sistema, ma se devo fornire un PID o un TID sono a posto.
Vorrei andare senza dover fare una strace
sul programma che compare in iotop
. Preferibilmente, utilizzando uno strumento simile a iotop
ma uno che dettaglia per file. Posso usare lsof
per vedere quali file ha aperto mailman ma non indica quale file sta ricevendo I/O o quanto.
Ho visto altrove dove è stato suggerito di usare auditd
ma preferirei non farlo poiché metterebbe le informazioni nei nostri file di audit, che utilizziamo per altri scopi e questo sembra un problema che dovrei essere in grado di ricercare in questo modo.
Il problema specifico che ho in questo momento è con le istantanee LVM che si riempiono troppo rapidamente. Da allora ho risolto il problema, ma mi piacerebbe essere in grado di risolverlo in questo modo piuttosto che eseguire semplicemente un ls
su tutti i descrittori di file aperti in /proc/<pid>/fd
per vedere quale stava crescendo più velocemente.
Risposta accettata:
Ci sono diversi aspetti di questa domanda che sono stati affrontati in parte attraverso altri strumenti, ma non sembra esserci un unico strumento che fornisce tutte le funzionalità che stai cercando.
iotop
Questo strumento mostra quali processi stanno consumando più I/O. Ma mancano le opzioni per mostrare nomi di file specifici.
$ 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]
Per impostazione predefinita fa ciò che il normale top
fa per i processi in lizza per il tempo della CPU, ad eccezione dell'I/O del disco. Puoi convincerlo a darti una vista di 30.000 piedi usando il -a
interruttore in modo che mostri un accumulo per processo, nel tempo.
$ 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* strumenti (inotify, iwatch, ecc.)
Questi strumenti forniscono l'accesso agli eventi di accesso ai file, tuttavia devono essere mirati in modo specifico a directory o file specifici. Quindi non sono così utili quando si tenta di rintracciare un accesso non autorizzato a un file da parte di un processo sconosciuto, durante il debug di problemi di prestazioni.
Anche inotify
framework non fornisce alcun dettaglio sui file a cui si accede. Solo il tipo di accesso, quindi non sono disponibili informazioni sulla quantità di dati spostati avanti e indietro, utilizzando questi strumenti.
iostato
Mostra le prestazioni complessive (letture e scritture) in base all'accesso a un determinato dispositivo (disco rigido) o partizione. Ma non fornisce informazioni dettagliate su quali file stanno generando questi accessi.
$ 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
traccia nera
Questa opzione è di livello troppo basso. Manca di visibilità su quali file e/o inode sono a cui si accede, solo numeri di blocco grezzi.
$ 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%)
Frace
Questa è una nuova aggiunta al kernel Linux e benvenuta, quindi è solo nelle distribuzioni più recenti come Ubuntu 12.10. Il mio sistema Fedora 14 ne era privo 8-).
Fornisce lo stesso accesso che puoi ottenere tramite inotify
senza dover scegliere come target una directory e/o file particolari.
$ 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
Quanto sopra ti mostra l'ID del processo che sta eseguendo l'accesso al file e a quale file sta accedendo, ma non ti dà alcun utilizzo complessivo della larghezza di banda, quindi ogni accesso è indistinguibile da qualsiasi altro accesso.
Quindi cosa fare?
La fatrace
l'opzione mostra la più promettente per FINALMENTE fornendo uno strumento in grado di mostrare l'utilizzo aggregato dell'I/O del disco in base ai file a cui si accede, piuttosto che ai processi che effettuano l'accesso.
Riferimenti
- fatrace:segnala gli eventi di accesso ai file a livello di sistema
- fatrace:segnala gli eventi di accesso ai file a livello di sistema
- Un altro nuovo ABI per fanotify
- Guida per l'utente di blktrace