Resilio Sync 在差异同步下仍会重写整个文件,在用于同步类似日志文件这样不断变动的文件时,会导致巨量硬盘写入量。
前几天我无意中使用 DriveDx 查看硬盘 S.M.A.R.T. 信息时发现,我使用了差不多才一年的 MacBook Pro 的 SSD 硬盘写入量竟然高达 180 TB !按 365 天算,平均每天写入量接近 500 GB。
非常不可思议,因为我并没有主动写入这么多数据量。虽然 MacBook Pro 的 SSD 应该有相当高的写入寿命,但按这疯狂的写入量趋势,我还是怕没过一两年这 SSD 就得出问题。
很快我就通过 iStat Menus 和活动监视器( Activity Monitor )发现,造成这疯狂写入量的罪魁祸首就是 Resilio Sync。Resilio Sync 持续不断地以数十 MB/s 的速度往硬盘写入数据,一天的写入量可以达到 1 TB 以上,但是我并没有使用 Resilio Sync 同步这么高的数据量。
大半年以来,我有二三十台服务器长时间在跑我的一个程序,我一直用 Resilio Sync 来同步这些服务器上此程序使用的配置文件和生成的 CSV 数据文件以及日志文件到我的电脑上,这样可以很方便地管理和维护这么多台服务器,也可以及时获取生成的数据文件,一直都挺满意的。
虽然同步的服务器多,但需要同步的数据量并不高,每台服务器上同步的文件夹总大小一般只有几百 MB,而程序每分钟只会新增几十行数据到 CSV 数据文件和日志文件中,因为 Resilio Sync 支持块级差异同步——只有文件新改动的部分才需要传输,所以几十台服务器总共一直也只有 KB/s 数量级的同步量,一天应该不到 1 GB 的数据量。
那么按这同步量,理论上 Resilio Sync 一天的写入量也只要 1 GB 左右就好了,但是实际上 Resilio Sync 却以上千倍的速度不断地往硬盘写入数据,导致一天能有上 TB 的写入量,和同步量严重不符。
为了找出造成此问题的具体原因,我搜遍了互联网没找到先例,以及尝试了许多现在看来是徒劳的方法,期间的折腾就按下不表,最终被我发现导致这问题的原因是:
Resilio Sync 虽然支持差异同步传输,但是在同步到差异数据后会重写整个文件!
假设服务器上有个 100 MB 的文本文件,之前已经和本地同步好了。现在在文件末尾添加了 1 MB 的数据,Resilio Sync 可以只传输这新增的 1 MB 数据到本地,但是本地在接收到这 1 MB 后,会读取已有的 100 MB 文件加上这 1 MB,重新写一个 101 MB 的文件覆盖原文件,而不是将新的数据直接写入原文件。每次同步完后文件的 inode 编号都会改变,说明文件已经不是同一个文件了,我是这样才发现的。
所以虽然我的同步量很少,但是服务器上生成的数据文件和日志文件有的能涨到上百 MB 大小,而且每分钟都会有新增数据,因此 Resilio Sync 在同步过程中就会不断重写这些大文件,也就导致了每天上 TB 的恐怖写入量。
受制于 Resilio Sync 的这个机制,在我这使用场景下其实并没有可以根治的办法,可能 Resilio Sync 就不适合用来同步这种一直会变动的文件,但我目前没找到更好的替代方案。
我唯一能做的就是改程序,将生成的数据文件和日志文件按时间或者大小进行拆分,使得需要不断同步的文件的体积保持在一定大小以下,以此来减少每次重写的数据量。这样更改后效果还是很明显的,Resilio Sync 每天的写入量从 1 TB 多降低到了 100 GB 左右,减少了 90%,虽然和实际同步量比还是很高,但已经在我可接受范围内,再配合上 Resilio Sync 的定时暂停同步功能,可以进一步降低写入量,这样应该在这台电脑淘汰前不会因此导致 SSD 提前寿终正寝了。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.