Thunderbird 在大型操作中使我的硬盘超载,该怎么办?

Thunderbird 在大型操作中使我的硬盘超载,该怎么办?

如果我在 Thunderbird 中对许多(数千封)邮件进行操作,我会听到 HDD 发出崩溃的声音。听起来确实不漂亮。

仅当我对大量邮件执行某些操作(例如,将数千封邮件移入垃圾箱)时,才会发生这种情况。它也很慢。

如何处理这个问题呢?

答案1

快速strace显示 Thunderbird 使用fsync调用同步其本地数据库每次邮件操作后。它强制系统写出所有的写缓存。1

这样做可以使 Thunderbird 更加稳定,因为由于可能的系统崩溃(或 Thunderbird 崩溃)而导致本地数据库损坏的概率将大大降低;然而,它们会磨损用户的硬盘,并使整个系统的容量不太理想。

类似的行为也可以在许多其他软件中看到,而不仅仅是在开源世界中。例如,ext4 在每次写入时都会写出写入缓存5秒,使他们自己的 fs 次优。或者PostgreSQL数据库也做同样的事情每次提交交易后。在这两种情况下都可以轻松关闭这些功能,但我找不到 Thunderbird 的相同功能。

我的研究表明没有办法关闭这个功能,而仅仅为了这个小功能重新编译雷鸟显然是一种矫枉过正的行为。相反,一个简单的方法禁止所有fsync雷鸟呼叫很容易获得,而雷鸟甚至不知道发生了什么。

对于其他喜欢使硬盘过载以获得零到很少结果的进程来说,相同的机制也非常有效。该解决方法需要带有开发包的 C 编译器。

诀窍是用fsync()模拟来挂钩可用于 Thunderbird 的调用,而不执行任何操作。

  1. 将其插入到一个小的 .c 文件中,例如nosync.c
int fsync(int arg) {
  return 0;
}

int fdatasync(int arg) {
  return 0;
}
  1. 我们使用命令将其编译成一个小型共享库gcc -s -Os -Wall -shared -o nosync.so nosync.c

  2. 之后,雷鸟应该被命令调用LD_PRELOAD=/path/to/nosync.so thunderbird

哇!不再有硬盘杀戮。

当然,它消除了 Firefox 内部数据库的额外保护。仅当您的本地帐户中有重要数据时,这才可能特别危险。然而,如今 Firefox 通常保存 IMAP 帐户中的所有内容,其本地数据库本质上只是缓存。因此,fsync不需要这个正则。

1 Thunderbird 是一个多线程进程,因此需要一个小脚本来处理strace它的所有线程(strace 只能跟踪一个 pid)。

相关内容