• Das Problem. Gelöschte Dateien belegen weiter Platz, solange ein laufender Prozess sie noch geöffnet hat. Der Finder, die Ansicht „Speicher“ und der Befehl du übersehen sie.
  • Was wir herausgefunden haben. Ein Hintergrundprozess namens chronod hielt 174 gelöschte Kopien einer Systemdatenbank. Ein Neustart des Prozesses gab in weniger als drei Sekunden 2,03 GB frei.
  • Was wir gebaut haben. Mint 1.0.82 führt diese Dateien unter Safe to clean auf und zählt nur, was das Beenden eines macOS-Hintergrundprozesses freigeben sollte. Mint hakt die Zeile nie von sich aus an.

Wenn du Dateien löschst und der freie Speicherplatz auf deinem Mac nicht steigt, hat vielleicht ein laufender Prozess sie noch geöffnet. macOS behält die Daten einer gelöschten Datei, bis der letzte Prozess, der sie hält, sie loslässt. Alles, was Ordner für Ordner zählt, übersieht sie, auch der Finder, die Ansicht „Speicher“ und du. Auf einem unserer Macs hielt ein Hintergrundprozess namens chronod 174 gelöschte Kopien einer Systemdatenbank. Ein Neustart des Prozesses gab in weniger als drei Sekunden 2,03 GB frei.

Als wir das drei Tage zuvor zum ersten Mal gemessen hatten, kamen wir zum falschen Ergebnis. Derselbe Fehler passiert auf jedem Mac leicht, deshalb steht weiter unten auch, wie es dazu kam.

Löschen entfernt den Namen einer Datei

Wenn du eine Datei löschst, entfernt macOS ihren Namen aus dem Ordner. Hat ein Prozess die Datei noch geöffnet oder in seinen Arbeitsspeicher eingeblendet, bleiben die Daten auf dem Datenträger, bis dieser Prozess sie loslässt. Der Platz gilt weiter als belegt, aber kein Ordner enthält ihn. Jedes Werkzeug, das Ordner zusammenzählt, kommt deshalb auf zu wenig.

lsof listet diese Dateien auf. Die Option +L1 zeigt geöffnete Dateien, die keinen Namen mehr haben. Dieser Befehl gibt aus, wie viel jeder Prozess hält, die größten zuerst:

lsof +c 0 -nP +L1 |
  awk 'NR>1 && $5=="REG" && !seen[$9 FS $1]++ {s[$1]+=$7}
       END {for (p in s) if (s[p]>=1e7) printf "%8.2f GB  %s\n", s[p]/1e9, p}' |
  sort -rn

Er liest nur und braucht kein Passwort. Ohne vorangestelltes sudo sieht er nur Prozesse, die unter deinem Benutzer laufen, nicht die, die als root laufen. Die Größen sind Dateilängen, und eine Datei, die zwei Prozesse geöffnet haben, wird bei beiden gezählt. Beendest du einen Prozess, wird also unter Umständen weniger frei, als seine Zeile angibt. Mehr dazu weiter unten.

Was ein Mac festhielt

Am 4. Oktober um 02:22 Uhr pazifischer Zeit, fast fünf Tage nach dem letzten Start des Macs, listete lsof 324 gelöschte Dateien auf, die noch geöffnet waren, laut Dateilänge zusammen 2,88 GB. Ein einziger Prozess hielt den größten Teil davon:

process                       deleted files    length
chronod                                 172   2.24 GB
linkd                                    17   0.21 GB
an Insta360 camera extension              2   0.07 GB
fileproviderd                             6   0.06 GB

Bis auf eine waren alle Dateien von chronod alte Kopien der LaunchServices-Datenbank. In dieser Liste hält macOS fest, welche Apps auf dem Mac sind und welche Dateien und Links jede von ihnen öffnet. Jede Kopie ist etwa 13 MB groß. chronod ist der Systemprozess, der Widgets aktuell hält. Er lief seit dem 2. Oktober, 15:50 Uhr, also seit 34,5 Stunden.

chronod neu starten

launchd startet die Hintergrundprozesse von macOS und startet chronod wieder, sobald ihn etwas braucht. Also haben wir chronod beendet und den freien Speicherplatz beobachtet:

02:26  chronod holds 174 deleted copies, 2.276 GB by length
       free space, 6 readings over 10 s:   39.834 to 39.879 GB
       SIGTERM to chronod
+2.5 s free space:                         41.910 GB
+30 s  free space, 12 readings:            41.899 to 41.912 GB

Der freie Speicherplatz stieg innerhalb von 2,5 Sekunden um 2,03 GB und blieb dort. Innerhalb einer Minute lief ein neuer chronod.

2,03 GB sind 89 % der 2,28 GB, die lsof aufgelistet hatte. Den Rest erklärt die gemeinsame Nutzung: 20 der Kopien von chronod, zusammen 0,25 GB, waren auch in anderen Prozessen geöffnet, und diese Blöcke bleiben belegt, bis der letzte Prozess sie loslässt. 2,28 minus 0,25 ergibt 2,03, den Wert, den wir gemessen haben. Die Längen von lsof stimmten also, und ein Neustart gibt die Länge der Dateien frei, die nur dieser Prozess hält.

Unsere erste Messung war falsch

Die Kopien, die sich bei chronod angesammelt hatten, sahen wir zum ersten Mal am 1. Oktober, als der Spotlight-Index den freien Speicherplatz desselben Macs auffraß (die Geschichte dazu steht hier). chronod lief seit dem Start des Macs am 29. September und hielt 827 gelöschte Kopien, laut Dateilänge 5,49 GB. Dreizehn Minuten später waren es 836.

Dann passierten innerhalb einer Minute drei Dinge: Wir schalteten die Spotlight-Indizierung aus, löschten den Index und starteten chronod neu. Die Messwerte für den freien Speicherplatz, in pazifischer Zeit:

12:46:22  57 GiB free   (after indexing was turned off)
12:46:40  new chronod starts
12:46:43  61 GiB free   (index erased, chronod restarted)
12:46:57  61 GiB free

In unseren Notizen von diesem Nachmittag schrieben wir die 4 GiB dem Löschen des Index zu. Um chronod zu beurteilen, verglichen wir die Werte von 12:46:43 und 12:46:57 Uhr. Beide stammten aber aus der Zeit nach dem Neustart, und so sah es aus, als hätte chronod fast nichts freigegeben. Wir notierten, dass sich seine Kopien wahrscheinlich Blöcke teilten und lsof den Platz zu hoch angab.

Der Test vom 4. Oktober, eine einzige Änderung mit Messwerten davor und danach, zeigt etwas anderes. Hat chronod auch am 1. Oktober etwa 89 % freigegeben, wären aus seinen 5,49 GB rund 4,9 GB geworden, und dazu passt der Sprung um 4 GiB (4,3 GB, aus Werten, die auf ganze GiB gerundet waren). Der größte Teil dieses Sprungs ging, wie wir inzwischen annehmen, auf chronod zurück, und wir haben den Spotlight-Beitrag korrigiert: Das Abschalten der Indizierung hat mindestens 44 GiB freigegeben, etwa 47 GB, nicht die 51 GB, die wir zuerst geschrieben hatten.

Zwei einfache Gewohnheiten hätten den Fehler aufgedeckt, und beide lässt man leicht aus: zwischen zwei Messungen nur eine Sache ändern, und nachsehen, wann ein Prozess tatsächlich neu gestartet ist (ps -o lstart= -p <pid>), statt sich auf den Zeitpunkt zu verlassen, zu dem man ihn neu gestartet zu haben glaubt.

Warum chronod alte Kopien behält

LaunchServices ersetzt seine Datenbank, indem es eine neue Datei schreibt und die alte löscht. Ein Prozess, der die alte Datei eingeblendet hat, behält sie, bis er die neue einblendet. chronod behielt in den 51 Stunden nach dem Start des Macs 827 Kopien, etwa 16 pro Stunde, und in den folgenden 34,5 Stunden 174, etwa 5 pro Stunde. Die anderen Prozesse, die Kopien hielten, behielten weit weniger. Es sieht also nach einer Eigenheit von chronod aus und nicht nach etwas, das jeden Prozess betrifft, der die Datenbank liest.

Wir vermuteten, dass das Bauen von Apps dahintersteckt, denn jeder Build registriert eine neue App bei LaunchServices, und auf diesem Mac werden viele Male am Tag Apps gebaut. Ein kurzer Test brachte keine Klarheit: Eine App dreimal in zwei Minuten zu registrieren und wieder abzumelden, ergab zwei neue Kopien, und 30 Sekunden ohne jede Aktion ergaben eine. Builds erhöhen vielleicht die Rate, sind aber nicht der einzige Auslöser. Warum chronod alte Kopien anhäuft, wissen wir nicht.

Was du tun kannst

  • Führ die Prüfung von oben aus. Hält ein macOS-Hintergrundprozess mehr, als dir lieb ist, starte ihn neu, zum Beispiel mit killall chronod. launchd startet ihn wieder. Wir haben chronod auf diesem Mac seit dem 1. Oktober dreimal beendet, den Test oben eingerechnet, und keine Ausfälle bemerkt; die Widgets werden neu gezeichnet.
  • Hält eine App die Dateien, beende die App. Am 1. Oktober hielt Spotify 281 gelöschte Cache-Dateien.
  • Ein Neustart des Macs gibt alles frei.
  • Such diese Dateien nicht im Finder. Sie haben keinen Namen mehr, unter dem du sie finden könntest.

Was Mint macht

Mint 1.0.82 (2. Oktober) führt gelöschte Dateien, die ein Prozess noch hält, unter Safe to clean auf. Dabei zählt Mint nur die Dateien, die kein anderer Prozess hält. Die Zahl in der Zeile ist also das, was das Beenden dieses Prozesses freigeben sollte. Mint bietet das nur für macOS-Hintergrundprozesse an, die launchd wieder startet; die gehaltenen Dateien einer App landen unter Keep, mit dem Hinweis, die App zu beenden. Mint hakt die Zeile nie von sich aus an, und Auto Care übernimmt diesen Schritt nie.

Fragen

Wo taucht dieser Platz in der Ansicht „Speicher“ auf? Kein Ordner enthält ihn, also lässt er sich keiner Kategorie zuordnen. Wir gehen davon aus, dass er in den Systemdaten landet, dem Teil, den die Ansicht nicht weiter aufschlüsselt. In der Ansicht selbst haben wir das aber nicht überprüft.

Kann ich chronod gefahrlos beenden? launchd startet ihn innerhalb einer Minute wieder. Wir haben das auf einem Mac dreimal gemacht und dabei kein Problem bemerkt. Das ist eine kleine Stichprobe. Wenn Widgets für deine Arbeit wichtig sind, starte also lieber den Mac neu.

Kommt das wieder? Ja. chronod hat nach jedem Neustart sofort wieder angefangen, Kopien anzuhäufen.