如果我在 Thunderbird 中对许多(数千封)邮件进行操作,我会听到 HDD 发出崩溃的声音。听起来确实不漂亮。
仅当我对大量邮件执行某些操作(例如,将数千封邮件移入垃圾箱)时,才会发生这种情况。它也很慢。
如何处理这个问题呢?
答案1
快速strace
显示 Thunderbird 使用fsync
调用同步其本地数据库每次邮件操作后。它强制系统写出所有的写缓存。1
这样做可以使 Thunderbird 更加稳定,因为由于可能的系统崩溃(或 Thunderbird 崩溃)而导致本地数据库损坏的概率将大大降低;然而,它们会磨损用户的硬盘,并使整个系统的容量不太理想。
类似的行为也可以在许多其他软件中看到,而不仅仅是在开源世界中。例如,ext4 在每次写入时都会写出写入缓存5秒,使他们自己的 fs 次优。或者PostgreSQL数据库也做同样的事情每次提交交易后。在这两种情况下都可以轻松关闭这些功能,但我找不到 Thunderbird 的相同功能。
我的研究表明没有办法关闭这个功能,而仅仅为了这个小功能重新编译雷鸟显然是一种矫枉过正的行为。相反,一个简单的方法禁止所有fsync
雷鸟呼叫很容易获得,而雷鸟甚至不知道发生了什么。
对于其他喜欢使硬盘过载以获得零到很少结果的进程来说,相同的机制也非常有效。该解决方法需要带有开发包的 C 编译器。
诀窍是用fsync()
模拟来挂钩可用于 Thunderbird 的调用,而不执行任何操作。
- 将其插入到一个小的 .c 文件中,例如
nosync.c
:
int fsync(int arg) {
return 0;
}
int fdatasync(int arg) {
return 0;
}
我们使用命令将其编译成一个小型共享库
gcc -s -Os -Wall -shared -o nosync.so nosync.c
。之后,雷鸟应该被命令调用
LD_PRELOAD=/path/to/nosync.so thunderbird
哇!不再有硬盘杀戮。
当然,它消除了 Firefox 内部数据库的额外保护。仅当您的本地帐户中有重要数据时,这才可能特别危险。然而,如今 Firefox 通常保存 IMAP 帐户中的所有内容,其本地数据库本质上只是缓存。因此,fsync
不需要这个正则。
1 Thunderbird 是一个多线程进程,因此需要一个小脚本来处理strace
它的所有线程(strace 只能跟踪一个 pid)。