peterh Asked: 2018-09-24 18:13:26 +0800 CST2018-09-24 18:13:26 +0800 CST 2018-09-24 18:13:26 +0800 CST Thunderbird 在大型操作中使我的硬盘超载,该怎么办? 772 如果我在 Thunderbird 中处理许多(数千封)邮件,我会听到 HDD 发出崩溃的声音。听起来真的不美。 只有当我处理大量邮件时才会发生这种情况(例如,将数千封邮件移入垃圾箱)。它也很慢。 如何处理这个问题? kernel cache 1 个回答 Voted Best Answer peterh 2018-09-24T18:13:26+08:002018-09-24T18:13:26+08:00 快速strace显示 Thunderbird在每次邮件操作后fsync使用调用来同步其本地数据库。它强制系统写出所有的写缓存。1 这样做,他们使 thunderbird 更加稳定,因为由于可能的系统崩溃(或 thunderbird 崩溃),本地数据库损坏的可能性将大大降低;然而,它们会磨损用户的 HDD,并使整个系统的容量不太理想。 类似的行为也可以在许多其他软件中看到,而不仅仅是在开源世界中。例如,ext4 每5 秒写出一次写缓存,使自己的 fs 次优。或者 PostgreSQL 数据库也在每个提交的事务之后做同样的事情。在这两种情况下都可以轻松关闭这些功能,但我找不到 Thunderbird 的相同功能。 我的研究表明没有办法关闭这个功能,仅仅为了这个小功能重新编译 thunderbird 显然是一种矫枉过正。相反,一种禁止fsync对 Thunderbird 的所有调用的简单方法很容易获得,而 Thunderbird 甚至不知道发生了什么。 同样的机制也适用于其他喜欢超载硬盘以获得零到很少结果的进程。解决方法需要一个带有开发包的 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)。
快速
strace
显示 Thunderbird在每次邮件操作后fsync
使用调用来同步其本地数据库。它强制系统写出所有的写缓存。1这样做,他们使 thunderbird 更加稳定,因为由于可能的系统崩溃(或 thunderbird 崩溃),本地数据库损坏的可能性将大大降低;然而,它们会磨损用户的 HDD,并使整个系统的容量不太理想。
类似的行为也可以在许多其他软件中看到,而不仅仅是在开源世界中。例如,ext4 每5 秒写出一次写缓存,使自己的 fs 次优。或者 PostgreSQL 数据库也在每个提交的事务之后做同样的事情。在这两种情况下都可以轻松关闭这些功能,但我找不到 Thunderbird 的相同功能。
我的研究表明没有办法关闭这个功能,仅仅为了这个小功能重新编译 thunderbird 显然是一种矫枉过正。相反,一种禁止
fsync
对 Thunderbird 的所有调用的简单方法很容易获得,而 Thunderbird 甚至不知道发生了什么。同样的机制也适用于其他喜欢超载硬盘以获得零到很少结果的进程。解决方法需要一个带有开发包的 C 编译器。
诀窍是用模拟挂钩
fsync()
thunderbird 可用的调用,什么也不做。nosync.c
:我们用命令把它编译成一个小的共享库
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)。