Esamina ulteriormente le scritture su disco per scoprire quale processo scrive sul mio SSD


11

Cerco di ridurre al minimo le scritture del disco sulla mia nuova unità di sistema SSD. Sono bloccato con l'uscita iostat:

~ > iostat -d 10 /dev/sdb
Linux 2.6.32-44-generic (Pluto)     13.11.2012  _i686_  (2 CPU)

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sdb               8,60       212,67       119,45   21010156   11800488

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sdb               3,00         0,00        40,00          0        400

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sdb               1,70         0,00        18,40          0        184

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sdb               1,20         0,00        28,80          0        288

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sdb               2,20         0,00        32,80          0        328

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sdb               1,20         0,00        23,20          0        232

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sdb               3,40        19,20        42,40        192        424

Come vedo ci sono delle scritture su sdb. Come posso risolvere quale processo scrive?

Conosco iotop , ma non mostra a quale filesystem si accede.

Risposte:


7

Quanto segue utilizza il meccanismo di dump del blocco di memoria virtuale del kernel. Per prima cosa prendi lo script perl:

wget https://raw.githubusercontent.com/true/aspersa-mirror/master/iodump

Quindi attiva il dump del blocco:

echo 1 | sudo tee /proc/sys/vm/block_dump

Ed esegui quanto segue:

while true; do sleep 1; sudo dmesg -c; done  | perl iodump

..e premi Controlcper finire, vedrai qualcosa di simile al seguente:

^C# Caught SIGINT.
TASK                   PID      TOTAL       READ      WRITE      DIRTY DEVICES
jbd2/sda3-8            620         40          0         40          0 sda3
jbd2/sda1-8            323         21          0         21          0 sda1
#1                    4746         11          0         11          0 sda3
flush-8:0             2759          7          0          7          0 sda1, sda3
command-not-fou       9703          4          4          0          0 sda1
mpegaudioparse8       8167          2          2          0          0 sda3
bash                  9704          1          1          0          0 sda1
bash                  9489          1          0          1          0 sda3
mount.ecryptfs_       9698          1          1          0          0 sda1

E disattiva il dump del blocco al termine:

echo 0 | sudo tee /proc/sys/vm/block_dump

Grazie a http://www.xaprb.com/blog/2009/08/23/how-to-find-per-process-io-statistics-on-linux/ per queste informazioni utili.


10

Potresti almeno iniziare con iotop. Non ti dirà quale filesystem è stato scritto ma ti darà alcuni processi da investigare.

sudo apt-get install iotop
sudo iotop

Mostra le letture e le scritture del disco istantanee e il nome del comando di lettura o scrittura.

Se si sta tentando di rilevare un processo che scrive raramente, è possibile utilizzare l' --accumulateopzione o registrare l'output in un file:

sudo -i
iotop --batch > iotop_log_file

Ovviamente la scrittura del file di registro verrà visualizzata nei risultati, ma dovresti anche essere in grado di eseguire grep per altri processi di scrittura su disco.

A questo punto dovresti essere in grado di trovare alcuni processi sospetti candidati. La colonna di sinistra in iotop mostra il pid. Successivamente, scopri a quale descrittore di file il processo sta scrivendo:

sudo -i
strace -p <pid> 2>&1 | grep write

Dovresti vedere un output in questo modo quando il processo scrive:

write(1, "\n", 1)                       = 1
write(4, "test\n", 5)                   = 5
write(1, ">>> ", 4)                     = 4

Il primo argomento da scrivere è il descrittore di file. Probabilmente stiamo cercando valori maggiori di 2, perché 0, 1 e 2 sono solo stdin, stdout e stderr. Il descrittore di file 4 sembra interessante.

Ora puoi scoprire a quale file punta il descrittore di file con:

lsof -p <pid>

Che dovrebbe produrre output come:

...
python  23908  rob  mem    REG    8,1    26258 8392656 /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
python  23908  rob    0u   CHR  136,5      0t0       8 /dev/pts/5
python  23908  rob    1u   CHR  136,5      0t0       8 /dev/pts/5
python  23908  rob    2u   CHR  136,5      0t0       8 /dev/pts/5
python  23908  rob    3w   REG   0,25      909 9049082 /home/rob/testfile
python  23908  rob    4w   REG   0,25       20 9049087 /home/rob/another_test_file

Guarda la quarta colonna. 4wsignifica che il descrittore di file 4 è aperto per la scrittura e il file lo è another_test_file.

È possibile che un processo si apra, scriva e quindi chiuda un file, nel qual caso lsof non lo mostrerebbe. È possibile che ciò accada con:

strace -p <pid> 2>&1 | grep open

Non sapevo di --accumulte Questa è una funzione davvero interessante! Grazie mille per quello !!! iotop - il reindirizzamento dell'output batch non riesce con UnicodeEncodeError: il codec 'ascii' non può codificare i caratteri nella posizione 92-99: ordinale non compreso nell'intervallo (128) nel file "/usr/lib/pymodules/python2.6/iotop/ui. py ", linea 405, in refresh_display
zuba

Sono contento che la mia risposta sia stata di qualche utilità. Il reindirizzamento funziona per me; non sono sicuro di poterlo spiegare.
Rob Fisher,

Ok, ho giocato un po 'in giro e ho scoperto che potevo usare lsof e strace almeno per fare abbastanza lavoro investigativo per catturare i processi che scrivevano su un SSD. Spero che questo alla fine risponda alla domanda, ma sembra che la risposta di Colin Ian King sia più semplice!
Rob Fisher,

1
Ci scusiamo per la risposta tardiva, non avevo nulla da dire fino a quando non ho giocato con lo strace. Grazie per questo altro approccio intelligente, ho votato. Ho trovato abbastanza difficile scrivere script per implementarlo, a causa della poca esperienza nella scrittura di script shell. Ecco perché ho scelto un'altra soluzione. Grazie per aver condiviso le tue conoscenze!
zuba,

Dovrebbe essere --accumulated, ma lo scambio di stack richiede 6 caratteri per accettare la modifica del post.
h__
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.