如何生成和更改随机大文件来测试快照性能?

如何生成和更改随机大文件来测试快照性能?

我有一个附加卷,每小时获取一次快照。

为了测试快照性能,我需要运行一个进程,该进程将在快照备份之间生成大量“改动”或文件更改。

与此相关的有两个问题:

  1. 简单明了,如何有效地生成大块文本并将其写入光盘。由于我的知识有限,我唯一能想到的是for生成随机字符的循环,但这可能非常慢。此外,如果替换文件,新的随机性必须使得快照基本上没有可匹配的模式。
  2. 存储这个最有效的方法是什么?例如,1000 个文件中 1 GB,或 10 个文件中 100 GB

由于一张图片相当于 1K 字,所以我在概念上画了这个:

在此输入图像描述

预先感谢您对耦合工具与文件系统的深入了解。

答案1

简单明了,如何有效地生成大块文本并将其写入光盘。由于我的知识有限,我唯一能想到的是 for 循环生成随机字符,但这可能非常慢。

为什么会很慢?除了运行软件循环之外,还存在其他什么生成数据的方法?

是的,for循环几乎正是您想要的。分配一个合理大小的缓冲区(例如,每个 512 kB),用随机文本填充它(或者,实际上,只是字节,它不会对您的存储介质产生影响,无论字节是否表示特定的内容,如“A”),write使用该缓冲区进行调用。移至下一个缓冲区。由于这一切都是非常线性的,因此比这更聪明并没有什么好处——而且你的 CPU 是很多填充 RAM 缓冲区的速度比存储的速度更快。

当您调用时,所发生的情况write是,传入的缓冲区被复制到文件系统缓冲区(在 RAM 中),并write立即返回,因此您可以生成下一个数据块。与此同时,内核将开始将该缓冲区写入后台存储。

这将正常工作,直到文件系统缓冲区已满,并且没有空间可以立即将数据复制到其中。然后,你的write意志会阻塞,直到有空间为止。这是始终保持存储繁忙且应用程序正常运行的巧妙方法!

因此,循环的前几次迭代for非常快,但在某些时候,您会“限制”到存储的平均写入速度。伟大的!

此外,如果替换文件,新的随机性必须使得快照基本上没有可匹配的模式。

使用一个相当快但还不错的 PRNG(伪随机数生成器),除了 libc 之外的任何东西rand(无论从哪个角度看,这都很糟糕;从不使用rand)。我用异色四郎128+以获得相当高的数据生成率。

我曾经在我的 PC 上进行过基准测试,每个生成的伪随机 8 字节值大约需要 0.65 纳秒,因此每个随机位大约需要 0.01 纳秒,或者理论上 100 Gb/s,单核性能,甚至不使用 SIMD 版本克罗四郎128+。这很可能比您的存储接口快几个数量级(除非您忘记告诉我们您在 Google、Cloudflare、LHC 或 NSA 工作)。

存储这个最有效的方法是什么?例如,1000 个文件中 1 GB,或 10 个文件中 100 GB

其实没关系,1000个文件并不算多,而且开销可以忽略不计。不过,开销最小的变体是 1 个 1 TB 的文件。

答案2

这是我开发的有效脚本:

# init
__PWD__=$(pwd)
cd $(dirname $0)
__THIS_FILE__=$0
__THIS_DIR__=$(pwd)
write_loc='/../create-large-files-repository/'
__TARGET_DIR__="$__THIS_DIR__$write_loc"
cd $__PWD__

# output
echo running script: $__THIS_FILE__
echo current directory: $__THIS_DIR__
echo files written to: $__TARGET_DIR__

if [[ ! -d $__TARGET_DIR__ ]]; then mkdir $__TARGET_DIR__; fi

FILE_COUNT=100
FILE_SIZE=1000000

for ((i = 0 ; i < $FILE_COUNT ; i++)); do
  file="file$i.dta"
  file="$__TARGET_DIR__$file"
  echo processing $file..
  dd if=/dev/urandom of=$file bs=2048 count=$FILE_SIZE
done

每 GB 的运行速度约为 30 秒,因此,以每分钟 2 GB 的速度,一小时内可以获取约 0.12 TB 的数据。实际目标是在一小时内生成 >1TB,因此我将在并行运行约 10 个这些时根据系统负载更新此值。 /dev/urandom/没有阻塞,所以这看起来(目前)是高性能的。

相关内容