O Thunderbird sobrecarrega meu HDD em grandes operações, o que fazer?

0

Se eu fizer operações no Thunderbird com muitos (milhares de) e-mails, ouço uma voz falsa de meus HDDs. Não parece muito bonito.

Isso acontece somente se eu fizer algo com muitos e-mails (por exemplo, movendo alguns milhares para a lixeira). Também é muito lento.

Como lidar com esse problema?

    
por peterh 24.09.2018 / 04:13

1 resposta

0

Um rápido strace mostra que o Thunderbird usa uma chamada fsync para sincronizar seus bancos de dados locais após cada operação de email . Isso força o sistema a gravar todo o seu cache de gravação. 1

Fazendo isso, eles tornam o thunderbird mais estável, porque a probabilidade do dano dos bancos de dados locais diminuirá significativamente devido a uma possível falha do sistema (ou travamento do thunderbird); no entanto, eles usam os HDDs dos usuários e tornam a capacidade de todo o sistema menos otimizada.

Comportamento semelhante também pode ser visto em muitos outros softwares, não apenas no mundo opensource. Por exemplo, o ext4 grava o cache de gravação em cada 5 segundos , tornando seu próprio fs sub-ótimo. Ou o banco de dados PostgreSQL também faz o mesmo após cada transação confirmada . Estes podem ser facilmente desativados em ambos os casos, mas não consegui encontrar o mesmo para o Thunderbird.

Minha pesquisa mostrou que não há como desativar esse recurso, e recompilar o thunderbird apenas por esse pequeno recurso foi claramente um exagero. Em vez disso, uma forma simples de proibir todas as chamadas fsync do Thunderbird é facilmente disponível, enquanto o Thunderbird nem sabe o que está acontecendo.

O mesmo mecanismo funciona muito bem também para outros processos que gostam de sobrecarregar os hdds de zero a pequenos resultados. A solução alternativa requer um compilador C com os pacotes de desenvolvimento.

O truque é ligar as chamadas fsync() disponíveis para o thunderbird com uma simulação, sem fazer nada.

  1. Insira isso em um pequeno arquivo .c, por exemplo, em nosync.c :
int fsync(int arg) {
  return 0;
}

int fdatasync(int arg) {
  return 0;
}
  1. Nós compilamos em uma pequena biblioteca compartilhada com o comando gcc -s -Os -Wall -shared -o nosync.so nosync.c .

  2. Depois disso, o thunderbird deve ser chamado pelo comando LD_PRELOAD=/path/to/nosync.so thunderbird

Uau! Não há mais mortes por HDD.

Claro, isso remove a proteção extra dos bancos de dados internos do Firefox. Pode ser particularmente perigoso somente se você tiver dados importantes em sua conta local. No entanto, o Firefox mantém hoje mais tipicamente tudo em uma conta IMAP, seus bancos de dados locais são essencialmente apenas cache. Assim, este fsync regular não é necessário.

1 O Thunderbird é um processo multi-threaded, portanto, um pequeno script para strace de todos os seus threads (strace pode seguir apenas um único pid).

    
por 24.09.2018 / 04:13