我正在做这两个测试:
#1
dd if=/dev/zero of=./testfile1 bs=512M count=1 conv=fsync
和
#2
dd if=/dev/zero of=./testfile2 bs=1M count=512 conv=fsync
我能说......么:
#1 表示复制(写执行)1大文件大小512M和
#2 的意思是复制许多小文件(512 个文件)每个文件的大小是1M?
答案1
不,你不能这么说。dd
复制的不是文件,而是单个文件的内容,而且这些操作差别很大,性能上根本没有可比性。
答案2
不。
#1 表示将文件复制为一大块
#2 意味着将文件复制为许多小块
我认为对性能可能产生三种影响。
#1 要求操作系统为您释放 512M 内存,以便您可以读入文件。这会减慢速度。 (使用 /dev/zero可能允许操作系统创建实际上不需要分配的需求零页面,但这可能会减慢以后的速度...)如果这导致 dd 进程交换,则会大大减慢速度。
#1 总是告诉操作系统它需要预先分配 512M 的输出磁盘(因为它只执行一次写入)。如果操作系统和文件系统可以进行一次巨大的分配,这可以使事情变得更快。一个好的实现dd
可以在进行写入之前告诉操作系统这一点,假设可以告诉操作系统这一点。假设文件系统能够进行大量分配,这可能会稍微加快#1 的速度。如果您正在写入原始设备,则这不适用。
#2 发出 512 个读取请求和 512 个写入请求。切换进入和退出内核以及验证参数都需要时间。要查看此影响,请进一步缩小缓冲区大小(可能为 4k 或 16k - 但如果太小,则会开始受到其他严重的性能影响)。
答案3
不,你不能这么说。 dd 并不复制文件,而是复制单个文件的内容,而且这些操作差别很大,在性能上根本没有可比性。
您正在创建一个
testfile1
名为 512 MB 的大文件。该文件的数据是从/dev/zero
(提供空字节)生成的dd 命令创建一个名为 dd 的单个文件
testfile2
,并在命令的每次迭代中覆盖它。该bs=1M count=512
选项指定该命令应以 1 MB 的块写入数据,并且重复此过程 512 次。每次执行该命令时,它将生成一组新的空字节(零)并将/dev/zero
其写入文件,从而有效地覆盖其内容。
目的
conv=fsync
是保证数据的完整性和持久性。它保证数据完全写入存储介质,并降低断电或系统崩溃时数据丢失或损坏的风险。同步操作可确保在命令完成执行之前将任何挂起的写入提交到存储设备。
包含
conv=fsync
可确保您正在写入的数据dd
在命令完成之前可靠地存储在磁盘上。当您想要确保数据成功写入并可用于后续操作时,这一点非常重要。