Untersuchen Sie die Festplattenschreibvorgänge weiter, um herauszufinden, welcher Prozess auf meine SSD schreibt

11

Ich versuche, das Schreiben von Datenträgern auf mein neues SSD-Systemlaufwerk zu minimieren. Ich bin mit der iostat-Ausgabe festgefahren:

~ > 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

Wie ich sehe gibt es Schreibvorgänge zu sdb. Wie kann ich festlegen, welcher Prozess schreibt?

Ich kenne iotop , aber es zeigt nicht, auf welches Dateisystem zugegriffen wird.

zuba
quelle

Antworten:

7

Im Folgenden wird der Blockspeicherauszugsmechanismus für den virtuellen Speicher des Kernels verwendet. Holen Sie sich zuerst das Perl-Skript:

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

Schalten Sie dann Block Dump ein:

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

Und führen Sie Folgendes aus:

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

..und drücken Sie Controlc, um zu beenden, sehen Sie so etwas wie das Folgende:

^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

Und schalten Sie den Block Dump aus, wenn Sie fertig sind:

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

Vielen Dank an http://www.xaprb.com/blog/2009/08/23/how-to-find-per-process-io-statistics-on-linux/ für diese hilfreichen Informationen.

Colin Ian King
quelle
10

Sie könnten zumindest mit iotop beginnen. Es wird Ihnen nicht sagen, welches Dateisystem geschrieben wird, aber es gibt Ihnen einige Prozesse, die Sie untersuchen müssen.

sudo apt-get install iotop
sudo iotop

Es zeigt das sofortige Lesen und Schreiben der Festplatte sowie den Namen des Befehls zum Lesen oder Schreiben.

Wenn Sie versuchen, einen Prozess abzufangen, der selten schreibt, können Sie die --accumulateOption verwenden oder die Ausgabe in einer Datei protokollieren:

sudo -i
iotop --batch > iotop_log_file

Natürlich wird das Schreiben der Protokolldatei in den Ergebnissen angezeigt, aber Sie sollten auch in der Lage sein, nach anderen Prozessen zu suchen, die auf die Festplatte schreiben.

Zu diesem Zeitpunkt sollten Sie in der Lage sein, einige verdächtige Prozesse zu finden. Die linke Spalte in iotop zeigt die PID. Als nächstes finden Sie heraus, in welchen Dateideskriptor der Prozess schreibt:

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

Sie sollten eine Ausgabe wie diese sehen, wenn der Prozess schreibt:

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

Das erste zu schreibende Argument ist der Dateideskriptor. Wir suchen wahrscheinlich nach Werten größer als 2, da 0, 1 und 2 nur stdin, stdout und stderr sind. Dateideskriptor 4 sieht interessant aus.

Sie können jetzt herausfinden, auf welche Datei der Dateideskriptor verweist:

lsof -p <pid>

Welches sollte Ausgabe ergeben wie:

...
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

Schauen Sie sich die 4. Spalte an. 4wbedeutet, dass der Dateideskriptor 4 zum Schreiben geöffnet ist und die Datei ist another_test_file.

Es ist möglich, dass ein Prozess eine Datei öffnet, schreibt und dann schließt. In diesem Fall würde lsof sie nicht anzeigen. Sie könnten dies mit folgenden Ereignissen verfolgen:

strace -p <pid> 2>&1 | grep open
Rob Fisher
quelle
Ich wusste nicht über --accumulte Das ist wirklich cool! Vielen Dank dafür !!! iotop - Die Umleitung der Stapelausgabe schlägt mit UnicodeEncodeError fehl: Der Codec 'ascii' kann keine Zeichen an Position 92-99 codieren: Ordnungszahl nicht im Bereich (128) in Datei "/usr/lib/pymodules/python2.6/iotop/ui". py ", Zeile 405, in refresh_display
zuba
Ich bin froh, dass meine Antwort zumindest von Nutzen war. Die Umleitung funktioniert bei mir; Ich bin mir nicht sicher, ob ich das erklären kann.
Rob Fisher
Ok, ich habe ein bisschen herumgespielt und festgestellt, dass ich lsof und strace verwenden kann, um zumindest genug Detektivarbeit zu leisten, um Prozesse zu erfassen, die auf eine SSD schreiben. Hoffentlich beantwortet dies endlich die gestellte Frage, obwohl es so aussieht, als ob Colin Ian Kings Antwort einfacher ist!
Rob Fisher
1
Entschuldigung für die späte Antwort, ich hatte nichts zu sagen, bis ich mit Strace gespielt habe. Vielen Dank für diesen weiteren cleveren Ansatz, den ich gewählt habe. Ich fand es ziemlich schwierig, ein Skript zu schreiben, um es zu implementieren, da ich wenig Erfahrung mit dem Schreiben von Shell-Skripten hatte. Deshalb habe ich eine andere Lösung gewählt. Vielen Dank für Ihr Wissen!
Zuba
Sollte sein --accumulated, aber der Stapeltausch erfordert 6 Zeichen, um die Bearbeitung des Beitrags zu akzeptieren.
28.