Heim > Artikel > System-Tutorial > Warum wird der Speicherplatz nach dem Löschen einer Datei nicht freigegeben?
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:
Allgemeines Bereitstellungsdiagramm, wie unten gezeigt
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 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: Das heißt, wenn eine Datei innerhalb eines bestimmten Zeitraums nicht aktualisiert wurde, wird das überwachte Dateihandle geschlossen. Der Standardwert ist 1 Stunde. 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
force_close_files: true
Die Konfigurationsdatei filebeat.yml von Filebeat hat tatsächlich zwei Parameter:
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.
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 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!