En Windows, quedarse sin memoria era la mayor fuente de bloqueos de Firefox; sin embargo, muchos usuarios afectados tenían gigabytes de RAM física libre. Windows limita cuánta memoria puede confirmar una aplicación al tamaño de la RAM más el archivo de intercambio, y Firefox no podía controlar todo lo que consumía ese «espacio de confirmación»: los controladores gráficos confirman memoria para texturas que rara vez se usa pero que aun así cuenta contra el límite. Firefox había pasado años recortando su propio uso de memoria y monitorizando regresiones, y ninguno de esos esfuerzos movió la tasa de bloqueos como lo hizo el truco final.

La respuesta convencional a una asignación que no se puede satisfacer es rendirse: la mayoría de las rutas de fallo no tienen una forma sensata de continuar, así que el navegador se bloqueaba de forma controlada. Eso trataba el techo del espacio de confirmación como fijo, cuando en Windows no lo es: el sistema operativo amplía automáticamente el archivo de intercambio cuando está casi lleno, expandiendo la cantidad de memoria que las aplicaciones pueden confirmar.

El movimiento de Mozilla fue hacer que el proceso principal esperara brevemente cuando fallaba una asignación y luego la reintentara, dando tiempo a Windows para aumentar el archivo de paginación. La pausa también aporta algo más: Firefox se ejecuta como varios procesos y puede sobrevivir a la pérdida de cualquiera de ellos excepto el principal, así que durante la demora un proceso de contenido o de GPU con memoria desbocada tiende a morir primero, liberando espacio para que el navegador se reanude. Perder una página web o ver un breve parpadeo es mejor que un bloqueo completo del navegador.

El truco se lanzó en Firefox 105 y redujo los bloqueos del navegador por falta de memoria por hora de uso activo en más del 70 %, mucho más allá de las predicciones más optimistas de Mozilla. El equipo había usado el mismo enfoque con éxito en Firefox para Android y Firefox OS, y un pequeño aumento de los bloqueos de pestañas bajo presión de memoria fue lo siguiente que se propusieron reducir.

Una asignación fallida no tiene por qué ser fatal en Windows: el sistema operativo aumenta el archivo de paginación a demanda, así que esperar y reintentar convierte un bloqueo por falta de memoria en una breve pausa.

Windows no mata una aplicación cuya asignación falla: la llamada devuelve un error, así que el proceso puede optar por esperar y volver a intentarlo en lugar de morir.

El techo del espacio de confirmación es ampliable: Windows aumenta automáticamente el archivo de intercambio cuando está casi lleno, y una breve pausa le da tiempo para hacerlo.

El diseño multiproceso de Firefox significa que detener el proceso principal permite que un proceso de contenido o de GPU recargable muera primero y libere memoria, protegiendo todo el navegador.

El cambio alteró el manejo de fallos en lugar del uso de memoria, y por eso una pequeña corrección superó a años de recorte de huella.

Cuando una plataforma puede expandir un recurso a demanda, haz una pausa en lugar de bloquear al fallar, y en una aplicación multiproceso deja que un subproceso recargable absorba el daño primero.

La versión 105 de Firefox incorporó el comportamiento de esperar y reintentar en septiembre de 2022, y la telemetría mostró que los bloqueos del navegador por falta de memoria por hora de uso activo cayeron en más del 70 %, «mucho más de lo que auguraban nuestras predicciones más optimistas». La pausa provocó un aumento menor de los bloqueos de pestañas, que el equipo se puso entonces a reducir, y Mozilla empezó a distinguir el bajo espacio de confirmación de la baja memoria física para que Firefox pudiera responder de forma diferente y reducir el intercambio. El ingeniero Raymond Kraesig implementó el truco y monitorizó su impacto; la misma técnica ya había funcionado en Firefox para Android y Firefox OS.

CONSULTA LAS PRUEBAS

Las fuentes

  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 ·