No Windows, ficar sem memória era a maior fonte de travamentos do Firefox — ainda assim, muitos usuários afetados tinham gigabytes de RAM física livres. O Windows limita quanto de memória um aplicativo pode comprometer ao tamanho da RAM mais o do arquivo de paginação, e o Firefox não conseguia controlar tudo o que consumia esse "espaço de commit": drivers de vídeo comprometem memória para texturas que raramente são usadas, mas que ainda contam para o limite. O Firefox passou anos reduzindo o próprio uso de memória e monitorando regressões, e nenhum desses esforços alterou a taxa de travamentos como o truque que acabou funcionando.

A resposta convencional a uma alocação que não pode ser satisfeita é desistir: a maioria dos caminhos de falha não tem como continuar de forma sensata, então o navegador travava de forma controlada. Isso tratava o teto do espaço de commit como fixo, quando no Windows ele não é — o sistema operacional aumenta automaticamente o arquivo de paginação quando ele está quase cheio, ampliando a quantidade de memória que os aplicativos podem comprometer.

A medida da Mozilla foi fazer o processo principal esperar brevemente quando uma alocação falhava e então tentar novamente, dando tempo ao Windows para aumentar o arquivo de paginação. A pausa também traz outro benefício: o Firefox roda como vários processos e consegue sobreviver à perda de qualquer um deles, exceto o principal, então durante a espera um processo de conteúdo ou de GPU com consumo descontrolado de memória tende a morrer primeiro, liberando espaço para o navegador retomar. Perder uma página da web ou ver um breve piscar é melhor do que o navegador inteiro travar.

O truque chegou ao Firefox 105 e reduziu os travamentos do navegador por falta de memória por hora de uso ativo em mais de 70% — muito além das previsões mais otimistas da Mozilla. A equipe já havia usado a mesma abordagem com sucesso no Firefox para Android e no Firefox OS, e um pequeno aumento nos travamentos de abas sob pressão de memória foi a próxima coisa que eles se propuseram a reduzir.

Uma alocação que falha não precisa ser fatal no Windows — o sistema operacional aumenta o arquivo de paginação sob demanda, então esperar e tentar novamente transforma um travamento por falta de memória em uma breve pausa.

O Windows não encerra um aplicativo cuja alocação falha — a chamada retorna um erro, então o processo pode optar por esperar e tentar de novo em vez de morrer.

O teto do espaço de commit é expansível: o Windows aumenta automaticamente o arquivo de paginação quando ele está quase cheio, e uma breve pausa dá tempo para isso acontecer.

O design multiprocesso do Firefox faz com que, ao pausar o processo principal, um processo de conteúdo ou de GPU recarregável morra primeiro e libere memória, protegendo o navegador inteiro.

A mudança alterou o tratamento de falhas, não o uso de memória, e é por isso que uma pequena correção superou anos de redução do consumo.

Quando uma plataforma pode expandir um recurso sob demanda, faça uma pausa em vez de travar em caso de falha — e, em um aplicativo multiprocesso, deixe um subprocesso recarregável absorver o dano primeiro.

O Firefox 105 lançou o comportamento de esperar e tentar novamente em setembro de 2022, e a telemetria mostrou que os travamentos do navegador por falta de memória por hora de uso ativo caíram mais de 70% — "muito mais do que nossas previsões mais otimistas". A pausa causou um pequeno aumento nos travamentos de abas, que a equipe então trabalhou para reduzir, e a Mozilla começou a distinguir espaço de commit baixo de memória física baixa para que o Firefox pudesse responder de forma diferente e reduzir a paginação. O engenheiro Raymond Kraesig implementou o truque e monitorou seu impacto; a mesma técnica já havia funcionado no Firefox para Android e no Firefox OS.

CONFIRA AS EVIDÊNCIAS

As fontes

  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 ·