Auf meinem Webserver (Apache läuft, Linux CentOS) befindet sich eine sehr große Protokolldatei ( 50 GB ). Dieser Webserver hat einige Webservices in Produktion.
Als ich versuchte, die Protokolldatei zu löschen, hatte der Webserver etwa 10 Sekunden lang keine Antwort. (Service-Out-Zeit.)
rm -f monthly.log
Gibt es eine Möglichkeit, diese große Datei zu löschen, ohne dass Apache einfriert?
linux
apache-2.2
centos
Jinbom Heo
quelle
quelle
Zum schnelleren Löschen großer Dateien können Sie den
truncate
Befehl - Say verwenden, um sie auf eine Größe von Null zu verkleinern und dann zu löschen:Wie von Quanten empfohlen, müssen Sie es jedoch zuerst logrotieren.
quelle
truncate
unterscheidet sich von>
?truncate
ist einfacher zu bedienensudo
als>
. Es ist auch einfacher mitfind -exec
.quelle
>logfile
kein Echo brauchenIch würde die Datei mit der
: > /path/to/monthly.log
Operation abschneiden / auf Null setzen . Starten Sie dann möglicherweise den Apache-Prozess neu und richten Sie die Protokollrotation ein, um dies in Zukunft zu verhindern ...Dies kommt jedoch häufig vor:
Siehe: Gibt es eine Möglichkeit, 100-GB-Dateien unter Linux zu löschen, ohne E / A / Laden zu beschädigen?
Was ist unter Unix der beste Weg, um die Größe einer massiven Protokolldatei zu reduzieren, in die aktiv geschrieben wird?
Linux-Server nicht genügend Speicherplatz
quelle
:
. Sie können einfach tun> /path/to/monthly.log
noop
, aber es ist aus der Perspektive des Unterrichts sinnvoller.true > /path/to/monthly.log
ich nicht das Gleiche tun und es ist dann weniger archaisch:
?Wenn Sie die Daten nicht benötigen, kürzen Sie sie mit / dev / null:
Der Webserver schreibt nach dem Abschneiden weiterhin Daten in die Datei, wodurch ein Neustart des Webservers vermieden wird (im Gegensatz zum
rm monthly.log
Entfernen der Datei).Betrachten Sie nach der Lösung der unmittelbaren Krise die Logrotation, wie von Quanta vorgeschlagen. Du willst nicht, dass das wieder passiert. Beachten Sie, dass die Apache-Protokolldateien unter CentOS bereits standardmäßig gedreht werden
Ziehen Sie auch in Betracht, die Webprotokolle über syslog zu senden (
/usr/bin/logger
z. B. mit). Bei Protokollen, die mit syslog erstellt wurden, ist normalerweise auch die Protokollierung bereits eingerichtet.quelle
>logfile
keine Notwendigkeit für Katze tunWenn Sie das ext3-Dateisystem verwenden, sollten Sie zu ext4 wechseln.
Ext3 kann beim Löschen großer Dateien langsam sein, da es den Speicherort jedes einzelnen 4-KB-Blocks speichert: Eine 50-GB-Datei (50 * 1024 ^ 3 Byte) belegt 13107200 Blöcke, von denen jeder in der Inode-Tabelle als 32-Bit-Blocknummer aufgezeichnet ist für insgesamt 50 MB Buchhaltungsdaten, um zu verfolgen, wo sich der Inhalt der Datei auf der Festplatte befindet. Diese große Blockliste kann über viele indirekte Blöcke verteilt sein , die alle aktualisiert werden müssen, wenn die Datei gelöscht wird. Die Festplatte, die auf all diese indirekten Blöcke zugreifen möchte, verursacht wahrscheinlich die Verzögerung.
Ext4 hingegen weist Dateien in "Extents" von bis zu 128 MB zu. Diese 50-GB-Datei kann in der Inode-Tabelle mit nur 400 Extent-Datensätzen anstelle von 13107200 einzelnen Blocknummern aufgezeichnet werden, wodurch sich die beim Löschen der Datei erforderliche Menge an Festplatten-E / A erheblich verringert.
Beachten Sie, dass beim Konvertieren eines vorhandenen ext3-Dateisystems in ext4 neue Dateien mithilfe von Extents zugewiesen werden, vorhandene Dateien jedoch weiterhin Blocklisten verwenden. Mit dem
chattr +e
Befehl können Sie eine vorhandene Datei mithilfe von Extents neu zuweisen. In Bezug auf die Leistung ist dies vergleichbar mit dem Erstellen einer Kopie der Datei und dem anschließenden Löschen des Originals.quelle
Dies läuft auf ein Leistungsproblem des Dateisystems hinaus. Auf diese SO-Frage gibt es eine interessante Antwort, aber dies hängt eher davon ab, welches Dateisystem Sie verwenden. Ich habe XFS beim Erstellen eines Dateisystems zum Speichern von Hunderten von MPEG2-Dateien mit mehreren Gigabyte für MythTV verwendet, da zu diesem Zeitpunkt die Löschleistung von XFS ext3 weit überlegen war. In den vergangenen Jahren haben sich die Dinge möglicherweise erheblich geändert.
Ich mag die Antwort von @ quanta. Das Aufteilen der Datei in kleinere Teile führt zu einem schnelleren Löschen.
quelle
Das Problem ist vermutlich darauf zurückzuführen, dass Sie die Datei von dem privilegierten Benutzer löschen, der für Festplattenvorgänge eine höhere Priorität hat als der Apache-Webserver-Benutzer. Unabhängig davon, wie Sie die Protokolldatei löschen möchten (rm -f oder durch> abschneiden), sollten Sie die Festplattenprioritätsoperationen auf ein Minimum reduzieren:
quelle