
Ich betreibe einen Webserver (Ubuntu 11.04), der unerwartet hohen Schreibverkehr aufweist. Wenn der Server überhaupt nicht schreiben soll, ist die Menge des Schreibverkehrs vergleichbar mit dem Leseverkehr.
Besorgt über unnötige Schreibvorgänge habe ich versucht zu analysieren, was auf dem System schief läuft. Ich kann umfangreiche Apache-Protokollierungs- oder Zugriffszeitprobleme ausschließen (mitnoatimeMount-Konfiguration).
Um dem Problem auf die Spur zu kommen, wollte ich sehen, welche Dateien geschrieben wurden. Dafür habe ich das IO-Logging über block_dump aktiviert (nützlicher Blogeintrag zu diesem Thema:sprocket.io). Jede Dateisystemaktivität wird im Syslog protokolliert. Hier ein kurzer Auszug meines Systems:
21. Aug. 18:22:55 xxxxx Kernel: [3984721.590864] apache2(2761): Leseblock 1098502400 auf md2 (8 Sektoren)
21. Aug. 18:22:55 xxxxx Kernel: [3984721.594005] kjournald(316): Schreibblock 2224394648 auf md2 (8 Sektoren)
21. Aug. 18:22:55 xxxxx Kernel: [3984721.594029] md2_raid1(260): Schreibblock 2925532672 auf sdb3 (8 Sektoren)
21. Aug. 18:22:55 xxxxx Kernel: [3984721.594044] md2_raid1(260): Schreibblock 2925532672 auf sda3 (8 Sektoren)
21. Aug 18:22:55 xxxxx Kernel: [3984721.644244] apache2(2761): READ-Block 2242118744 auf md2 (8 Sektoren)
Ok, jetzt weiß ich, welche Blöcke geschrieben wurden. Aber gibt es eine Möglichkeit, die geschriebenen Dateinamen anhand dieser Block-IDs tatsächlich zu identifizieren?
Vielen Dank für Ihre Hilfe!
Übrigens: Ich verwende ein Software-Raid, das könnte Teil des Problems sein.
Antwort1
Angenommen, ext2/ext3/ext4, beginnen Sie mit
[406420.877412] vi(12496): READ block 4522288 on dm-1 (8 sectors)
Bestimmen Sie die Blockgröße des Dateisystems:
# /sbin/dumpe2fs /dev/dm-1 | grep 'Block size'
dumpe2fs 1.42.3 (14-May-2012)
Block size: 4096
Angenommen, Sie haben ein Laufwerk mit 512-Byte-Sektoren, teilen Sie den Block durch 4096/512, also 8, um 565286 zu erhalten.
Im debugfs
Einsatz ist eine Kombination aus icheck
und ncheck
:
debugfs: icheck 565286
Block Inode number
565286 142506
debugfs: ncheck 142506
Inode Pathname
142506 /etc/security/time.conf
Bearbeiten: Tun Sie dies auf den md*-Geräten, nicht auf den sd*-Geräten. Die E/A des sd*-Geräts ist das Ergebnis eines Software-RAIDs.
Antwort2
Dateisysteme befinden sich auf einer höheren Abstraktionsebene als Blockgeräte und Software-RAIDs. Allerdings ist Software-RAID mit 99,9 %iger Wahrscheinlichkeit nicht Teil des Problems, sondern nur ein Blockgerät. Sie sollten also andere Tools verwenden, um Ihre E/A-Aktivität zu analysieren. Ich würde empfehlen, zunächst iotop
den Top-Writer unter den laufenden Prozessen zu identifizieren. Dann können Sie verwenden lsof
und strace
identifizieren, in welche Dateien geschrieben wird.
Antwort3
Linux hat ein Kernelsystem namensinoffiziellum Änderungen an einer Datei zu beobachten. Im Userland kann man deninotify-tools( apt-get install inotify-tools
), um ein Verzeichnis zu überwachen. Allerdings muss jede Datei einzeln überwacht werden. Sie können sie rekursiv auf ein Verzeichnis anwenden (sogar auf das Stammverzeichnis), aber je weniger Sie überwachen, desto geringer ist der Overhead.
Weitere Möglichkeiten zur Eingrenzung sind:
atop
Damit können Sie sehen, welche Prozesse Schreibvorgänge durchführenauditctl
die eine sehr geheimnisvolle Syntax hat, aber die Überwachung jedes Systemaufrufs ermöglicht