为了测试我们的系统是否能正确检测到空间不足,我们只需要磁盘上的大文件,而我们根本不关心它们的内容。目前,我们dd if=/dev/zero [...]
创建它们需要很长时间,尤其是在向消费级 SATA 磁盘写入数百 GB 的数据时。
有没有办法加快速度?我正在考虑只将文件存在的信息写入文件系统表,而不写入文件的内容,最终得到一个巨大的文件,其中包含之前写入磁盘的所有内容。
答案1
我认为限制在于磁盘的写入带宽无论如何,选择正确的块大小也很重要:
⌂89% [romano:~/tmp] % time dd if=/dev/zero of=test1.tmp count=2M
2097152+0 records in
2097152+0 records out
1073741824 bytes (1,1 GB) copied, 12,6078 s, 85,2 MB/s
dd if=/dev/zero of=test1.tmp count=2M 0,37s user 3,18s system 27% cpu 12,721 total
⌂86% [romano:~/tmp] % time dd bs=1M if=/dev/zero of=test1.tmp count=1k
1024+0 records in
1024+0 records out
1073741824 bytes (1,1 GB) copied, 11,671 s, 92,0 MB/s
dd bs=1M if=/dev/zero of=test1.tmp count=1k 0,00s user 1,10s system 9% cpu 11,783 total
⌂64% [romano:~/tmp] % time dd bs=100M if=/dev/zero of=test1.tmp count=10
10+0 records in
10+0 records out
1048576000 bytes (1,0 GB) copied, 10,3397 s, 101 MB/s
dd bs=100M if=/dev/zero of=test1.tmp count=10 0,00s user 1,16s system 11% cpu 10,457 total
...正如您所见,速度或多或少限制在 100 MB/s 左右,但 CPU 使用率变化很大(默认块大小为dd
512 字节)。
正确的解决方案是fallocate
,如链接重复。
答案2
如果您使用 BTRFS,则可以轻松减少文件系统大小:
btrfs filesystem resize <size> <mount point>
也许您应该在 LXC 容器或具有有限文件系统空间的 chroot 中设置测试实例,这样您就可以在那里测试空间不足和其他情况。
如果你真的想创建一个大文件,我不知道还有什么比 dd 更快的方法,尽管理论上可以将空闲块分配给文件而无需实际写入这些块。虽然这需要一些文件系统级别的黑客攻击——也许谬误确实如此,尽管我从来没有用过它。