nag*_*lzs 36 freebsd performance zfs
我写了一个错误的程序,它在 /tmp 下意外创建了大约 30M 的文件。(这个错误是几周前引入的,它每秒创建几个子目录。)我可以将 /tmp 重命名为 /tmp2,现在我需要删除这些文件。系统是 FreeBSD 10,根文件系统是 zfs。
与此同时,镜像中的一个驱动器出现问题,我已经更换了它。该驱动器有两个 120GB SSD 磁盘。
问题是:更换硬盘驱动器和重新同步整个阵列用了不到一个小时。删除文件 /tmp2 是另一回事。我写了另一个程序来删除文件,它每秒只能删除 30-70 个子目录。删除所有文件需要 2-4 天。
重新同步整个阵列需要一个小时,而从磁盘中删除需要 4 天,这怎么可能?为什么我的表现这么差?70 次删除/秒似乎非常非常糟糕的性能。
我可以手动删除 /tmp2 的 inode,但这不会释放空间,对吗?
这可能是 zfs 或硬盘驱动器的问题还是什么?
eww*_*ite 33
ZFS 中的删除是昂贵的。如果您在文件系统上启用了重复数据删除,则更是如此(因为取消引用重复数据删除的文件很昂贵)。快照也可能使问题复杂化。
您最好删除/tmp目录而不是其中包含的数据。
如果/tmp是 ZFS 文件系统,请将其删除并重新创建。
小智 27
重新同步整个阵列需要一个小时,而从磁盘中删除需要 4 天,这怎么可能?
考虑一栋办公楼。
从所有楼层的所有办公室中移除所有计算机、家具和固定装置需要很长时间,但其他客户可以立即使用这些办公室。
用 RDX 拆除整栋建筑要快得多,但下一个客户很可能会抱怨这个地方有多通风。
这里发生了很多事情。
首先,所有现代磁盘技术都针对批量传输进行了优化。如果您需要移动 100MB 的数据,如果它们位于一个连续的块中,而不是分散在各处,那么它们的速度会快得多。SSD 在这里有很大帮助,但即使它们也更喜欢连续块中的数据。
其次,就磁盘操作而言,重新同步是非常理想的。您从一个磁盘读取大量连续的数据块,对其执行一些快速 CPU 操作,然后将其重写为另一个大的连续数据块到另一个磁盘。如果中途断电,没什么大不了的 - 您只需忽略任何校验和错误的数据并照常进行。
第三,删除文件真的很慢。ZFS 特别糟糕,但实际上所有文件系统删除都很慢。他们必须在磁盘上修改大量不同的数据块并正确计时(即等待),以便在断电时不会损坏文件系统。
重新同步整个阵列需要一个小时,而从磁盘中删除需要 4 天,这怎么可能?
重新同步是磁盘非常快的事情,而删除是磁盘很慢的事情。每兆字节的磁盘,您只需要做一点点重新同步。该空间中可能有一千个文件需要删除。
70 次删除/秒似乎非常非常糟糕的性能
这取决于。我不会对此感到惊讶。您还没有提到您使用的是哪种类型的 SSD。现代英特尔和三星 SSD 非常擅长这种操作(读取-修改-写入),并且性能会更好。较便宜/较旧的 SSD(例如 Corsair)会很慢。每秒 I/O 操作数 (IOPS) 是这里的决定因素。
ZFS是要删除的东西特别慢。通常,它会在后台执行删除操作,因此您看不到延迟。如果你正在做大量的事情,它无法隐藏它并且必须延迟你。
附录:为什么删除很慢?
Ian Howson 很好地回答了为什么它很慢。
如果您并行删除文件,您可能会看到速度提高,因为删除可能使用相同的块,因此可以节省多次重写相同的块。
所以尝试:
find /tmp -print0 | parallel -j100 -0 -n100 rm
Run Code Online (Sandbox Code Playgroud)
看看它的性能是否比每秒 70 次删除更好。
| 归档时间: |
|
| 查看次数: |
14402 次 |
| 最近记录: |