Löschen sehr großer Dateien ohne Einfrieren des Webservers

11

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?

Jinbom Heo
quelle

Antworten:

23

Drehen Sie es zuerst über logrotatemit einer Konfiguration wie dieser:

/path/to/the/log {
    missingok
    notifempty
    sharedscripts
    daily   
    rotate 7
    postrotate
        /sbin/service httpd reload > /dev/null 2>/dev/null || true
    endscript
    compress
}

Erstellen Sie dann um Mitternacht einen Cron-Job, um die gedrehte Datei zu löschen:

30 2 * * * nice -n 19 ionice -c2 -n7 rm -f /path/to/the/log/file.1
Quanten
quelle
Können Sie erklären, was dies bedeutet / tut?
Mowwwalker
1
Sie "nicken" und "ionisieren" die Löschung. Nizza wurde verwendet, um eine CPU-Überlastung zu verhindern, aber das wichtigste hier ist ionice, wo Sie dem Scheduler tatsächlich sagen, dass er die Datei mit einer niedrigeren Priorität löschen soll. -c ist für die Klasse, wobei 1 Echtzeit, 2 Normal und 3 Leerlauf ist. Innerhalb der Klasse 2 haben Sie 0 bis 7 (IRRC), wobei 7 die niedrigste ist. Wenn dies immer noch Probleme verursacht, führen Sie es mit 'ionice -c3' aus und es sollte in Ordnung sein.
Golan
5

Zum schnelleren Löschen großer Dateien können Sie den truncateBefehl - Say verwenden, um sie auf eine Größe von Null zu verkleinern und dann zu löschen:

 truncate -s 0  monthly.log && rm -f monthly.log

Wie von Quanten empfohlen, müssen Sie es jedoch zuerst logrotieren.

Daniel t.
quelle
Wie truncateunterscheidet sich von >?
Kojiro
hmm gute frage. Das Ergebnis ist das gleiche, aber ich habe keine Antwort darauf, wie sie sich in der Implementierung unterscheiden.
Daniel t.
Das truncateist einfacher zu bedienen sudoals >. Es ist auch einfacher mit find -exec.
Kubanczyk
3
echo "0" > monthly.log && rm -f monthly.log
Amit Biyani
quelle
3
Sie können einfach >logfilekein Echo brauchen
user9517
3

Ich würde die Datei mit der : > /path/to/monthly.logOperation 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

ewwhite
quelle
Keine Notwendigkeit für die :. Sie können einfach tun> /path/to/monthly.log
Kojiro
Ich weiß, dass es ein ist noop, aber es ist aus der Perspektive des Unterrichts sinnvoller.
ewwhite
… Aber dann muss ein zukünftiger Ausbilder dieses Missverständnis korrigieren . Na ja, ich denke, es ist Arbeitsplatzsicherheit.
Kojiro
Würde true > /path/to/monthly.logich nicht das Gleiche tun und es ist dann weniger archaisch :?
Stefan Lasiewski
Wahrscheinlich wahr ...
ewwhite
3

Wenn Sie die Daten nicht benötigen, kürzen Sie sie mit / dev / null:

cat /dev/null > monthly.log

Der Webserver schreibt nach dem Abschneiden weiterhin Daten in die Datei, wodurch ein Neustart des Webservers vermieden wird (im Gegensatz zum rm monthly.logEntfernen 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/loggerz. B. mit). Bei Protokollen, die mit syslog erstellt wurden, ist normalerweise auch die Protokollierung bereits eingerichtet.

Stefan Lasiewski
quelle
5
Sie können einfach >logfilekeine Notwendigkeit für Katze tun
user9517
2

Wenn 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 +eBefehl 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.

Wyzard
quelle
1

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.

Tim Potter
quelle
1

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:

  ionice -c3 rm -f filename.log
Andrei Mikhaltsov
quelle