Unter Windows war Speichermangel die größte Absturzursache von Firefox – doch vielen betroffenen Nutzern standen Gigabyte an physischem RAM frei. Windows begrenzt, wie viel Speicher eine Anwendung committen kann, auf die Größe von RAM plus Auslagerungsdatei, und Firefox konnte nicht alles kontrollieren, was diesen „Commit-Space“ verbrauchte: Grafiktreiber committen Speicher für Texturen, der selten genutzt wird, aber dennoch gegen das Limit zählt. Firefox hatte jahrelang den eigenen Speicherverbrauch reduziert und Regressionen überwacht, und keine dieser Bemühungen veränderte die Absturzrate so wie der schließliche Trick.

Die übliche Reaktion auf eine Allokation, die nicht erfüllt werden kann, ist aufzugeben: Die meisten Fehlerpfade haben keine sinnvolle Möglichkeit fortzufahren, sodass der Browser kontrolliert abstürzte. Damit wurde die Obergrenze des Commit-Space als fest betrachtet, obwohl sie unter Windows nicht fest ist – das Betriebssystem vergrößert die Auslagerungsdatei automatisch, wenn sie fast voll ist, und erweitert so die Speichermenge, die Anwendungen committen können.

Mozillas Vorgehen bestand darin, den Hauptprozess bei einer fehlgeschlagenen Allokation kurz warten zu lassen und sie dann erneut zu versuchen, damit Windows Zeit hat, die Auslagerungsdatei zu vergrößern. Die Verzögerung bringt noch etwas anderes: Firefox läuft als mehrere Prozesse und kann den Verlust jedes einzelnen außer dem Hauptprozess überstehen, sodass während der Wartezeit ein Content- oder GPU-Prozess mit außer Kontrolle geratenem Speicherverbrauch in der Regel zuerst stirbt und Platz freigibt, damit der Browser fortfahren kann. Eine Webseite zu verlieren oder ein kurzes Flackern zu sehen ist besser als ein vollständiger Browserabsturz.

Der Trick wurde in Firefox 105 ausgeliefert und senkte die Browser-Abstürze wegen Speichermangels pro aktiver Nutzungsstunde um mehr als 70 % – weit über Mozillas optimistischste Prognosen hinaus. Das Team hatte denselben Ansatz bereits erfolgreich bei Firefox für Android und Firefox OS eingesetzt, und ein leichter Anstieg von Tab-Abstürzen unter Speicherdruck war das Nächste, was sie sich vornahmen zu reduzieren.

Eine fehlgeschlagene Allokation muss unter Windows nicht fatal sein – das Betriebssystem vergrößert die Auslagerungsdatei bei Bedarf, sodass Warten und erneutes Versuchen einen Absturz wegen Speichermangels in eine kurze Verzögerung verwandelt.

Windows beendet eine Anwendung nicht, deren Allokation fehlschlägt – der Aufruf gibt einen Fehler zurück, sodass der Prozess warten und es erneut versuchen kann, statt zu sterben.

Die Obergrenze des Commit-Space ist erweiterbar: Windows vergrößert die Auslagerungsdatei automatisch, wenn sie fast voll ist, und eine kurze Pause gibt ihm Zeit dafür.

Firefox' Multiprozess-Design bedeutet, dass das Anhalten des Hauptprozesses einen neu ladbaren Content- oder GPU-Prozess zuerst sterben und Speicher freigeben lässt, wodurch der gesamte Browser geschützt wird.

Die Änderung betraf die Fehlerbehandlung statt den Speicherverbrauch, weshalb eine kleine Korrektur jahrelange Reduzierung des Speicherbedarfs übertraf.

Wenn eine Plattform eine Ressource bei Bedarf erweitern kann, sollte man pausieren statt bei einem Fehler abzustürzen – und in einer Multiprozess-Anwendung sollte ein neu ladbarer Unterprozess den Schaden zuerst auffangen.

Firefox 105 lieferte das Warten-und-erneut-Versuchen-Verhalten im September 2022 aus, und die Telemetrie zeigte, dass die Browser-Abstürze wegen Speichermangels pro aktiver Nutzungsstunde um mehr als 70 % sanken – „weit mehr als unsere optimistischsten Prognosen“. Die Verzögerung verursachte einen kleineren Anstieg von Tab-Abstürzen, den das Team anschließend zu reduzieren begann, und Mozilla begann, niedrigen Commit-Space von niedrigem physischem Speicher zu unterscheiden, damit Firefox unterschiedlich reagieren und das Swapping verringern konnte. Der Ingenieur Raymond Kraesig implementierte den Trick und überwachte seine Wirkung; dieselbe Technik hatte bereits bei Firefox für Android und Firefox OS funktioniert.

DEN BELEGEN FOLGEN

Die Quellen

  1. Improving Firefox stability with this one weird trick Mozilla Hacks · hacks.mozilla.org ·
  2. Hacker News discussion: Improving Firefox stability with this one weird trick Hacker News · news.ycombinator.com ·