我编写了一个有缺陷的程序,它意外地在 /tmp 下创建了大约 30M 个文件。(这个缺陷是几周前引入的,它每秒创建几个子目录。)我可以将 /tmp 重命名为 /tmp2,现在我需要删除这些文件。系统是 FreeBSD 10,根文件系统是 zfs。
同时镜像中的一个驱动器出现问题,我已经更换了它。该驱动器有两个 120GB SSD 磁盘。
问题是:更换硬盘并重新同步整个阵列不到一小时。删除文件 /tmp2 又是另一回事。我编写了另一个程序来删除这些文件,它每秒只能删除 30-70 个子目录。删除所有文件需要 2-4 天。
重新同步整个阵列需要一个小时,而从磁盘删除数据却需要 4 天,这怎么可能呢?为什么我的性能这么差?每秒 70 次删除似乎性能非常非常差。
我可以手动删除 /tmp2 的 inode,但这不会释放空间,对吗?
这可能是 zfs 的问题,还是硬盘的问题,或者其他什么问题?
答案1
ZFS 中的删除操作代价高昂。如果在文件系统上启用了重复数据删除功能,则代价会更大(因为取消引用重复数据删除的文件代价高昂)。快照也会使问题复杂化。
/tmp
删除目录可能比删除其中包含的数据更好。
如果/tmp
是 ZFS 文件系统,请删除它并重新创建。
答案2
重新同步整个阵列需要一个小时,而从磁盘删除却需要四天,这怎么可能呢?
考虑一座办公楼。
将所有楼层所有办公室的所有电脑、家具和固定装置搬走需要长的时间,但办公室可以立即被另一个客户使用。
用 RDX 拆除整栋建筑是全部更快,但下一个客户是相当很可能会抱怨这个地方通风太差。
答案3
Ian Howson 对它为什么慢给出了很好的答案。
如果并行删除文件,您可能会看到速度的提升,因为删除可能使用相同的块,因此可以节省多次重写相同块的时间。
因此尝试一下:
find /tmp -print0 | parallel -j100 -0 -n100 rm
看看它的性能是否比每秒 70 次删除更好。
答案4
重新同步整个阵列需要一个小时,而从磁盘删除却需要四天,这怎么可能呢?
这是可能的,因为这两个操作在文件系统堆栈的不同层上运行。重新同步可以在低级层运行,实际上不需要查看单个文件,而是一次复制大量数据。
为什么我的性能这么差?每秒 70 次删除似乎性能非常非常差。
它确实需要做大量的簿记工作......
我可以手动删除 /tmp2 的 inode,但这不会释放空间,对吗?
我不知道 ZFS 的情况,但如果它可以自动从中恢复,那么它最终可能会在后台执行你已经在做的相同操作。
这可能是 zfs 的问题,还是硬盘的问题,或者其他什么问题?
有zfs scrub
說什麼嗎?