- Wplace 的快照以
.tar.gz格式发布在 murolem/wplace-archives 仓库。 - 每个快照体积巨大(约 10GB)。
- 为了节省存储,我在 bczhc/wplace-tools 实现了相邻快照间的 diff 生成策略,仅需存储一个完整快照 + 后续的连续 diff。
- 运行环境为 VPS,硬盘仅有 20GB 可用空间。
最初将 .tar.gz 解压为文件目录进行 diff,但发现 du -sh 显示的实际磁盘占用极大,远超 .tar.gz 本身大小。
du -sh --apparent-size 则与压缩包大小接近。
原因:
解压后的大量细碎图片文件(PNG)导致文件系统元数据(inode、目录项等)开销巨大,且许多文件系统对大量小文件的存储效率较低(例如默认块大小为 4KB,即使文件很小也会占用一个块)。此外,文件系统可能因日志、备份元数据等进一步放大空间占用。
改为不解压,直接读取 .tar 文件:
- 在 VPS 上使用
curl+gzip -d流式解压为.tar(不压缩)。 - diff 程序先扫描
.tar,建立文件条目映射(文件名 → 偏移量 + 大小)。 - 需要文件时,通过
seek+take直接读取.tar中的对应数据块。
这样做:
-
避免解压到文件系统,空间占用接近
.tar本身。 -
.tar比.tar.gz稍大,但仍在可接受范围。 -
随着 Wplace 快照体积增长,存储仍逐渐吃紧。
为了进一步压缩存储空间,采用 SquashFS:
使用 AgentD/squashfs-tools-ng 工具进行流式创建:
-
创建索引文件
index:file /a.tar 0755 0 0 /dev/stdin -
流式生成命令:
curl -s <快照URL> | gzip -d | gensquashfs -c gzip -F index img.sqfs
-
结果:
- 生成的
img.sqfs中包含一个文件/a.tar,内容即为原始.tar.gz解压后的数据。 - 支持透明压缩。
- 生成的
-
挂载 SquashFS:
mount img.sqfs /mnt -t squashfs -o loop
-
diff 程序直接读取
/mnt/a.tar,通过预建的.tar索引实现快速文件定位。
- 进一步节省空间:SquashFS 对已压缩的 PNG 仍有少量压缩效果,且整体存储效率高于裸
.tar。 - 程序无需改动:diff 程序仍按原方式读取
.tar文件。
- 性能开销:SquashFS 的压缩/解压增加了 diff 创建时间。
- 利用空闲内存
服务器内存尚有富余,可考虑:
- 使用
tmpfs+ LVM 等方式创建一个更大的文件系统空间供 diff 程序使用。
- 使用