Heim  >  Artikel  >  System-Tutorial  >  Warum wird der Speicherplatz nach dem Löschen einer Datei nicht freigegeben?

Warum wird der Speicherplatz nach dem Löschen einer Datei nicht freigegeben?

WBOY
WBOYnach vorne
2024-01-08 14:46:281270Durchsuche

Haben Sie jemals eine Situation erlebt, in der Dateien gelöscht wurden, aber der Speicherplatz in einer Linux-Umgebung nicht freigegeben wurde? In diesem kurzen Artikel werden ein Szenario dieses Problems und die entsprechende Lösung vorgestellt.

Einer unserer Anwendungsserver, das Betriebssystem ist Red Hat Linux, Überwachungsalarm, /opt/applog-Dateisystemnutzung überschreitet den Schwellenwert, die Gesamtkapazität beträgt 50G, aber die tatsächliche Dateikapazität beträgt 20G, wie groß ist der verbleibende 30G-Speicherplatz?

Wir wissen, dass in der Linux-Umgebung alles in Form einer Datei vorhanden ist. Das System weist im Hintergrund einen Dateideskriptor für die Interaktion zwischen der Anwendung und dem Betriebssystem zu Wenn es sich bei der Schnittstelle um eine Datei handelt, nimmt sie Speicherplatz ein. Zu diesem Zeitpunkt können Sie den Befehl lsof verwenden, mit dem die Dateien aufgelistet werden können, die derzeit vom System geöffnet werden.

>lsof
COMMAND      PID      USER   FD      TYPE    DEVICE  SIZE/OFF      NODE NAME
...
filebeat  111442   app  1r      REG     253,3 209715229   1040407 /opt/applog/E.20171016.info.012.log
filebeat  111442   app  2r      REG     253,3 209715254    385080 /opt/applog/E.20171015.info.001.log (deleted)
...

Die einzelnen Felder in der Kopfzeile haben folgende Bedeutung:

BEFEHL: Der Name des Prozesses
PID: Prozesskennung
BENUTZER: Prozessinhaber
FD: Dateideskriptor. Die Anwendung identifiziert die Datei anhand des Dateideskriptors. Wie cwd, txt usw.
TYP: Dateityp, z. B. DIR, REG usw.
GERÄT: Geben Sie den Namen der Festplatte an
GRÖSSE: Die Größe der Datei
NODE: Indexknoten (Identifizierung der Datei auf der Festplatte)
NAME: Der genaue Name der geöffneten Datei

Es ist zu erkennen, dass in einigen Zeilen NAME markiert (gelöscht) ist

/opt/applog/E.20171015.info.001.log (gelöscht)

Das bedeutet, dass die Datei gelöscht wurde, das Handle für die geöffnete Datei jedoch nicht geschlossen wurde. Der BEFEHLsname lautet „filebeat“ und der Benutzer des BENUTZER-Prozesses ist „app“. hat den Filebeat-Prozess aktiviert.

Einführung in die Protokollsammelplattform

Die traditionelle Open-Source-Protokollierungsplattform ELK besteht aus drei Open-Source-Tools: ElasticSearch, Logstash und Kiabana, darunter:

  • Elasticsearch ist eine verteilte Open-Source-Suchmaschine, verteilt, ohne Konfiguration, automatische Erkennung, automatisches Index-Sharding, Index-Kopiermechanismus, Restful-Style-Schnittstelle, mehrere Datenquellen, automatisches Suchladen usw.
  • Logstash ist ein Open-Source-Sammeltool, das Protokolle sammeln, filtern und zur späteren Verwendung speichern kann.
  • Kibana ist ein grafisches Open-Source-Webtool, das eine protokollanalysefreundliche Weboberfläche für Logstash und ElasticSearch bietet und wichtige Datenprotokolle aggregieren, analysieren und durchsuchen kann.

Allgemeines Bereitstellungsdiagramm, wie unten gezeigt

Warum wird der Speicherplatz nach dem Löschen einer Datei nicht freigegeben?

Was ist Filebeat, das oben erwähnt wurde? Welche Verbindung besteht zu ELK?

Es gibt eine Einführung des großen Experten Rao Chenlin (Autor von „ELKstack Authoritative Guide“) zu Zhihu, die sehr aufschlussreich ist und unter https://www.zhihu.com/question/54058964/answer/137882919 zitiert wird

Da Logstash von JVM ausgeführt wird und viele Ressourcen verbraucht, verwendete der Autor später Golang, um einen leichten Logstash-Forwarder mit weniger Funktionen, aber geringem Ressourcenverbrauch zu schreiben. Der Autor ist jedoch nur eine Person. Nach seinem Beitritt zu

Warum wird der Speicherplatz nach dem Löschen einer Datei nicht freigegeben?

Einfach ausgedrückt ist Filebeat der Prozessagent für die Protokollerfassung, der für die Erfassung von Anwendungsprotokolldateien verantwortlich ist.

Für mein obiges Problem liegt der Grund dafür, dass es eine große Anzahl (gelöschter) und nicht freigegebener Dateihandles gibt, darin, dass aufgrund des sehr begrenzten Speicherplatzes vorübergehend jede Stunde eine Aufgabe zum Löschen der Protokolle hinzugefügt wurde Mit anderen Worten, die geplante Aufgabe löscht automatisch einige Dateien, die Filebeat zu diesem Zeitpunkt öffnet, sodass diese Dateien zu nicht freigegebenen Dateien werden, sodass die tatsächlichen Dateien gelöscht werden, der Speicherplatz jedoch nicht freigegeben wird.

Lösung 1:

Um den belegten Speicherplatz schnell freizugeben, besteht die direkteste Methode darin, den -9-Filebeat-Prozess abzubrechen. Zu diesem Zeitpunkt wird der Speicherplatz freigegeben. Dies ist jedoch keine grundsätzliche Lösung. Geplante Aufgaben löschen auch diese von Filebeat geöffneten Dateien, wodurch der Speicherplatz voll wird.

Lösung 2:
Die Konfigurationsdatei filebeat.yml von Filebeat hat tatsächlich zwei Parameter:

  • close_older: 1h
    Beschreibung: Close old schließt den Dateihandler, für den länger als close_older keine Änderungen vorgenommen wurden. Zeitzeichenfolgen wie 2h (2 Stunden), 5m (5 Minuten) können verwendet werden.

Das heißt, wenn eine Datei innerhalb eines bestimmten Zeitraums nicht aktualisiert wurde, wird das überwachte Dateihandle geschlossen. Der Standardwert ist 1 Stunde.

  • force_close_files: false
    Hinweis: Diese Option schließt eine Datei, sobald sich der Dateiname ändert. Diese Konfigurationsoption wird nur unter Windows empfohlen. Dies kann zu Problemen führen, wenn die Datei entfernt wird vollständig entfernt werden, bis auch Filebeat den Dateihandler schließt. Während dieser Zeit kann keine neue Datei mit demselben Namen erstellt werden Es kann vorkommen, dass nach der Dateirotation der Anfang der neuen Datei übersprungen wird, da das Lesen am Ende beginnt. Wir empfehlen, diese Option auf „false“ zu belassen, aber den Wert „ignore_older“ zu verringern, um Dateien schneller freizugeben.

Das heißt, wenn sich der Dateiname ändert, einschließlich Umbenennen und Löschen, wird eine Datei automatisch geschlossen.

Wenn diese beiden Parameter entsprechend den Anwendungsanforderungen kombiniert werden, muss das Handle geschlossen werden, wenn eine Datei nicht innerhalb von 30 Minuten aktualisiert wird. Wenn die Datei umbenannt oder gelöscht wird, muss das Handle geschlossen werden

close_older: 30m

force_close_files: true

Es kann die grundlegenden Anforderungen der Filebeat-Protokollerfassung und des regelmäßigen Löschens historischer Dateien erfüllen.

Das obige ist der detaillierte Inhalt vonWarum wird der Speicherplatz nach dem Löschen einer Datei nicht freigegeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:linuxprobe.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen