qBittorrent 的磁盘缓存怎么了?

本文最后更新于:2021年10月18日 晚上

这样的问题居然能存在这么久,某种意义上讲也蛮厉害的。

事情是这样的,我在群晖上的 Docker 安装了 qBittorrent 用于 BT 下载,设置好了硬盘缓存之后我以为万事大吉了,但是观察磁盘写入数据发现 qBittorrent 的磁盘缓存设置是无效的。

这中间到底发生了什么?

在 Github 上查询发现,这口锅还真不能给 qB 背,问题出在 qB 使用到的一个代码库,名字叫 libtorrent,这个代码库不知道从什么时候起,出现了一个 Bug: 在某些平台上,磁盘缓存无效、闲置内存不会自动回收并最终导致内存泄漏。具体表现就是在 BT 下载的时候,如果没有打开磁盘缓存,那么磁盘将保持写入状态,速度几乎和下载速度持平,且内存也以同样的速度写入;如果打开了磁盘缓存,那么在内存被写满之前(具体要看系统什么时候采取措施限制下载工具的内存增长),磁盘缓存功能正常,写满之后,同样持续写入。不管是哪一种情况,被吃掉的内存都不会被自动释放,除非删除任务。

libtorrent 的 Bug 是这样,但实际上 qB 的 Bug 有一点小小的区别。

经过测试,在 qB 上只有当系统缓存和磁盘缓存同时开启时,才能对应上面提到的“磁盘缓存打开的情况”。

另外并不是只有 qBittorrent 有这种问题,同样使用 libtorrent 的 Deluge 也有这个问题,只不过在Deluge的设置项里不存在系统缓存这个东西。

从 Github 的 issue 来看,这个问题似乎持续了七年之久,而且可能继续持续下去。因为这个 Bug 并不是在最近的某个版本引入的,七年前就有人发现了这个问题,不知为何 libtorrent 一直没有修复,大概连开发人员都不知道导致 Bug 的原因。

至于解决方式,如果真的在意磁盘缓存这个功能,可以用 Transmission 替代,不过 Tr 没有 qB 的自动添加 tracker,docker 里使用需要命令行进去手动装 WebUI。而且 Tr 在有多个种子的时候 UI 会卡,种子越多越卡,有时候删除一个种子要将近一分钟才有反应。我实在受不了这个卡,其他的 BT 下载软件还没有让我比较满意的,只能先将就用着 qB 了。


本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 协议 ,转载请注明出处,禁止商用。